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 "ElementAndTraceScalarHDGAssemblyHelper.h"
11 : #include "Assembly.h"
12 : #include "MooseFunctor.h"
13 : #include "MooseVariableDependencyInterface.h"
14 : #include "MooseVariableFE.h"
15 : #include "SystemBase.h"
16 : #include "MooseObject.h"
17 : #include "TaggingInterface.h"
18 : #include "TransientInterface.h"
19 :
20 : using namespace libMesh;
21 :
22 : InputParameters
23 23366 : ElementAndTraceScalarHDGAssemblyHelper::validParams()
24 : {
25 23366 : auto params = emptyInputParameters();
26 70098 : params.addRequiredParam<NonlinearVariableName>("face_variable", "The face variable");
27 23366 : return params;
28 0 : }
29 :
30 865 : ElementAndTraceScalarHDGAssemblyHelper::ElementAndTraceScalarHDGAssemblyHelper(
31 : const MooseObject * const moose_obj,
32 : MooseVariableDependencyInterface * const mvdi,
33 : const TransientInterface * const ti,
34 : SystemBase & sys,
35 : const Assembly & assembly,
36 : const THREAD_ID tid,
37 : const std::set<SubdomainID> & block_ids,
38 865 : const std::set<BoundaryID> & boundary_ids)
39 : : ThreeMaterialPropertyInterface(moose_obj, block_ids, boundary_ids),
40 865 : _ti(*ti),
41 865 : _u_var(sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("variable"))),
42 1730 : _u_face_var(sys.getFieldVariable<Real>(
43 1730 : tid, moose_obj->getParam<NonlinearVariableName>("face_variable"))),
44 865 : _u_dof_indices(_u_var.dofIndices()),
45 865 : _lm_u_dof_indices(_u_face_var.dofIndices()),
46 865 : _u_sol(_u_var.adSln()),
47 865 : _lm_u_sol(_u_face_var.adSln()),
48 865 : _scalar_phi(_u_var.phi()),
49 865 : _grad_scalar_phi(_u_var.gradPhi()),
50 865 : _scalar_phi_face(_u_var.phiFace()),
51 865 : _lm_phi_face(_u_face_var.phiFace()),
52 865 : _elem_volume(assembly.elemVolume()),
53 865 : _side_area(assembly.sideElemVolume()),
54 865 : _current_elem(assembly.elem()),
55 865 : _current_side(assembly.side()),
56 865 : _current_side_elem(assembly.sideElem()),
57 865 : _JxW(assembly.JxW()),
58 865 : _qrule(assembly.qRule()),
59 865 : _q_point(assembly.qPoints()),
60 865 : _JxW_face(assembly.JxWFace()),
61 865 : _qrule_face(assembly.qRuleFace()),
62 865 : _q_point_face(assembly.qPointsFace()),
63 1730 : _normals(assembly.normals())
64 : {
65 865 : mvdi->addMooseVariableDependency(&const_cast<MooseVariableFE<Real> &>(_u_var));
66 865 : mvdi->addMooseVariableDependency(&const_cast<MooseVariableFE<Real> &>(_u_face_var));
67 865 : }
68 :
69 : std::array<ADResidualsPacket, 2>
70 745794 : ElementAndTraceScalarHDGAssemblyHelper::taggingData() const
71 : {
72 745794 : return {ADResidualsPacket{_scalar_re, _u_dof_indices, _u_var.scalingFactor()},
73 745794 : ADResidualsPacket{_lm_re, _lm_u_dof_indices, _u_face_var.scalingFactor()}};
74 : }
75 :
76 : std::set<std::string>
77 308 : ElementAndTraceScalarHDGAssemblyHelper::additionalROVariables()
78 : {
79 924 : return {_u_face_var.name()};
80 308 : }
81 :
82 : void
83 29440 : ElementAndTraceScalarHDGAssemblyHelper::lmDirichlet(const Moose::Functor<Real> & dirichlet_value)
84 : {
85 89168 : for (const auto qp : make_range(_qrule_face->n_points()))
86 : {
87 179184 : const auto scalar_value = dirichlet_value(
88 59728 : Moose::ElemSideQpArg{_current_elem, _current_side, qp, _qrule_face, _q_point_face[qp]},
89 59728 : _ti.determineState());
90 :
91 360744 : for (const auto i : index_range(_lm_re))
92 301016 : _lm_re(i) += _JxW_face[qp] * (_lm_u_sol[qp] - scalar_value) * _lm_phi_face[i][qp];
93 : }
94 29440 : }
95 :
96 : void
97 9404 : ElementAndTraceScalarHDGAssemblyHelper::lmPrescribedFlux(const Moose::Functor<Real> & flux_value)
98 : {
99 29112 : for (const auto qp : make_range(_qrule_face->n_points()))
100 : {
101 59124 : const auto flux = flux_value(
102 19708 : Moose::ElemSideQpArg{_current_elem, _current_side, qp, _qrule_face, _q_point_face[qp]},
103 19708 : _ti.determineState());
104 :
105 175804 : for (const auto i : index_range(_lm_re))
106 156096 : _lm_re(i) += _JxW_face[qp] * flux * _lm_phi_face[i][qp];
107 : }
108 9404 : }
|