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 116275 : DGKernel::validParams()
28 : {
29 116275 : InputParameters params = DGKernelBase::validParams();
30 116275 : return params;
31 : }
32 :
33 1120 : DGKernel::DGKernel(const InputParameters & parameters)
34 : : DGKernelBase(parameters),
35 : NeighborMooseVariableInterface(
36 : this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_STANDARD),
37 2240 : _var(*mooseVariable()),
38 1120 : _u(_is_implicit ? _var.sln() : _var.slnOld()),
39 1120 : _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
40 :
41 1120 : _phi(_assembly.phiFace(_var)),
42 1120 : _grad_phi(_assembly.gradPhiFace(_var)),
43 :
44 1120 : _test(_var.phiFace()),
45 1120 : _grad_test(_var.gradPhiFace()),
46 :
47 1120 : _phi_neighbor(_assembly.phiFaceNeighbor(_var)),
48 1120 : _grad_phi_neighbor(_assembly.gradPhiFaceNeighbor(_var)),
49 :
50 1120 : _test_neighbor(_var.phiFaceNeighbor()),
51 1120 : _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
52 :
53 1120 : _u_neighbor(_is_implicit ? _var.slnNeighbor() : _var.slnOldNeighbor()),
54 2240 : _grad_u_neighbor(_is_implicit ? _var.gradSlnNeighbor() : _var.gradSlnOldNeighbor())
55 : {
56 1120 : addMooseVariableDependency(mooseVariable());
57 :
58 1120 : _save_in.resize(_save_in_strings.size());
59 1120 : _diag_save_in.resize(_diag_save_in_strings.size());
60 :
61 1159 : 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 1120 : _has_save_in = _save_in.size() > 0;
84 :
85 1146 : 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 1120 : _has_diag_save_in = _diag_save_in.size() > 0;
108 1120 : }
109 :
110 : void
111 3709712 : DGKernel::computeElemNeighResidual(Moose::DGResidualType type)
112 : {
113 : bool is_elem;
114 3709712 : if (type == Moose::Element)
115 1854856 : is_elem = true;
116 : else
117 1854856 : is_elem = false;
118 :
119 3709712 : const VariableTestValue & test_space = is_elem ? _test : _test_neighbor;
120 :
121 3709712 : if (is_elem)
122 1854856 : prepareVectorTag(_assembly, _var.number());
123 : else
124 1854856 : prepareVectorTagNeighbor(_assembly, _var.number());
125 :
126 16180656 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
127 : {
128 12470944 : precalculateQpResidual(type);
129 169659576 : for (_i = 0; _i < test_space.size(); _i++)
130 157188632 : _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual(type);
131 : }
132 :
133 3709712 : accumulateTaggedLocalResidual();
134 :
135 3709712 : if (_has_save_in)
136 : {
137 9216 : Threads::spin_mutex::scoped_lock lock(_resid_vars_mutex);
138 18432 : for (const auto & var : _save_in)
139 : {
140 : const std::vector<dof_id_type> & dof_indices =
141 9216 : is_elem ? var->dofIndices() : var->dofIndicesNeighbor();
142 9216 : var->sys().solution().add_vector(_local_re, dof_indices);
143 : }
144 9216 : }
145 3709712 : }
146 :
147 : void
148 457584 : DGKernel::computeElemNeighJacobian(Moose::DGJacobianType type)
149 : {
150 457584 : const VariableTestValue & test_space =
151 457584 : (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
152 800772 : const VariableTestValue & loc_phi =
153 343188 : (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
154 :
155 457584 : if (type == Moose::ElementElement)
156 114396 : prepareMatrixTag(_assembly, _var.number(), _var.number());
157 : else
158 343188 : prepareMatrixTagNeighbor(_assembly, _var.number(), _var.number(), type);
159 :
160 1886448 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
161 : {
162 1428864 : precalculateQpJacobian(type);
163 17717824 : for (_i = 0; _i < test_space.size(); _i++)
164 256766416 : for (_j = 0; _j < loc_phi.size(); _j++)
165 240477456 : _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(type);
166 : }
167 :
168 457584 : accumulateTaggedLocalMatrix();
169 :
170 457584 : if (_has_diag_save_in && (type == Moose::ElementElement || type == Moose::NeighborNeighbor))
171 : {
172 1536 : unsigned int rows = _local_ke.m();
173 1536 : DenseVector<Number> diag(rows);
174 7680 : for (unsigned int i = 0; i < rows; i++)
175 6144 : diag(i) = _local_ke(i, i);
176 :
177 1536 : Threads::spin_mutex::scoped_lock lock(_jacoby_vars_mutex);
178 3072 : for (const auto & var : _diag_save_in)
179 : {
180 1536 : if (type == Moose::ElementElement)
181 768 : var->sys().solution().add_vector(diag, var->dofIndices());
182 : else
183 768 : var->sys().solution().add_vector(diag, var->dofIndicesNeighbor());
184 : }
185 1536 : }
186 457584 : }
187 :
188 : void
189 12008 : DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,
190 : const MooseVariableFEBase & jvar)
191 : {
192 12008 : const VariableTestValue & test_space =
193 12008 : (type == Moose::ElementElement || type == Moose::ElementNeighbor) ? _test : _test_neighbor;
194 21014 : const VariableTestValue & loc_phi =
195 9006 : (type == Moose::ElementElement || type == Moose::NeighborElement) ? _phi : _phi_neighbor;
196 :
197 12008 : if (type == Moose::ElementElement)
198 3002 : prepareMatrixTag(_assembly, _var.number(), jvar.number());
199 : else
200 9006 : prepareMatrixTagNeighbor(_assembly, _var.number(), jvar.number(), type);
201 :
202 12008 : if (_local_ke.n() == 0 || _local_ke.m() == 0)
203 6512 : return;
204 :
205 19056 : for (_qp = 0; _qp < _qrule->n_points(); _qp++)
206 : {
207 13560 : precalculateQpOffDiagJacobian(type, jvar);
208 101208 : for (_i = 0; _i < test_space.size(); _i++)
209 719808 : for (_j = 0; _j < loc_phi.size(); _j++)
210 632160 : _local_ke(_i, _j) +=
211 632160 : _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar.number());
212 : }
213 :
214 5496 : accumulateTaggedLocalMatrix();
215 : }
216 :
217 : Real
218 98304 : DGKernel::computeQpOffDiagJacobian(Moose::DGJacobianType /*type*/, unsigned int /*jvar*/)
219 : {
220 98304 : return 0.;
221 : }
|