https://mooseframework.inl.gov
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 
44 void
46 {
48  Kernel::computeResidual(); // compute and assemble regular variable contributions
49 
52 }
53 
54 void
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 
70 void
72 {
75 
78 }
79 
80 void
82 {
84 
85  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
86  {
88  for (_h = 0; _h < _k_order; _h++)
89  for (_l = 0; _l < _k_order; _l++)
91  }
92 
94  _local_ke,
98 }
99 
100 void
101 KernelScalarBase::computeOffDiagJacobian(const unsigned int jvar_num)
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 
138 void
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 
170 void
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 
186  addJacobian(_assembly, _local_ke, _var.dofIndices(), svar.dofIndices(), _var.scalingFactor());
187 }
188 
189 void
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  }
219  else if (_compute_field_residuals)
220  Kernel::computeOffDiagJacobianScalar(svar_num); // d-_var-residual / d-svar
221 }
222 
223 void
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 }
virtual void computeScalarResidual()
Method for computing the scalar part of residual.
virtual void computeResidual() override
Compute this Kernel&#39;s contribution to the residual.
Definition: Kernel.C:92
static InputParameters validParams()
Definition: Kernel.C:24
virtual void computeOffDiagJacobianScalarLocal(const unsigned int svar_num)
Method for computing an off-diagonal jacobian component d-_var-residual / d-scalar Revised version of...
MooseVariable & _var
This is a regular kernel so we cast to a regular MooseVariable.
Definition: Kernel.h:72
const MooseArray< Real > & _JxW
The current quadrature point weight value.
Definition: KernelBase.h:52
unsigned int _h
Used internally to iterate over each scalar component.
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.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const bool _compute_scalar_residuals
Whether to compute scalar contributions for this instance.
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.
THREAD_ID _tid
The thread ID for this kernel.
virtual void precalculateOffDiagJacobianScalar(unsigned int)
Precalculate method that is executed prior to scalar coupled variable loop within computeOffDiagJacob...
DenseMatrix< Number > _local_ke
Holds local Jacobian entries as they are accumulated by this Kernel.
const MooseVariableFieldBase & getVariable(unsigned int jvar_num) const
Retrieve the variable object from our system associated with jvar_num.
virtual void computeOffDiagJacobian(unsigned int jvar_num) override
Computes d-_var-residual / d-jvar as well as d-_kappa-residual / d-jvar.
virtual void computeScalarOffDiagJacobianScalar(const unsigned int svar_num)
Method for computing an off-diagonal jacobian component d-_kappa-residual / d-scalar.
SystemBase & _sys
Reference to the EquationSystem object.
virtual void computeScalarJacobian()
Method for computing the scalar variable part of Jacobian.
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.
const VariableTestValue & _test
the current test function
Definition: Kernel.h:75
const std::vector< dof_id_type > & dofIndices() const final
Get local DoF indices.
virtual Real computeScalarQpJacobian()
Method for computing the scalar variable part of Jacobian at quadrature points.
virtual void computeJacobian() override
Compute this Kernel&#39;s contribution to the diagonal Jacobian entries.
const QBase *const & _qrule
active quadrature rule
Definition: KernelBase.h:49
virtual const std::vector< dof_id_type > & dofIndices() const
Get local DoF indices.
unsigned int _i
current index for the test function
Definition: KernelBase.h:58
virtual Real computeScalarQpOffDiagJacobian(const unsigned int)
Method for computing an off-diagonal jacobian component at quadrature points.
KernelScalarBase(const InputParameters &parameters)
const MooseArray< Real > & _coord
The scaling factor to convert from cartesian to another coordinate system (e.g rz, spherical, etc.)
Definition: KernelBase.h:55
Assembly & _assembly
Reference to this Kernel&#39;s assembly object.
void addCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
virtual void initScalarQpJacobian(const unsigned int)
Put necessary evaluations depending on qp but independent of test and shape functions here...
virtual void computeJacobian() override
Compute this Kernel&#39;s contribution to the diagonal Jacobian entries.
Definition: Kernel.C:115
libMesh::Order order() const
Get the order of this variable Note: Order enum can be implicitly converted to unsigned int...
virtual void computeScalarOffDiagJacobian(const unsigned int jvar_num)
Method for computing an off-diagonal jacobian component d-_kappa-residual / d-jvar.
unsigned int _j
current index for the shape function
Definition: KernelBase.h:61
virtual Real computeScalarQpOffDiagJacobianScalar(const unsigned int)
Method for computing an off-diagonal jacobian component at quadrature points.
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
virtual Real computeScalarQpResidual()
Method for computing the scalar part of residual at quadrature points.
virtual const MooseVariable & variable() const override
Returns the variable that this object operates on.
Definition: Kernel.h:40
void resize(const unsigned int new_m, const unsigned int new_n)
static InputParameters validParams()
Definition: Kernel.h:15
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
virtual void initScalarQpResidual()
Put necessary evaluations depending on qp but independent of test functions here. ...
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...
const MooseVariableScalar *const _kappa_var_ptr
(Pointer to) Scalar variable this kernel operates on
virtual Real computeQpOffDiagJacobianScalar(unsigned int)
For coupling scalar variables.
Definition: Kernel.h:61
const unsigned int _kappa_var
The unknown scalar variable ID.
virtual void computeOffDiagJacobian(unsigned int jvar) override
Computes d-residual / d-jvar... storing the result in Ke.
Definition: Kernel.C:137
const bool _compute_field_residuals
Whether to compute field contributions for this instance.
virtual void computeResidual() override
Compute this Kernel&#39;s contribution to the residual.
virtual void computeOffDiagJacobianScalar(unsigned int jvar) override
Computes jacobian block with respect to a scalar variable.
Definition: Kernel.C:184
const bool _use_scalar
Whether a scalar variable is declared for this kernel.
void scalingFactor(const std::vector< Real > &factor)
Set the scaling factor for this variable.
unsigned int _qp
The current quadrature point index.
Definition: KernelBase.h:43
virtual void initScalarQpOffDiagJacobian(const MooseVariableFEBase &)
Put necessary evaluations depending on qp but independent of test and shape functions here for off-di...