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 "DiffusionLHDGPrescribedGradientBC.h"
12 :
13 : registerMooseObject("MooseApp", DiffusionLHDGPrescribedGradientBC);
14 :
15 : InputParameters
16 14396 : DiffusionLHDGPrescribedGradientBC::validParams()
17 : {
18 14396 : auto params = IntegratedBC::validParams();
19 14396 : params += DiffusionLHDGAssemblyHelper::validParams();
20 14396 : params.renameParam("variable", "u", "The diffusing specie concentration");
21 14396 : params.addClassDescription("Implements a flux boundary condition for use with a hybridized "
22 : "discretization of the diffusion equation");
23 43188 : params.addParam<MooseFunctorName>(
24 28792 : "normal_gradient", 0, "The prescribed value of the gradient dotted with the normal");
25 14396 : return params;
26 0 : }
27 :
28 66 : DiffusionLHDGPrescribedGradientBC::DiffusionLHDGPrescribedGradientBC(
29 66 : const InputParameters & parameters)
30 : : IntegratedBC(parameters),
31 66 : DiffusionLHDGAssemblyHelper(this, this, this, this, _fe_problem, _sys, _tid),
32 66 : _normal_gradient(getFunctor<Real>("normal_gradient")),
33 66 : _cached_side(libMesh::invalid_uint)
34 : {
35 66 : }
36 :
37 : void
38 66 : DiffusionLHDGPrescribedGradientBC::initialSetup()
39 : {
40 66 : checkCoupling();
41 66 : }
42 :
43 : void
44 2025 : DiffusionLHDGPrescribedGradientBC::computeResidual()
45 : {
46 2025 : _vector_re.resize(_qu_dof_indices.size());
47 2025 : _scalar_re.resize(_u_dof_indices.size());
48 2025 : _lm_re.resize(_lm_u_dof_indices.size());
49 :
50 : // For notation, please read "A superconvergent LDG-hybridizable Galerkin method for second-order
51 : // elliptic problems" by Cockburn
52 :
53 : // qu, u, lm_u
54 2025 : vectorFaceResidual(_lm_u_sol, _JxW, *_qrule, _normals, _vector_re);
55 2025 : scalarFaceResidual(_qu_sol, _u_sol, _lm_u_sol, _JxW, *_qrule, _normals, _scalar_re);
56 2025 : lmFaceResidual(_qu_sol, _u_sol, _lm_u_sol, _JxW, *_qrule, _normals, _lm_re);
57 :
58 6075 : for (const auto qp : make_range(_qrule->n_points()))
59 28350 : for (const auto i : index_range(_lm_re))
60 : // prescribed normal gradient
61 24300 : _lm_re(i) += _JxW[qp] * _diff[qp] * _lm_phi_face[i][qp] *
62 24300 : _normal_gradient(
63 24300 : Moose::ElemSideQpArg{_current_elem, _current_side, qp, _qrule, _q_point[qp]},
64 48600 : determineState());
65 :
66 2025 : addResiduals(_assembly, _vector_re, _qu_dof_indices, _grad_u_var.scalingFactor());
67 2025 : addResiduals(_assembly, _scalar_re, _u_dof_indices, _u_var.scalingFactor());
68 2025 : addResiduals(_assembly, _lm_re, _lm_u_dof_indices, _u_face_var.scalingFactor());
69 2025 : }
70 :
71 : void
72 810 : DiffusionLHDGPrescribedGradientBC::computeJacobian()
73 : {
74 810 : _vector_vector_jac.resize(_qu_dof_indices.size(), _qu_dof_indices.size());
75 810 : _vector_scalar_jac.resize(_qu_dof_indices.size(), _u_dof_indices.size());
76 810 : _scalar_vector_jac.resize(_u_dof_indices.size(), _qu_dof_indices.size());
77 810 : _scalar_scalar_jac.resize(_u_dof_indices.size(), _u_dof_indices.size());
78 810 : _scalar_lm_jac.resize(_u_dof_indices.size(), _lm_u_dof_indices.size());
79 810 : _lm_scalar_jac.resize(_lm_u_dof_indices.size(), _u_dof_indices.size());
80 810 : _lm_lm_jac.resize(_lm_u_dof_indices.size(), _lm_u_dof_indices.size());
81 810 : _vector_lm_jac.resize(_qu_dof_indices.size(), _lm_u_dof_indices.size());
82 810 : _lm_vector_jac.resize(_lm_u_dof_indices.size(), _qu_dof_indices.size());
83 :
84 : // qu, u, lm_u
85 810 : vectorFaceJacobian(_JxW, *_qrule, _normals, _vector_lm_jac);
86 810 : scalarFaceJacobian(
87 810 : _JxW, *_qrule, _normals, _scalar_vector_jac, _scalar_scalar_jac, _scalar_lm_jac);
88 810 : lmFaceJacobian(_JxW, *_qrule, _normals, _lm_vector_jac, _lm_scalar_jac, _lm_lm_jac);
89 :
90 1620 : addJacobian(
91 810 : _assembly, _vector_vector_jac, _qu_dof_indices, _qu_dof_indices, _grad_u_var.scalingFactor());
92 1620 : addJacobian(
93 810 : _assembly, _vector_scalar_jac, _qu_dof_indices, _u_dof_indices, _grad_u_var.scalingFactor());
94 1620 : addJacobian(
95 810 : _assembly, _scalar_vector_jac, _u_dof_indices, _qu_dof_indices, _u_var.scalingFactor());
96 1620 : addJacobian(
97 810 : _assembly, _scalar_scalar_jac, _u_dof_indices, _u_dof_indices, _u_var.scalingFactor());
98 810 : addJacobian(_assembly, _scalar_lm_jac, _u_dof_indices, _lm_u_dof_indices, _u_var.scalingFactor());
99 1620 : addJacobian(
100 810 : _assembly, _lm_scalar_jac, _lm_u_dof_indices, _u_dof_indices, _u_face_var.scalingFactor());
101 1620 : addJacobian(
102 810 : _assembly, _lm_lm_jac, _lm_u_dof_indices, _lm_u_dof_indices, _u_face_var.scalingFactor());
103 1620 : addJacobian(
104 810 : _assembly, _vector_lm_jac, _qu_dof_indices, _lm_u_dof_indices, _grad_u_var.scalingFactor());
105 1620 : addJacobian(
106 810 : _assembly, _lm_vector_jac, _lm_u_dof_indices, _qu_dof_indices, _u_face_var.scalingFactor());
107 810 : }
108 :
109 : void
110 122 : DiffusionLHDGPrescribedGradientBC::jacobianSetup()
111 : {
112 122 : _cached_elem = nullptr;
113 122 : _cached_side = libMesh::invalid_uint;
114 122 : }
115 :
116 : void
117 2430 : DiffusionLHDGPrescribedGradientBC::computeOffDiagJacobian(const unsigned int)
118 : {
119 2430 : if ((_cached_elem != _current_elem) || (_cached_side != _current_side))
120 : {
121 810 : computeJacobian();
122 810 : _cached_elem = _current_elem;
123 810 : _cached_side = _current_side;
124 : }
125 2430 : }
|