1 #ifndef VERTEXCFD_BOUNDARYCONDITION_SOLIDFULLINDUCTIONMHDBOUNDARYFLUX_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYCONDITION_SOLIDFULLINDUCTIONMHDBOUNDARYFLUX_IMPL_HPP
4 #include "boundary_conditions/VertexCFD_BoundaryState_ViscousGradient.hpp"
5 #include "boundary_conditions/VertexCFD_BoundaryState_ViscousPenaltyParameter.hpp"
6 #include "boundary_conditions/VertexCFD_Integrator_BoundaryGradBasisDotVector.hpp"
8 #include "closure_models/VertexCFD_Closure_ConstantScalarField.hpp"
9 #include "closure_models/VertexCFD_Closure_ExternalMagneticField.hpp"
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"
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>
25 #include <Phalanx_DataLayout.hpp>
26 #include <Phalanx_DataLayout_MDALayout.hpp>
27 #include <Phalanx_MDField.hpp>
36 namespace BoundaryCondition
39 template<
class EvalType,
int NumSpaceDim>
40 SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
41 SolidFullInductionMHDBoundaryFlux(
43 const Teuchos::RCP<panzer::GlobalData>& global_data)
44 : BoundaryFluxBase<EvalType, NumSpaceDim>(bc, global_data)
49 template<
class EvalType,
int NumSpaceDim>
50 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::setup(
51 const panzer::PhysicsBlock& side_pb,
52 const Teuchos::ParameterList& )
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)
62 const std::string name =
"child" + std::to_string(i);
63 if (side_pb_params.isSublist(name))
65 const auto& sl = side_pb_params.sublist(name);
66 const auto& type = sl.get<std::string>(
"Type");
67 if (type ==
"SolidFullInductionMHD")
69 _induction_model_id = sl.get<std::string>(
"Model ID");
70 if (sl.isType<
bool>(
"Build Magnetic Correction Potential "
73 build_magn_corr = sl.get<
bool>(
74 "Build Magnetic Correction Potential Equation");
80 _build_convective_flux = build_magn_corr;
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());
90 for (
int d = 0; d < num_space_dim; ++d)
92 const std::string ds = std::to_string(d);
93 _equ_dof_sim_pair.insert(
94 {
"induction_" + ds,
"induced_magnetic_field_" + ds});
98 _equ_dof_sim_pair.insert(
99 {
"magnetic_correction_potential",
"scalar_magnetic_potential"});
104 this->initialize(side_pb, _equ_dof_sim_pair);
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
118 std::unordered_map<std::string, std::vector<std::string>> eq_vct_map;
121 const auto& ir = this->integrationRule();
124 for (
auto& pair : _equ_dof_sim_pair)
126 this->registerDOFsGradient(fm, side_pb, pair.second);
130 this->registerSideNormals(fm, side_pb);
134 const auto bc_params = *(this->m_bc.params());
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);
144 const auto ext_magn_field_op = Teuchos::rcp(
145 new ClosureModel::ExternalMagneticField<EvalType, panzer::Traits>(
147 this->
template registerEvaluator<EvalType>(fm, ext_magn_field_op);
149 const auto tot_magn_field_op = Teuchos::rcp(
150 new ClosureModel::TotalMagneticField<EvalType, panzer::Traits, num_space_dim>(
152 this->
template registerEvaluator<EvalType>(fm, tot_magn_field_op);
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);
160 if (_build_convective_flux)
162 const auto induction_flux_op = Teuchos::rcp(
163 new ClosureModel::SolidFullInductionConvectiveFlux<EvalType,
166 *ir, mhd_props,
"BOUNDARY_",
"BOUNDARY_"));
167 this->
template registerEvaluator<EvalType>(fm, induction_flux_op);
169 for (
auto& pair_fim : _equ_dof_sim_pair)
171 BoundaryFluxBase<EvalType, NumSpaceDim>::registerConvectionTypeFluxOperator(
172 pair_fim, eq_vct_map,
"CONVECTIVE", fm, side_pb, 1.0);
176 if (mhd_props.buildResistiveFlux())
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);
183 for (
auto& pair_fim : _equ_dof_sim_pair)
187 BoundaryFluxBase<EvalType, NumSpaceDim>::
188 registerPenaltyAndViscousGradientOperator(
189 pair_fim, fm, side_pb, bc_params);
192 for (
auto& pair_bnd :
193 BoundaryFluxBase<EvalType, NumSpaceDim>::bnd_prefix)
195 const std::string flux_prefix = pair_bnd.first;
196 const std::string gradient_prefix = pair_bnd.second;
199 const auto tot_magn_field_grad_op = Teuchos::rcp(
200 new ClosureModel::TotalMagneticFieldGradient<EvalType,
203 *ir, gradient_prefix));
204 this->
template registerEvaluator<EvalType>(
205 fm, tot_magn_field_grad_op);
207 const auto resistive_flux_op = Teuchos::rcp(
208 new ClosureModel::InductionResistiveFlux<EvalType,
211 *ir, mhd_props, flux_prefix, gradient_prefix));
212 this->
template registerEvaluator<EvalType>(fm,
216 BoundaryFluxBase<EvalType, NumSpaceDim>::registerViscousTypeFluxOperator(
217 pair_fim, eq_vct_map,
"RESISTIVE", fm, side_pb, 1.0);
222 for (
auto& pair : _equ_dof_sim_pair)
224 BoundaryFluxBase<EvalType, NumSpaceDim>::registerResidual(
225 pair, eq_vct_map, fm, side_pb);
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& )
const
238 for (
auto& pair : _equ_dof_sim_pair)
241 pair, fm, side_pb, lof);
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
254 side_pb.buildAndRegisterGatherAndOrientationEvaluators(fm, lof, user_data);
258 template<
class EvalType,
int NumSpaceDim>
259 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::postRegistrationSetup(
260 typename panzer::Traits::SetupData, PHX::FieldManager<panzer::Traits>&)
265 template<
class EvalType,
int NumSpaceDim>
266 void SolidFullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::evaluateFields(
267 typename panzer::Traits::EvalData)