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 "SubProblem.h"
14#include "SystemBase.h"
15#include "MooseVariableFE.h"
16#include "MooseVariableScalar.h"
17
18#include "libmesh/quadrature.h"
19
22{
24 // This parameter can get renamed in derived class to a more relevant variable name
25 params.addCoupledVar("scalar_variable", "Primary coupled scalar variable");
26 params.addParam<bool>("compute_scalar_residuals", true, "Whether to compute scalar residuals");
27 params.addParam<bool>(
28 "compute_field_residuals", true, "Whether to compute residuals for the field variable.");
29 return params;
30}
31
33 : Kernel(parameters),
34 _use_scalar(isParamValid("scalar_variable") ? true : false),
35 _compute_scalar_residuals(!_use_scalar ? false : getParam<bool>("compute_scalar_residuals")),
36 _compute_field_residuals(getParam<bool>("compute_field_residuals")),
37 _kappa_var_ptr(_use_scalar ? getScalarVar("scalar_variable", 0) : nullptr),
38 _kappa_var(_use_scalar ? _kappa_var_ptr->number() : 0),
39 _k_order(_use_scalar ? _kappa_var_ptr->order() : 0),
40 _kappa(_use_scalar ? (_is_implicit ? _kappa_var_ptr->sln() : _kappa_var_ptr->slnOld()) : _zero)
41{
42}
43
44void
46{
48 Kernel::computeResidual(); // compute and assemble regular variable contributions
49
52}
53
54void
56{
57 std::vector<Real> scalar_residuals(_k_order);
58
59 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
60 {
62 for (_h = 0; _h < _k_order; _h++)
63 scalar_residuals[_h] += _JxW[_qp] * _coord[_qp] * computeScalarQpResidual();
64 }
65
68}
69
70void
79
80void
99
100void
102{
103 if (_use_scalar)
104 {
105 if (jvar_num == variable().number()) // column for this kernel's variable
106 {
108 Kernel::computeJacobian(); // d-_var-residual / d-_var
110 computeScalarOffDiagJacobian(jvar_num); // d-_kappa-residual / d-_var
111 }
112 else if (jvar_num == _kappa_var) // column for this kernel's scalar variable
113 // handle these in computeOffDiagJacobianScalar
114 return;
115 else // some other column for regular variable
116 {
118 Kernel::computeOffDiagJacobian(jvar_num); // d-_var-residual / d-jvar
120 computeScalarOffDiagJacobian(jvar_num); // d-_kappa-residual / d-jvar
121 }
122 }
123 else
124 {
125 if (jvar_num == variable().number()) // column for this kernel's variable
126 {
128 Kernel::computeJacobian(); // d-_var-residual / d-_var
129 }
130 else // some other column for regular variable
131 {
133 Kernel::computeOffDiagJacobian(jvar_num); // d-_var-residual / d-jvar
134 }
135 }
136}
137
138void
140{
141 const auto & jvar = getVariable(jvar_num);
142 if (jvar.fieldType() == Moose::VarFieldType::VAR_FIELD_STANDARD)
143 {
144 // Get dofs and order of this variable; at least one will be _var
145 // const auto & jv0 = static_cast<const MooseVariable &>(jvar);
146 // const auto & loc_phi = jv0.phi();
147 const auto jvar_size = jvar.phiSize();
148 _local_ke.resize(_k_order, jvar_size);
149
150 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
151 {
153 for (_h = 0; _h < _k_order; _h++)
154 for (_j = 0; _j < jvar_size; _j++)
156 }
157 }
158 else if (jvar.fieldType() == Moose::VarFieldType::VAR_FIELD_ARRAY)
159 mooseError("Array variable cannot be coupled into Kernel Scalar currently");
160 else
161 mooseError("Vector variable cannot be coupled into Kernel Scalar currently");
162
164 _local_ke,
166 jvar.dofIndices(),
168}
169
170void
172{
173 // Get dofs and order of this scalar; at least one will be _kappa_var
174 const auto & svar = _sys.getScalarVariable(_tid, svar_num);
175 const unsigned int s_order = svar.order();
176 _local_ke.resize(_test.size(), s_order);
177
178 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
179 {
180 initScalarQpJacobian(svar_num);
181 for (_i = 0; _i < _test.size(); _i++)
182 for (_l = 0; _l < s_order; _l++)
184 }
185
187}
188
189void
191{
193 if (_use_scalar)
194 {
195 if (svar_num == variable().number()) // column for this kernel's variable
196 // this kernel's variable is not a scalar
197 return;
198 else if (svar_num == _kappa_var) // column for this kernel's scalar variable
199 {
200 // Perform assembly using method in Kernel; works for simple cases but not general
201 // Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-_kappa
202 // Perform assembly using local_ke like d-_kappa_var-residual / d-_var
204 computeOffDiagJacobianScalarLocal(svar_num); // d-_var-residual / d-_kappa
206 computeScalarJacobian(); // d-_kappa-residual / d-_kappa
207 }
208 else // some other column for scalar variable
209 {
210 // Perform assembly using method in Kernel; works for simple cases but not general
211 // Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-jvar
212 // Perform assembly using local_ke like d-_kappa_var-residual / d-_var
214 computeOffDiagJacobianScalarLocal(svar_num); // d-_var-residual / d-svar
216 computeScalarOffDiagJacobianScalar(svar_num); // d-_kappa-residual / d-svar
217 }
218 }
220 Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-svar
221}
222
223void
225{
226 // Get dofs and order of this scalar; at least one will be _kappa_var
227 const auto & svar = _sys.getScalarVariable(_tid, svar_num);
228 const unsigned int s_order = svar.order();
229 _local_ke.resize(_k_order, s_order);
230
231 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
232 {
233 initScalarQpJacobian(svar_num);
234 for (_h = 0; _h < _k_order; _h++)
235 for (_l = 0; _l < s_order; _l++)
236 _local_ke(_h, _l) +=
238 }
239
241 _local_ke,
243 svar.dofIndices(),
245}
246
247void
249{
250 Kernel::computeResidualAndJacobian(); // compute and assemble regular variable contributions
251
252 if (_is_implicit)
253 for (const auto * jvar : getCoupledMooseScalarVars())
254 computeOffDiagJacobianScalar(jvar->number());
255}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
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:186
virtual void computeResidualAndJacobian() override
Compute the residual and Jacobian together.
Definition Kernel.C:200
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.
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.
const std::vector< MooseVariableScalar * > & getCoupledMooseScalarVars()
Get the list of coupled scalar variables.
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:146
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