VertexCFD  0.0-dev
VertexCFD_BCStrategy_SolidElectricBoundaryFlux_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYCONDITION_SOLIDELECTRICBOUNDARYFLUX_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYCONDITION_SOLIDELECTRICBOUNDARYFLUX_IMPL_HPP
3 
4 #include "boundary_conditions/VertexCFD_BoundaryState_ViscousGradient.hpp"
5 #include "boundary_conditions/VertexCFD_BoundaryState_ViscousPenaltyParameter.hpp"
6 #include "boundary_conditions/VertexCFD_Integrator_BoundaryGradBasisDotVector.hpp"
7 
8 #include "induction_less_mhd_solver/boundary_conditions/VertexCFD_SolidElectricBoundaryState_Factory.hpp"
9 #include "induction_less_mhd_solver/closure_models/VertexCFD_Closure_SolidElectricPotentialDiffusionFlux.hpp"
10 
11 #include <Panzer_DOF.hpp>
12 #include <Panzer_DOFGradient.hpp>
13 #include <Panzer_DotProduct.hpp>
14 #include <Panzer_Integrator_BasisTimesScalar.hpp>
15 #include <Panzer_Normals.hpp>
16 #include <Panzer_Sum.hpp>
17 
18 #include <Phalanx_DataLayout.hpp>
19 #include <Phalanx_DataLayout_MDALayout.hpp>
20 #include <Phalanx_MDField.hpp>
21 
22 #include <map>
23 #include <string>
24 #include <vector>
25 
26 namespace VertexCFD
27 {
28 namespace BoundaryCondition
29 {
30 //---------------------------------------------------------------------------//
31 template<class EvalType, int NumSpaceDim>
32 SolidElectricBoundaryFlux<EvalType, NumSpaceDim>::SolidElectricBoundaryFlux(
33  const panzer::BC& bc, const Teuchos::RCP<panzer::GlobalData>& global_data)
34  : BoundaryFluxBase<EvalType, NumSpaceDim>(bc, global_data)
35 {
36 }
37 
38 //---------------------------------------------------------------------------//
39 template<class EvalType, int NumSpaceDim>
41  const panzer::PhysicsBlock& side_pb,
42  const Teuchos::ParameterList& )
43 {
44  // Initialize equation names and variable names for solid induction-less
45  // MHD equation
46  _equ_dof_cond_pair.insert(
47  {"electric_potential_equation", "electric_potential"});
48 
49  // Initialize parent class variables (only needed with one set of
50  // equations)
51  this->initialize(side_pb, _equ_dof_cond_pair);
52 }
53 
54 //---------------------------------------------------------------------------//
55 template<class EvalType, int NumSpaceDim>
57  PHX::FieldManager<panzer::Traits>& fm,
58  const panzer::PhysicsBlock& side_pb,
59  const panzer::ClosureModelFactory_TemplateManager<panzer::Traits>&,
60  const Teuchos::ParameterList& models,
61  const Teuchos::ParameterList& user_data) const
62 {
63  // Create boundary state operators for solid induction-less MHD
64  // equation Get bc sublist
65  const auto bc_params = *(this->m_bc.params());
66 
67  // Get model id from the `child0` sublist stored in `side_pb`. Note that
68  // 'child0' is set as the sublist name by Panzer.
69  std::string model_id = "";
70  Teuchos::ParameterList side_pb_list;
71  this->getModelID(bc_params, side_pb, model_id, side_pb_list);
72 
73  // Map to store residuals for each equation listed in
74  // `_equ_dof_cond_pair`
75  std::unordered_map<std::string, std::vector<std::string>> eq_vct_map;
76 
77  // Get integration rule for closure models
78  const auto ir = this->integrationRule();
79 
80  // Create degree of freedom and gradients for solid induction-less
81  // MHD equation
82  for (auto& pair : _equ_dof_cond_pair)
83  {
84  this->registerDOFsGradient(fm, side_pb, pair.second);
85  }
86 
87  // Register normals
88  this->registerSideNormals(fm, side_pb);
89 
90  // Register solid induction-less MHD boundary condition and closure
91  // models
92  const auto closure_model = models.sublist(model_id);
93  const auto boundary_state_op
94  = SolidElectricBoundaryStateFactory<EvalType,
95  panzer::Traits,
96  num_space_dim>::create(*ir,
97  bc_params,
98  closure_model);
99 
100  for (std::size_t i = 0; i < boundary_state_op.size(); ++i)
101  {
102  this->template registerEvaluator<EvalType>(fm, boundary_state_op[i]);
103  }
104 
105  // Second-order flux //
106 
107  // Register penalty and diffusion gradient operators for each
108  // equation.
109  for (auto& pair : _equ_dof_cond_pair)
110  {
111  this->registerPenaltyAndViscousGradientOperator(
112  pair, fm, side_pb, user_data);
113  }
114 
115  // Create boundary fluxes to be used with the penalty method
116  for (auto& pair : this->bnd_prefix)
117  {
118  // Prefix names
119  const std::string flux_prefix = pair.first;
120  const std::string gradient_prefix = pair.second;
121 
122  auto viscous_flux_op = Teuchos::rcp(
123  new ClosureModel::SolidElectricPotentialDiffusionFlux<EvalType,
124  panzer::Traits>(
125  *ir, flux_prefix, gradient_prefix));
126  this->template registerEvaluator<EvalType>(fm, viscous_flux_op);
127  }
128 
129  // Create viscous flux integrals.
130  for (auto& pair : _equ_dof_cond_pair)
131  {
132  this->registerViscousTypeFluxOperator(
133  pair, eq_vct_map, "ELECTRIC_POTENTIAL", fm, side_pb, 1.0);
134  }
135 
136  // Compose total residual for solid induction-less MHD equation
137  for (auto& pair : _equ_dof_cond_pair)
138  {
139  this->registerResidual(pair, eq_vct_map, fm, side_pb);
140  }
141 }
142 
143 //---------------------------------------------------------------------------//
144 template<class EvalType, int NumSpaceDim>
145 void SolidElectricBoundaryFlux<EvalType, NumSpaceDim>::buildAndRegisterScatterEvaluators(
146  PHX::FieldManager<panzer::Traits>& fm,
147  const panzer::PhysicsBlock& side_pb,
148  const panzer::LinearObjFactory<panzer::Traits>& lof,
149  const Teuchos::ParameterList& /*user_data*/) const
150 {
151  for (auto& pair : _equ_dof_cond_pair)
152  {
153  this->registerScatterOperator(pair, fm, side_pb, lof);
154  }
155 }
156 
157 //---------------------------------------------------------------------------//
158 template<class EvalType, int NumSpaceDim>
159 void SolidElectricBoundaryFlux<EvalType, NumSpaceDim>::
160  buildAndRegisterGatherAndOrientationEvaluators(
161  PHX::FieldManager<panzer::Traits>& fm,
162  const panzer::PhysicsBlock& side_pb,
163  const panzer::LinearObjFactory<panzer::Traits>& lof,
164  const Teuchos::ParameterList& user_data) const
165 {
166  side_pb.buildAndRegisterGatherAndOrientationEvaluators(fm, lof, user_data);
167 }
168 
169 //---------------------------------------------------------------------------//
170 template<class EvalType, int NumSpaceDim>
171 void SolidElectricBoundaryFlux<EvalType, NumSpaceDim>::postRegistrationSetup(
172  typename panzer::Traits::SetupData, PHX::FieldManager<panzer::Traits>&)
173 {
174 }
175 
176 //---------------------------------------------------------------------------//
177 template<class EvalType, int NumSpaceDim>
178 void SolidElectricBoundaryFlux<EvalType, NumSpaceDim>::evaluateFields(
179  typename panzer::Traits::EvalData)
180 {
181 }
182 
183 //---------------------------------------------------------------------------//
184 
185 } // end namespace BoundaryCondition
186 } // end namespace VertexCFD
187 
188 #endif // end VERTEXCFD_BOUNDARYCONDITION_SOLIDELECTRICBOUNDARYFLUX_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::BoundaryCondition::SolidElectricBoundaryFlux
Definition: VertexCFD_BCStrategy_SolidElectricBoundaryFlux.hpp:28
VertexCFD::BoundaryCondition::SolidElectricBoundaryFlux::setup
void setup(const panzer::PhysicsBlock &side_pb, const Teuchos::ParameterList &user_data) override
Definition: VertexCFD_BCStrategy_SolidElectricBoundaryFlux_impl.hpp:40