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