1 #ifndef VERTEXCFD_BOUNDARYCONDITION_FULLINDUCTIONMHDBOUNDARYFLUX_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYCONDITION_FULLINDUCTIONMHDBOUNDARYFLUX_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 "incompressible_solver/boundary_conditions/VertexCFD_IncompressibleBoundaryState_Factory.hpp"
13 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleConvectiveFlux.hpp"
14 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleViscousFlux.hpp"
15 #include "incompressible_solver/fluid_properties/VertexCFD_Closure_IncompressibleFluidProperties.hpp"
17 #include "full_induction_mhd_solver/boundary_conditions/VertexCFD_FullInductionBoundaryState_Factory.hpp"
18 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_InductionConvectiveFlux.hpp"
19 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_InductionConvectiveMomentumFlux.hpp"
20 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_InductionResistiveFlux.hpp"
21 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_MagneticPressure.hpp"
22 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_TotalMagneticField.hpp"
23 #include "full_induction_mhd_solver/closure_models/VertexCFD_Closure_TotalMagneticFieldGradient.hpp"
24 #include "full_induction_mhd_solver/mhd_properties/VertexCFD_FullInductionMHDProperties.hpp"
26 #include <Panzer_DOF.hpp>
27 #include <Panzer_DOFGradient.hpp>
28 #include <Panzer_DotProduct.hpp>
29 #include <Panzer_Integrator_BasisTimesScalar.hpp>
30 #include <Panzer_Normals.hpp>
31 #include <Panzer_Sum.hpp>
33 #include <Phalanx_DataLayout.hpp>
34 #include <Phalanx_DataLayout_MDALayout.hpp>
35 #include <Phalanx_MDField.hpp>
43 namespace BoundaryCondition
46 template<
class EvalType,
int NumSpaceDim>
47 FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::FullInductionMHDBoundaryFlux(
48 const panzer::BC& bc,
const Teuchos::RCP<panzer::GlobalData>& global_data)
49 : BoundaryFluxBase<EvalType, NumSpaceDim>(bc, global_data)
53 _internal_interface = bc.params()->isType<
bool>(
"Fluid/Solid Interface")
54 ? bc.params()->get<
bool>(
"Fluid/Solid Interface")
59 template<
class EvalType,
int NumSpaceDim>
60 void FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::setup(
61 const panzer::PhysicsBlock& side_pb,
62 const Teuchos::ParameterList& )
67 const auto side_pb_params = *side_pb.getParameterList();
68 bool build_magn_corr =
false;
69 for (
int i = 0; i < side_pb_params.numParams(); ++i)
71 const std::string name =
"child" + std::to_string(i);
72 if (side_pb_params.isSublist(name))
74 const auto& sl = side_pb_params.sublist(name);
75 const auto& type = sl.get<std::string>(
"Type");
76 if (type ==
"FullInductionMHD")
78 _induction_model_id = sl.get<std::string>(
"Model ID");
79 if (sl.isType<
bool>(
"Build Magnetic Correction Potential "
82 build_magn_corr = sl.get<
bool>(
83 "Build Magnetic Correction Potential Equation");
86 else if (type ==
"IncompressibleNavierStokes")
88 _incompressible_model_id = sl.get<std::string>(
"Model ID");
89 _build_viscous_flux = sl.get<
bool>(
"Build Viscous Flux");
96 _build_full_induction_model = !(_internal_interface);
99 _equ_dof_ns_pair.insert({
"continuity",
"lagrange_pressure"});
100 for (
int d = 0; d < num_space_dim; ++d)
102 const std::string ds = std::to_string(d);
103 _equ_dof_ns_pair.insert({
"momentum_" + ds,
"velocity_" + ds});
109 for (
int d = 0; d < num_space_dim; ++d)
111 const std::string ds = std::to_string(d);
112 _equ_dof_fim_pair.insert(
113 {
"induction_" + ds,
"induced_magnetic_field_" + ds});
117 _equ_dof_fim_pair.insert(
118 {
"magnetic_correction_potential",
"scalar_magnetic_potential"});
123 this->initialize(side_pb, _equ_dof_ns_pair);
127 template<
class EvalType,
int NumSpaceDim>
128 void FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::buildAndRegisterEvaluators(
129 PHX::FieldManager<panzer::Traits>& fm,
130 const panzer::PhysicsBlock& side_pb,
131 const panzer::ClosureModelFactory_TemplateManager<panzer::Traits>&,
132 const Teuchos::ParameterList& closure_models,
133 const Teuchos::ParameterList& user_data)
const
136 std::unordered_map<std::string, std::vector<std::string>> eq_vct_map;
139 const auto& ir = this->integrationRule();
142 for (
auto& pair : _equ_dof_ns_pair)
144 this->registerDOFsGradient(fm, side_pb, pair.second);
148 for (
auto& pair : _equ_dof_fim_pair)
150 this->registerDOFsGradient(fm, side_pb, pair.second);
154 this->registerSideNormals(fm, side_pb);
157 Teuchos::ParameterList fluid_params
158 = closure_models.sublist(_incompressible_model_id)
159 .sublist(
"Fluid Properties");
161 fluid_params.set<
bool>(
"Build Temperature Equation",
false);
162 fluid_params.set<
bool>(
"Build Buoyancy Source",
false);
163 fluid_params.set<
bool>(
"Build Inductionless MHD Equation",
false);
165 auto eval = Teuchos::rcp(
166 new FluidProperties::IncompressibleFluidProperties<EvalType,
169 this->
template registerEvaluator<EvalType>(fm, eval);
173 const auto bc_params = *(this->m_bc.params());
176 const auto ns_bc_sublist = bc_params.isSublist(
"Navier-Stokes")
177 ? bc_params.sublist(
"Navier-Stokes")
179 auto incomp_ns_boundary_state_op = IncompressibleBoundaryStateFactory<
182 num_space_dim>::create(*ir, ns_bc_sublist, fluid_params);
183 this->
template registerEvaluator<EvalType>(fm, incomp_ns_boundary_state_op);
188 auto convective_flux_op = Teuchos::rcp(
189 new ClosureModel::IncompressibleConvectiveFlux<EvalType,
192 *ir, fluid_params,
"BOUNDARY_",
"BOUNDARY_"));
193 this->
template registerEvaluator<EvalType>(fm, convective_flux_op);
195 for (
auto& pair : _equ_dof_ns_pair)
197 this->registerConvectionTypeFluxOperator(
198 pair, eq_vct_map,
"CONVECTIVE", fm, side_pb, 1.0);
204 if (_build_viscous_flux)
207 const Teuchos::ParameterList ns_bc_params
208 = bc_params.isSublist(
"Navier-Stokes")
209 ? bc_params.sublist(
"Navier-Stokes")
211 const std::string bc_type = ns_bc_params.get<std::string>(
"Type");
214 for (
auto& pair : _equ_dof_ns_pair)
216 this->registerPenaltyAndViscousGradientOperator(
217 pair, fm, side_pb, bc_params);
221 for (
auto& pair : this->bnd_prefix)
224 const std::string flux_prefix = pair.first;
225 const std::string gradient_prefix = pair.second;
227 const bool turb_model =
false;
228 const auto viscous_flux_op = Teuchos::rcp(
229 new ClosureModel::IncompressibleViscousFlux<EvalType,
238 this->
template registerEvaluator<EvalType>(fm, viscous_flux_op);
242 for (
auto& pair : _equ_dof_ns_pair)
244 this->registerViscousTypeFluxOperator(
245 pair, eq_vct_map,
"VISCOUS", fm, side_pb, 1.0);
250 const auto full_induction_params
251 = closure_models.sublist(_induction_model_id)
252 .sublist(
"Full Induction MHD Properties");
253 const MHDProperties::FullInductionMHDProperties mhd_props(
254 full_induction_params);
260 const auto ext_magn_field_op = Teuchos::rcp(
261 new ClosureModel::ExternalMagneticField<EvalType, panzer::Traits>(
263 this->
template registerEvaluator<EvalType>(fm, ext_magn_field_op);
265 const std::string tot_magn_field_prefix
266 = _build_full_induction_model ?
"BOUNDARY_" :
"";
268 const auto tot_magn_field_op = Teuchos::rcp(
269 new ClosureModel::TotalMagneticField<EvalType, panzer::Traits, num_space_dim>(
270 *ir, tot_magn_field_prefix));
271 this->
template registerEvaluator<EvalType>(fm, tot_magn_field_op);
273 const auto magn_press_op = Teuchos::rcp(
274 new ClosureModel::MagneticPressure<EvalType, panzer::Traits>(
276 this->
template registerEvaluator<EvalType>(fm, magn_press_op);
280 const auto induction_mtm_flux_op = Teuchos::rcp(
281 new ClosureModel::InductionConvectiveMomentumFlux<EvalType,
284 *ir, mhd_props,
"BOUNDARY_"));
285 this->
template registerEvaluator<EvalType>(fm, induction_mtm_flux_op);
288 if (_build_full_induction_model)
291 const auto fim_boundary_state_op = FullInductionBoundaryStateFactory<
294 num_space_dim>::create(*ir,
295 bc_params.sublist(
"Full Induction Model"),
297 this->
template registerEvaluator<EvalType>(fm, fim_boundary_state_op);
299 const auto induction_flux_op = Teuchos::rcp(
300 new ClosureModel::InductionConvectiveFlux<EvalType,
303 *ir, mhd_props,
"BOUNDARY_",
"BOUNDARY_"));
304 this->
template registerEvaluator<EvalType>(fm, induction_flux_op);
306 for (
auto& pair_fim : _equ_dof_fim_pair)
308 BoundaryFluxBase<EvalType, NumSpaceDim>::registerConvectionTypeFluxOperator(
309 pair_fim, eq_vct_map,
"CONVECTIVE", fm, side_pb, 1.0);
312 if (mhd_props.buildResistiveFlux())
314 const auto resistivity_op = Teuchos::rcp(
315 new ClosureModel::ConstantScalarField<EvalType, panzer::Traits>(
316 *ir,
"resistivity", mhd_props.resistivity()));
317 this->
template registerEvaluator<EvalType>(fm, resistivity_op);
319 for (
auto& pair_fim : _equ_dof_fim_pair)
323 BoundaryFluxBase<EvalType, NumSpaceDim>::
324 registerPenaltyAndViscousGradientOperator(
325 pair_fim, fm, side_pb, bc_params);
328 for (
auto& pair_bnd :
329 BoundaryFluxBase<EvalType, NumSpaceDim>::bnd_prefix)
331 const std::string flux_prefix = pair_bnd.first;
332 const std::string gradient_prefix = pair_bnd.second;
335 const auto tot_magn_field_grad_op = Teuchos::rcp(
336 new ClosureModel::TotalMagneticFieldGradient<
339 NumSpaceDim>(*ir, gradient_prefix));
340 this->
template registerEvaluator<EvalType>(
341 fm, tot_magn_field_grad_op);
343 const auto resistive_flux_op = Teuchos::rcp(
344 new ClosureModel::InductionResistiveFlux<EvalType,
347 *ir, mhd_props, flux_prefix, gradient_prefix));
348 this->
template registerEvaluator<EvalType>(
349 fm, resistive_flux_op);
352 BoundaryFluxBase<EvalType, NumSpaceDim>::registerViscousTypeFluxOperator(
353 pair_fim, eq_vct_map,
"RESISTIVE", fm, side_pb, 1.0);
359 for (
auto& pair : _equ_dof_ns_pair)
361 this->registerResidual(pair, eq_vct_map, fm, side_pb);
365 if (_build_full_induction_model)
367 for (
auto& pair : _equ_dof_fim_pair)
369 BoundaryFluxBase<EvalType, NumSpaceDim>::registerResidual(
370 pair, eq_vct_map, fm, side_pb);
376 template<
class EvalType,
int NumSpaceDim>
377 void FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
378 buildAndRegisterScatterEvaluators(
379 PHX::FieldManager<panzer::Traits>& fm,
380 const panzer::PhysicsBlock& side_pb,
381 const panzer::LinearObjFactory<panzer::Traits>& lof,
382 const Teuchos::ParameterList& )
const
384 for (
auto& pair : _equ_dof_ns_pair)
386 this->registerScatterOperator(pair, fm, side_pb, lof);
389 if (_build_full_induction_model)
391 for (
auto& pair : _equ_dof_fim_pair)
394 pair, fm, side_pb, lof);
400 template<
class EvalType,
int NumSpaceDim>
401 void FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::
402 buildAndRegisterGatherAndOrientationEvaluators(
403 PHX::FieldManager<panzer::Traits>& fm,
404 const panzer::PhysicsBlock& side_pb,
405 const panzer::LinearObjFactory<panzer::Traits>& lof,
406 const Teuchos::ParameterList& user_data)
const
408 side_pb.buildAndRegisterGatherAndOrientationEvaluators(fm, lof, user_data);
412 template<
class EvalType,
int NumSpaceDim>
413 void FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::postRegistrationSetup(
414 typename panzer::Traits::SetupData, PHX::FieldManager<panzer::Traits>&)
419 template<
class EvalType,
int NumSpaceDim>
420 void FullInductionMHDBoundaryFlux<EvalType, NumSpaceDim>::evaluateFields(
421 typename panzer::Traits::EvalData)
430 #endif // end VERTEXCFD_BOUNDARYCONDITION_FULLINDUCTIONMHDBOUNDARYFLUX_IMPL_HPP