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 116413 : DGKernel::validParams()
28 : {
29 116413 : InputParameters params = DGKernelBase::validParams();
30 116413 : return params;
31 : }
32 :
33 1189 : DGKernel::DGKernel(const InputParameters & parameters)
34 : : DGKernelBase(parameters),
35 : NeighborMooseVariableInterface(
36 : this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_STANDARD),
37 2378 : _var(*mooseVariable()),
38 1189 : _u(_is_implicit ? _var.sln() : _var.slnOld()),
39 1189 : _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
40 :
41 1189 : _phi(_assembly.phiFace(_var)),
42 1189 : _grad_phi(_assembly.gradPhiFace(_var)),
43 :
44 1189 : _test(_var.phiFace()),
45 1189 : _grad_test(_var.gradPhiFace()),
46 :
47 1189 : _phi_neighbor(_assembly.phiFaceNeighbor(_var)),
48 1189 : _grad_phi_neighbor(_assembly.gradPhiFaceNeighbor(_var)),
49 :
50 1189 : _test_neighbor(_var.phiFaceNeighbor()),
51 1189 : _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
52 :
53 1189 : _u_neighbor(_is_implicit ? _var.slnNeighbor() : _var.slnOldNeighbor()),
54 2378 : _grad_u_neighbor(_is_implicit ? _var.gradSlnNeighbor() : _var.gradSlnOldNeighbor())
55 : {
56 1189 : addMooseVariableDependency(mooseVariable());
57 :
58 1189 : _save_in.resize(_save_in_strings.size());
59 1189 : _diag_save_in.resize(_diag_save_in_strings.size());
60 :
61 1231 : for (unsigned int i = 0; i < _save_in_strings.size(); i++)
62 : {
63 42 : MooseVariableFEBase * var = &_subproblem.getVariable(_tid,
64 42 : _save_in_strings[i],
65 : Moose::VarKindType::VAR_AUXILIARY,
66 : Moose::VarFieldType::VAR_FIELD_STANDARD);
67 :
68 42 : 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 42 : 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 42 : _save_in[i] = var;
79 42 : var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
80 42 : addMooseVariableDependency(var);
81 : }
82 :
83 1189 : _has_save_in = _save_in.size() > 0;
84 :
85 1217 : for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
86 : {
87 28 : MooseVariableFEBase * var = &_subproblem.getVariable(_tid,
88 28 : _diag_save_in_strings[i],
89 : Moose::VarKindType::VAR_AUXILIARY,
90 : Moose::VarFieldType::VAR_FIELD_STANDARD);
91 :
92 28 : 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 28 : 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 28 : _diag_save_in[i] = var;
103 28 : var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
104 28 : addMooseVariableDependency(var);
105 : }
106 :
107 1189 : _has_diag_save_in = _diag_save_in.size() > 0;
108 1189 : }
109 :
110 : void
111 3859426 : DGKernel::computeElemNeighResidual(Moose::DGResidualType type)
112 : {
113 : bool is_elem;
114 3859426 : if (type == Moose::Element)
115 1929713 : is_elem = true;
116 : else
117 1929713 : is_elem = false;
118 :
119 3859426 : const VariableTestValue & test_space = is_elem ? _test : _test_neighbor;
120 :
121 3859426 : if (is_elem)
122 1929713 : prepareVectorTag(_assembly, _var.number());
123 : else
124 1929713 : prepareVectorTagNeighbor(_assembly, _var.number());
125 :
126 16678736 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
127 : {
128 12819310 : precalculateQpResidual(type);
129 171305358 : for (_i = 0; _i < test_space.size(); _i++)
130 158486048 : _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual(type);
131 : }
132 :
133 3859426 : accumulateTaggedLocalResidual();
134 :
135 3859426 : if (_has_save_in)
136 : {
137 10368 : Threads::spin_mutex::scoped_lock lock(_resid_vars_mutex);
138 20736 : for (const auto & var : _save_in)
139 : {
140 : const std::vector<dof_id_type> & dof_indices =
141 10368 : is_elem ? var->dofIndices() : var->dofIndicesNeighbor();
142 10368 : var->sys().solution().add_vector(_local_re, dof_indices);
143 : }
144 10368 : }
145 3859426 : }
146 :
147 : void
148 487940 : DGKernel::computeElemNeighJacobian(Moose::DGJacobianType type)
149 : {
150 487940 : const VariableTestValue & test_space =
151 487940 : (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
152 853895 : const VariableTestValue & loc_phi =
153 365955 : (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
154 :
155 487940 : if (type == Moose::ElementElement)
156 121985 : prepareMatrixTag(_assembly, _var.number(), _var.number());
157 : else
158 365955 : prepareMatrixTagNeighbor(_assembly, _var.number(), _var.number(), type);
159 :
160 1988612 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
161 : {
162 1500672 : precalculateQpJacobian(type);
163 18127344 : for (_i = 0; _i < test_space.size(); _i++)
164 260016248 : for (_j = 0; _j < loc_phi.size(); _j++)
165 243389576 : _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(type);
166 : }
167 :
168 487940 : accumulateTaggedLocalMatrix();
169 :
170 487940 : if (_has_diag_save_in && (type == Moose::ElementElement || type == Moose::NeighborNeighbor))
171 : {
172 1728 : unsigned int rows = _local_ke.m();
173 1728 : DenseVector<Number> diag(rows);
174 8640 : for (unsigned int i = 0; i < rows; i++)
175 6912 : diag(i) = _local_ke(i, i);
176 :
177 1728 : Threads::spin_mutex::scoped_lock lock(_jacoby_vars_mutex);
178 3456 : for (const auto & var : _diag_save_in)
179 : {
180 1728 : if (type == Moose::ElementElement)
181 864 : var->sys().solution().add_vector(diag, var->dofIndices());
182 : else
183 864 : var->sys().solution().add_vector(diag, var->dofIndicesNeighbor());
184 : }
185 1728 : }
186 487940 : }
187 :
188 : void
189 13408 : DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,
190 : const MooseVariableFEBase & jvar)
191 : {
192 13408 : const VariableTestValue & test_space =
193 13408 : (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
194 23464 : const VariableTestValue & loc_phi =
195 10056 : (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
196 :
197 13408 : if (type == Moose::ElementElement)
198 3352 : prepareMatrixTag(_assembly, _var.number(), jvar.number());
199 : else
200 10056 : prepareMatrixTagNeighbor(_assembly, _var.number(), jvar.number(), type);
201 :
202 13408 : if (_local_ke.n() == 0 || _local_ke.m() == 0)
203 7312 : return;
204 :
205 20928 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
206 : {
207 14832 : precalculateQpOffDiagJacobian(type, jvar);
208 108600 : for (_i = 0; _i < test_space.size(); _i++)
209 754536 : for (_j = 0; _j < loc_phi.size(); _j++)
210 660768 : _local_ke(_i, _j) +=
211 660768 : _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar.number());
212 : }
213 :
214 6096 : accumulateTaggedLocalMatrix();
215 : }
216 :
217 : Real
218 110592 : DGKernel::computeQpOffDiagJacobian(Moose::DGJacobianType /*type*/, unsigned int /*jvar*/)
219 : {
220 110592 : return 0.;
221 : }
|