Line data Source code
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 "DGKernel.h"
11 : #include "Assembly.h"
12 : #include "MooseVariable.h"
13 : #include "Problem.h"
14 : #include "SubProblem.h"
15 : #include "SystemBase.h"
16 : #include "MaterialData.h"
17 : #include "ParallelUniqueId.h"
18 :
19 : #include "libmesh/dof_map.h"
20 : #include "libmesh/dense_vector.h"
21 : #include "libmesh/numeric_vector.h"
22 : #include "libmesh/dense_subvector.h"
23 : #include "libmesh/libmesh_common.h"
24 : #include "libmesh/quadrature.h"
25 :
26 : InputParameters
27 26535 : DGKernel::validParams()
28 : {
29 26535 : InputParameters params = DGKernelBase::validParams();
30 26535 : return params;
31 : }
32 :
33 1071 : DGKernel::DGKernel(const InputParameters & parameters)
34 : : DGKernelBase(parameters),
35 : NeighborMooseVariableInterface(
36 : this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_STANDARD),
37 2142 : _var(*mooseVariable()),
38 1071 : _u(_is_implicit ? _var.sln() : _var.slnOld()),
39 1071 : _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
40 :
41 1071 : _phi(_assembly.phiFace(_var)),
42 1071 : _grad_phi(_assembly.gradPhiFace(_var)),
43 :
44 1071 : _test(_var.phiFace()),
45 1071 : _grad_test(_var.gradPhiFace()),
46 :
47 1071 : _phi_neighbor(_assembly.phiFaceNeighbor(_var)),
48 1071 : _grad_phi_neighbor(_assembly.gradPhiFaceNeighbor(_var)),
49 :
50 1071 : _test_neighbor(_var.phiFaceNeighbor()),
51 1071 : _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
52 :
53 1071 : _u_neighbor(_is_implicit ? _var.slnNeighbor() : _var.slnOldNeighbor()),
54 2142 : _grad_u_neighbor(_is_implicit ? _var.gradSlnNeighbor() : _var.gradSlnOldNeighbor())
55 : {
56 1071 : addMooseVariableDependency(mooseVariable());
57 :
58 1071 : _save_in.resize(_save_in_strings.size());
59 1071 : _diag_save_in.resize(_diag_save_in_strings.size());
60 :
61 1110 : for (unsigned int i = 0; i < _save_in_strings.size(); i++)
62 : {
63 39 : MooseVariableFEBase * var = &_subproblem.getVariable(_tid,
64 39 : _save_in_strings[i],
65 : Moose::VarKindType::VAR_AUXILIARY,
66 : Moose::VarFieldType::VAR_FIELD_STANDARD);
67 :
68 39 : if (_sys.hasVariable(_save_in_strings[i]))
69 0 : mooseError("Trying to use solution variable " + _save_in_strings[i] +
70 0 : " as a save_in variable in " + name());
71 :
72 39 : if (var->feType() != _var.feType())
73 0 : paramError(
74 : "save_in",
75 : "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
76 0 : moose::internal::incompatVarMsg(*var, _var));
77 :
78 39 : _save_in[i] = var;
79 39 : var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
80 39 : addMooseVariableDependency(var);
81 : }
82 :
83 1071 : _has_save_in = _save_in.size() > 0;
84 :
85 1097 : for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
86 : {
87 26 : MooseVariableFEBase * var = &_subproblem.getVariable(_tid,
88 26 : _diag_save_in_strings[i],
89 : Moose::VarKindType::VAR_AUXILIARY,
90 : Moose::VarFieldType::VAR_FIELD_STANDARD);
91 :
92 26 : if (_sys.hasVariable(_diag_save_in_strings[i]))
93 0 : mooseError("Trying to use solution variable " + _diag_save_in_strings[i] +
94 0 : " as a diag_save_in variable in " + name());
95 :
96 26 : if (var->feType() != _var.feType())
97 0 : paramError(
98 : "diag_save_in",
99 : "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
100 0 : moose::internal::incompatVarMsg(*var, _var));
101 :
102 26 : _diag_save_in[i] = var;
103 26 : var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
104 26 : addMooseVariableDependency(var);
105 : }
106 :
107 1071 : _has_diag_save_in = _diag_save_in.size() > 0;
108 1071 : }
109 :
110 : void
111 3170034 : DGKernel::computeElemNeighResidual(Moose::DGResidualType type)
112 : {
113 : bool is_elem;
114 3170034 : if (type == Moose::Element)
115 1585017 : is_elem = true;
116 : else
117 1585017 : is_elem = false;
118 :
119 3170034 : const VariableTestValue & test_space = is_elem ? _test : _test_neighbor;
120 :
121 3170034 : if (is_elem)
122 1585017 : prepareVectorTag(_assembly, _var.number());
123 : else
124 1585017 : prepareVectorTagNeighbor(_assembly, _var.number());
125 :
126 3170034 : precalculateResidual();
127 13490196 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
128 : {
129 10320162 : precalculateQpResidual(type);
130 133464148 : for (_i = 0; _i < test_space.size(); _i++)
131 123143986 : _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual(type);
132 : }
133 :
134 3170034 : accumulateTaggedLocalResidual();
135 :
136 3170034 : if (_has_save_in)
137 18432 : for (const auto & var : _save_in)
138 : {
139 : const std::vector<dof_id_type> & dof_indices =
140 9216 : is_elem ? var->dofIndices() : var->dofIndicesNeighbor();
141 9216 : var->sys().solution().add_vector(_local_re, dof_indices);
142 : }
143 3170034 : }
144 :
145 : void
146 403576 : DGKernel::computeElemNeighJacobian(Moose::DGJacobianType type)
147 : {
148 403576 : const VariableTestValue & test_space =
149 403576 : (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
150 706258 : const VariableTestValue & loc_phi =
151 302682 : (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
152 :
153 403576 : if (type == Moose::ElementElement)
154 100894 : prepareMatrixTag(_assembly, _var.number(), _var.number());
155 : else
156 302682 : prepareMatrixTagNeighbor(_assembly, _var.number(), _var.number(), type);
157 :
158 403576 : precalculateJacobian();
159 1617696 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
160 : {
161 1214120 : precalculateQpJacobian(type);
162 14085752 : for (_i = 0; _i < test_space.size(); _i++)
163 198724048 : for (_j = 0; _j < loc_phi.size(); _j++)
164 185852416 : _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(type);
165 : }
166 :
167 403576 : accumulateTaggedLocalMatrix();
168 :
169 403576 : if (_has_diag_save_in && (type == Moose::ElementElement || type == Moose::NeighborNeighbor))
170 : {
171 1536 : unsigned int rows = _local_ke.m();
172 1536 : DenseVector<Number> diag(rows);
173 7680 : for (unsigned int i = 0; i < rows; i++)
174 6144 : diag(i) = _local_ke(i, i);
175 :
176 3072 : for (const auto & var : _diag_save_in)
177 : {
178 1536 : if (type == Moose::ElementElement)
179 768 : var->sys().solution().add_vector(diag, var->dofIndices());
180 : else
181 768 : var->sys().solution().add_vector(diag, var->dofIndicesNeighbor());
182 : }
183 1536 : }
184 403576 : }
185 :
186 : void
187 11832 : DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,
188 : const MooseVariableFEBase & jvar)
189 : {
190 11832 : const VariableTestValue & test_space =
191 11832 : (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
192 20706 : const VariableTestValue & loc_phi =
193 8874 : (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
194 :
195 11832 : if (type == Moose::ElementElement)
196 2958 : prepareMatrixTag(_assembly, _var.number(), jvar.number());
197 : else
198 8874 : prepareMatrixTagNeighbor(_assembly, _var.number(), jvar.number(), type);
199 :
200 11832 : if (_local_ke.n() == 0 || _local_ke.m() == 0)
201 6448 : return;
202 :
203 5384 : precalculateJacobian();
204 18448 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
205 : {
206 13064 : precalculateQpOffDiagJacobian(type, jvar);
207 95160 : for (_i = 0; _i < test_space.size(); _i++)
208 656592 : for (_j = 0; _j < loc_phi.size(); _j++)
209 574496 : _local_ke(_i, _j) +=
210 574496 : _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar.number());
211 : }
212 :
213 5384 : accumulateTaggedLocalMatrix();
214 : }
215 :
216 : Real
217 98304 : DGKernel::computeQpOffDiagJacobian(Moose::DGJacobianType /*type*/, unsigned int /*jvar*/)
218 : {
219 98304 : return 0.;
220 : }
|