VertexCFD  0.0-dev
VertexCFD_BCStrategy_SolidFullInductionMHDBoundaryFlux_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYCONDITION_SOLIDFULLINDUCTIONMHDBOUNDARYFLUX_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYCONDITION_SOLIDFULLINDUCTIONMHDBOUNDARYFLUX_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 "closure_models/VertexCFD_Closure_ConstantScalarField.hpp"
9 #include "closure_models/VertexCFD_Closure_ExternalMagneticField.hpp"
10 
11 #include "full_induction_mhd_solver/boundary_conditions/VertexCFD_FullInductionBoundaryState_Factory.hpp"
12 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_InductionResistiveFlux.hpp"
13 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_SolidFullInductionConvectiveFlux.hpp"
14 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_TotalMagneticField.hpp"
15 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_TotalMagneticFieldGradient.hpp"
16 #include "full_induction_mhd_solver/mhd_properties/VertexCFD_FullInductionMHDProperties.hpp"
17 
18 #include <Panzer_DOF.hpp>
19 #include <Panzer_DOFGradient.hpp>
20 #include <Panzer_DotProduct.hpp>
21 #include <Panzer_Integrator_BasisTimesScalar.hpp>
22 #include <Panzer_Normals.hpp>
23 #include <Panzer_Sum.hpp>
24 
25 #include <Phalanx_DataLayout.hpp>
26 #include <Phalanx_DataLayout_MDALayout.hpp>
27 #include <Phalanx_MDField.hpp>
28 
29 #include <map>
30 #include <stdexcept>
31 #include <string>
32 #include <vector>
33 
34 namespace VertexCFD
35 {
36 namespace BoundaryCondition
37 {
38 //---------------------------------------------------------------------------//
39 template<class EvalType, int NumSpaceDim>
40 SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
41  SolidFullInductionMHDBoundaryFlux(
42  const panzer::BC& bc,
43  const Teuchos::RCP<panzer::GlobalData>& global_data)
44  : BoundaryFluxBase<EvalType, NumSpaceDim>(bc, global_data)
45 {
46 }
47 
48 //---------------------------------------------------------------------------//
49 template<class EvalType, int NumSpaceDim>
50 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::setup(
51  const panzer::PhysicsBlock& side_pb,
52  const Teuchos::ParameterList& /*user_data*/)
53 {
54  // Get the solid induction physics block parameters associated with this
55  // sideset, and extract necessary information, including "Model IDs" for
56  // induction closure models.
57  const auto side_pb_params = *side_pb.getParameterList();
58  bool build_magn_corr = false;
59  bool found_pb = false;
60  for (int i = 0; i < side_pb_params.numParams(); ++i)
61  {
62  const std::string name = "child" + std::to_string(i);
63  if (side_pb_params.isSublist(name))
64  {
65  const auto& sl = side_pb_params.sublist(name);
66  const auto& type = sl.get<std::string>("Type");
67  if (type == "SolidFullInductionMHD")
68  {
69  _induction_model_id = sl.get<std::string>("Model ID");
70  if (sl.isType<bool>("Build Magnetic Correction Potential "
71  "Equation"))
72  {
73  build_magn_corr = sl.get<bool>(
74  "Build Magnetic Correction Potential Equation");
75  }
76  found_pb = true;
77  }
78  }
79  }
80  _build_convective_flux = build_magn_corr;
81  if (!found_pb)
82  {
83  const std::string ss_id = this->m_bc.sidesetID();
84  throw std::runtime_error(
85  "No \"SolidFullInduction\" physics block found for side set "
86  + this->m_bc.sidesetID());
87  }
88 
89  // Initialize equation names and variables for FIM
90  for (int d = 0; d < num_space_dim; ++d)
91  {
92  const std::string ds = std::to_string(d);
93  _equ_dof_sim_pair.insert(
94  {"induction_" + ds, "induced_magnetic_field_" + ds});
95  }
96  if (build_magn_corr)
97  {
98  _equ_dof_sim_pair.insert(
99  {"magnetic_correction_potential", "scalar_magnetic_potential"});
100  }
101 
102  // Initialize parent class variables (only needed with one set of
103  // equations)
104  this->initialize(side_pb, _equ_dof_sim_pair);
105 }
106 
107 //---------------------------------------------------------------------------//
108 template<class EvalType, int NumSpaceDim>
109 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
110  buildAndRegisterEvaluators(
111  PHX::FieldManager<panzer::Traits>& fm,
112  const panzer::PhysicsBlock& side_pb,
113  const panzer::ClosureModelFactory_TemplateManager<panzer::Traits>&,
114  const Teuchos::ParameterList& closure_models,
115  const Teuchos::ParameterList& user_data) const
116 {
117  // Map to store residuals for each equation listed in `_equ_dof_sim_pair`
118  std::unordered_map<std::string, std::vector<std::string>> eq_vct_map;
119 
120  // Get integration rule for closure models
121  const auto& ir = this->integrationRule();
122 
123  // Create degree of freedom and gradients for TM equations
124  for (auto& pair : _equ_dof_sim_pair)
125  {
126  this->registerDOFsGradient(fm, side_pb, pair.second);
127  }
128 
129  // Register normals
130  this->registerSideNormals(fm, side_pb);
131 
132  // Create boundary state operators for NS equations and EP equation
133  // Get bc sublist
134  const auto bc_params = *(this->m_bc.params());
135 
136  // Full Induction Model boundary fluxes
137  const auto full_induction_params
138  = closure_models.sublist(_induction_model_id)
139  .sublist("Full Induction MHD Properties");
140  const MHDProperties::FullInductionMHDProperties mhd_props(
141  full_induction_params);
142 
143  // Add total magnetic field closure.
144  const auto ext_magn_field_op = Teuchos::rcp(
145  new ClosureModel::ExternalMagneticField<EvalType, panzer::Traits>(
146  *ir, user_data));
147  this->template registerEvaluator<EvalType>(fm, ext_magn_field_op);
148 
149  const auto tot_magn_field_op = Teuchos::rcp(
150  new ClosureModel::TotalMagneticField<EvalType, panzer::Traits, num_space_dim>(
151  *ir, "BOUNDARY_"));
152  this->template registerEvaluator<EvalType>(fm, tot_magn_field_op);
153 
154  // Register boundary conditions for the induciton equations
155  const auto fim_boundary_state_op
156  = FullInductionBoundaryStateFactory<EvalType, panzer::Traits, num_space_dim>::
157  create(*ir, bc_params.sublist("Full Induction Model"), mhd_props);
158  this->template registerEvaluator<EvalType>(fm, fim_boundary_state_op);
159 
160  if (_build_convective_flux)
161  {
162  const auto induction_flux_op = Teuchos::rcp(
163  new ClosureModel::SolidFullInductionConvectiveFlux<EvalType,
164  panzer::Traits,
165  num_space_dim>(
166  *ir, mhd_props, "BOUNDARY_", "BOUNDARY_"));
167  this->template registerEvaluator<EvalType>(fm, induction_flux_op);
168 
169  for (auto& pair_fim : _equ_dof_sim_pair)
170  {
171  BoundaryFluxBase<EvalType, NumSpaceDim>::registerConvectionTypeFluxOperator(
172  pair_fim, eq_vct_map, "CONVECTIVE", fm, side_pb, 1.0);
173  }
174  }
175 
176  if (mhd_props.buildResistiveFlux())
177  {
178  const auto resistivity_op = Teuchos::rcp(
179  new ClosureModel::ConstantScalarField<EvalType, panzer::Traits>(
180  *ir, "resistivity", mhd_props.resistivity()));
181  this->template registerEvaluator<EvalType>(fm, resistivity_op);
182 
183  for (auto& pair_fim : _equ_dof_sim_pair)
184  {
185  // Register penalty and resistive gradient operators for each
186  // equation.
187  BoundaryFluxBase<EvalType, NumSpaceDim>::
188  registerPenaltyAndViscousGradientOperator(
189  pair_fim, fm, side_pb, bc_params);
190 
191  // Create boundary fluxes to be used with the penalty method
192  for (auto& pair_bnd :
193  BoundaryFluxBase<EvalType, NumSpaceDim>::bnd_prefix)
194  {
195  const std::string flux_prefix = pair_bnd.first;
196  const std::string gradient_prefix = pair_bnd.second;
197 
198  // Need total magnetic field symmetry and penalty gradients
199  const auto tot_magn_field_grad_op = Teuchos::rcp(
200  new ClosureModel::TotalMagneticFieldGradient<EvalType,
201  panzer::Traits,
202  NumSpaceDim>(
203  *ir, gradient_prefix));
204  this->template registerEvaluator<EvalType>(
205  fm, tot_magn_field_grad_op);
206 
207  const auto resistive_flux_op = Teuchos::rcp(
208  new ClosureModel::InductionResistiveFlux<EvalType,
209  panzer::Traits,
210  NumSpaceDim>(
211  *ir, mhd_props, flux_prefix, gradient_prefix));
212  this->template registerEvaluator<EvalType>(fm,
213  resistive_flux_op);
214  }
215  // Create resistive flux integral
216  BoundaryFluxBase<EvalType, NumSpaceDim>::registerViscousTypeFluxOperator(
217  pair_fim, eq_vct_map, "RESISTIVE", fm, side_pb, 1.0);
218  }
219  }
220 
221  // Compose total residual for FIM equations
222  for (auto& pair : _equ_dof_sim_pair)
223  {
224  BoundaryFluxBase<EvalType, NumSpaceDim>::registerResidual(
225  pair, eq_vct_map, fm, side_pb);
226  }
227 }
228 
229 //---------------------------------------------------------------------------//
230 template<class EvalType, int NumSpaceDim>
231 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
232  buildAndRegisterScatterEvaluators(
233  PHX::FieldManager<panzer::Traits>& fm,
234  const panzer::PhysicsBlock& side_pb,
235  const panzer::LinearObjFactory<panzer::Traits>& lof,
236  const Teuchos::ParameterList& /*user_data*/) const
237 {
238  for (auto& pair : _equ_dof_sim_pair)
239  {
241  pair, fm, side_pb, lof);
242  }
243 }
244 
245 //---------------------------------------------------------------------------//
246 template<class EvalType, int NumSpaceDim>
247 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
248  buildAndRegisterGatherAndOrientationEvaluators(
249  PHX::FieldManager<panzer::Traits>& fm,
250  const panzer::PhysicsBlock& side_pb,
251  const panzer::LinearObjFactory<panzer::Traits>& lof,
252  const Teuchos::ParameterList& user_data) const
253 {
254  side_pb.buildAndRegisterGatherAndOrientationEvaluators(fm, lof, user_data);
255 }
256 
257 //---------------------------------------------------------------------------//
258 template<class EvalType, int NumSpaceDim>
259 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::postRegistrationSetup(
260  typename panzer::Traits::SetupData, PHX::FieldManager<panzer::Traits>&)
261 {
262 }
263 
264 //---------------------------------------------------------------------------//
265 template<class EvalType, int NumSpaceDim>
266 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::evaluateFields(
267  typename panzer::Traits::EvalData)
268 {
269 }
270 
271 //---------------------------------------------------------------------------//
272 
273 } // end namespace BoundaryCondition
274 } // end namespace VertexCFD
275 
276 #endif // end
277  // VERTEXCFD_BOUNDARYCONDITION_SOLIDFULLINDUCTIONMHDBOUNDARYFLUX_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::BoundaryCondition::BoundaryFluxBase::registerScatterOperator
void registerScatterOperator(std::pair< const std::string, std::string > dof_eq_pair, PHX::FieldManager< panzer::Traits > &fm, const panzer::PhysicsBlock &side_pb, const panzer::LinearObjFactory< panzer::Traits > &lof) const
Definition: VertexCFD_BCStrategy_BoundaryFluxBase_impl.hpp:369