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 "DiffusionLHDGAssemblyHelper.h"
11 : #include "DiffusionLHDGKernel.h"
12 : #include "MooseVariableFE.h"
13 : #include "MooseVariableScalar.h"
14 : #include "SystemBase.h"
15 : #include "MooseMesh.h"
16 : #include "MooseObject.h"
17 : #include "MaterialPropertyInterface.h"
18 : #include "NonlinearThread.h"
19 :
20 : using namespace libMesh;
21 :
22 : registerMooseObject("MooseApp", DiffusionLHDGKernel);
23 :
24 : InputParameters
25 3284 : DiffusionLHDGKernel::validParams()
26 : {
27 3284 : auto params = HDGKernel::validParams();
28 3284 : params += DiffusionLHDGAssemblyHelper::validParams();
29 19704 : params.renameParam("variable", "u", "The diffusing specie concentration");
30 13136 : params.addParam<MooseFunctorName>("source", 0, "Source for the diffusing species");
31 3284 : params.addClassDescription("Adds the element and interior face weak forms for a hybridized local "
32 : "discontinuous Galerkin discretization of a diffusion term.");
33 3284 : return params;
34 0 : }
35 :
36 112 : DiffusionLHDGKernel::DiffusionLHDGKernel(const InputParameters & params)
37 : : HDGKernel(params),
38 112 : DiffusionLHDGAssemblyHelper(this, this, this, this, _fe_problem, _sys, _tid),
39 224 : _source(getFunctor<Real>("source"))
40 : {
41 112 : }
42 :
43 : void
44 112 : DiffusionLHDGKernel::initialSetup()
45 : {
46 : // This check must occur after FEProblemBase::init()
47 112 : checkCoupling();
48 112 : }
49 :
50 : void
51 156218 : DiffusionLHDGKernel::computeResidual()
52 : {
53 156218 : _vector_re.resize(_qu_dof_indices.size());
54 156218 : _scalar_re.resize(_u_dof_indices.size());
55 :
56 : // qu and u
57 156218 : vectorVolumeResidual(_qu_sol, _u_sol, _JxW, *_qrule, _vector_re);
58 156218 : scalarVolumeResidual(_qu_sol, _source, _JxW, *_qrule, _current_elem, _q_point, _scalar_re);
59 :
60 156218 : addResiduals(_assembly, _vector_re, _qu_dof_indices, _grad_u_var.scalingFactor());
61 156218 : addResiduals(_assembly, _scalar_re, _u_dof_indices, _u_var.scalingFactor());
62 156218 : }
63 :
64 : void
65 550306 : DiffusionLHDGKernel::computeResidualOnSide()
66 : {
67 550306 : _vector_re.resize(_qu_dof_indices.size());
68 550306 : _scalar_re.resize(_u_dof_indices.size());
69 550306 : _lm_re.resize(_lm_u_dof_indices.size());
70 :
71 : // qu, u, lm_u
72 550306 : vectorFaceResidual(_lm_u_sol, _JxW_face, *_qrule_face, _normals, _vector_re);
73 550306 : scalarFaceResidual(_qu_sol, _u_sol, _lm_u_sol, _JxW_face, *_qrule_face, _normals, _scalar_re);
74 550306 : lmFaceResidual(_qu_sol, _u_sol, _lm_u_sol, _JxW_face, *_qrule_face, _normals, _lm_re);
75 :
76 550306 : addResiduals(_assembly, _vector_re, _qu_dof_indices, _grad_u_var.scalingFactor());
77 550306 : addResiduals(_assembly, _scalar_re, _u_dof_indices, _u_var.scalingFactor());
78 550306 : addResiduals(_assembly, _lm_re, _lm_u_dof_indices, _u_face_var.scalingFactor());
79 550306 : }
80 :
81 : void
82 102740 : DiffusionLHDGKernel::computeJacobian()
83 : {
84 102740 : _vector_vector_jac.resize(_qu_dof_indices.size(), _qu_dof_indices.size());
85 102740 : _vector_scalar_jac.resize(_qu_dof_indices.size(), _u_dof_indices.size());
86 102740 : _scalar_vector_jac.resize(_u_dof_indices.size(), _qu_dof_indices.size());
87 :
88 : // qu and u
89 102740 : vectorVolumeJacobian(_JxW, *_qrule, _vector_vector_jac, _vector_scalar_jac);
90 102740 : scalarVolumeJacobian(_JxW, *_qrule, _scalar_vector_jac);
91 :
92 205480 : addJacobian(
93 102740 : _assembly, _vector_vector_jac, _qu_dof_indices, _qu_dof_indices, _grad_u_var.scalingFactor());
94 205480 : addJacobian(
95 102740 : _assembly, _vector_scalar_jac, _qu_dof_indices, _u_dof_indices, _grad_u_var.scalingFactor());
96 205480 : addJacobian(
97 102740 : _assembly, _scalar_vector_jac, _u_dof_indices, _qu_dof_indices, _u_var.scalingFactor());
98 102740 : }
99 :
100 : void
101 363364 : DiffusionLHDGKernel::computeJacobianOnSide()
102 : {
103 363364 : _scalar_vector_jac.resize(_u_dof_indices.size(), _qu_dof_indices.size());
104 363364 : _scalar_scalar_jac.resize(_u_dof_indices.size(), _u_dof_indices.size());
105 363364 : _scalar_lm_jac.resize(_u_dof_indices.size(), _lm_u_dof_indices.size());
106 363364 : _lm_scalar_jac.resize(_lm_u_dof_indices.size(), _u_dof_indices.size());
107 363364 : _lm_lm_jac.resize(_lm_u_dof_indices.size(), _lm_u_dof_indices.size());
108 363364 : _vector_lm_jac.resize(_qu_dof_indices.size(), _lm_u_dof_indices.size());
109 363364 : _lm_vector_jac.resize(_lm_u_dof_indices.size(), _qu_dof_indices.size());
110 :
111 : // qu, u, lm_u
112 363364 : vectorFaceJacobian(_JxW_face, *_qrule_face, _normals, _vector_lm_jac);
113 363364 : scalarFaceJacobian(
114 363364 : _JxW_face, *_qrule_face, _normals, _scalar_vector_jac, _scalar_scalar_jac, _scalar_lm_jac);
115 363364 : lmFaceJacobian(_JxW_face, *_qrule_face, _normals, _lm_vector_jac, _lm_scalar_jac, _lm_lm_jac);
116 :
117 726728 : addJacobian(
118 363364 : _assembly, _scalar_vector_jac, _u_dof_indices, _qu_dof_indices, _u_var.scalingFactor());
119 726728 : addJacobian(
120 363364 : _assembly, _scalar_scalar_jac, _u_dof_indices, _u_dof_indices, _u_var.scalingFactor());
121 363364 : addJacobian(_assembly, _scalar_lm_jac, _u_dof_indices, _lm_u_dof_indices, _u_var.scalingFactor());
122 726728 : addJacobian(
123 363364 : _assembly, _lm_scalar_jac, _lm_u_dof_indices, _u_dof_indices, _u_face_var.scalingFactor());
124 726728 : addJacobian(
125 363364 : _assembly, _lm_lm_jac, _lm_u_dof_indices, _lm_u_dof_indices, _u_face_var.scalingFactor());
126 726728 : addJacobian(
127 363364 : _assembly, _vector_lm_jac, _qu_dof_indices, _lm_u_dof_indices, _grad_u_var.scalingFactor());
128 726728 : addJacobian(
129 363364 : _assembly, _lm_vector_jac, _lm_u_dof_indices, _qu_dof_indices, _u_face_var.scalingFactor());
130 363364 : }
131 :
132 : void
133 213 : DiffusionLHDGKernel::jacobianSetup()
134 : {
135 213 : _cached_elem = nullptr;
136 213 : }
137 :
138 : void
139 308220 : DiffusionLHDGKernel::computeOffDiagJacobian(const unsigned int)
140 : {
141 308220 : if (_cached_elem != _current_elem)
142 : {
143 102740 : computeJacobian();
144 102740 : _cached_elem = _current_elem;
145 : }
146 308220 : }
147 :
148 : std::set<std::string>
149 111 : DiffusionLHDGKernel::additionalROVariables()
150 : {
151 444 : return {_grad_u_var.name(), _u_face_var.name()};
152 111 : }
|