1 #ifndef VERTEXCFD_BOUNDARYCONDITION_INCOMPRESSIBLEBOUNDARYFLUX_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYCONDITION_INCOMPRESSIBLEBOUNDARYFLUX_IMPL_HPP
4 #include "VertexCFD_BoundaryState_ViscousGradient.hpp"
5 #include "VertexCFD_BoundaryState_ViscousPenaltyParameter.hpp"
6 #include "VertexCFD_Integrator_BoundaryGradBasisDotVector.hpp"
8 #include "closure_models/VertexCFD_Closure_ExternalMagneticField.hpp"
9 #include "closure_models/VertexCFD_Closure_VariableConvectiveFlux.hpp"
10 #include "closure_models/VertexCFD_Closure_VariableDiffusionFlux.hpp"
12 #include "incompressible_solver/boundary_conditions/VertexCFD_BoundaryState_IncompressibleWallFunctionStress.hpp"
13 #include "incompressible_solver/boundary_conditions/VertexCFD_IncompressibleBoundaryState_Factory.hpp"
15 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleConvectiveFlux.hpp"
16 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleGradDiv.hpp"
17 #include "incompressible_solver/closure_models/VertexCFD_Closure_IncompressibleViscousFlux.hpp"
19 #include "incompressible_solver/fluid_properties/VertexCFD_Closure_IncompressibleFluidProperties.hpp"
21 #include "induction_less_mhd_solver/boundary_conditions/VertexCFD_ElectricPotentialBoundaryState_Factory.hpp"
22 #include "induction_less_mhd_solver/closure_models/VertexCFD_Closure_ElectricPotentialCrossProductFlux.hpp"
23 #include "induction_less_mhd_solver/closure_models/VertexCFD_Closure_ElectricPotentialDiffusionFlux.hpp"
25 #include "turbulence_models/boundary_conditions/VertexCFD_BoundaryState_TurbulenceBoundaryEddyViscosity.hpp"
26 #include "turbulence_models/boundary_conditions/VertexCFD_TurbulenceBoundaryState_Factory.hpp"
28 #include <Panzer_DOF.hpp>
29 #include <Panzer_DOFGradient.hpp>
30 #include <Panzer_DotProduct.hpp>
31 #include <Panzer_Integrator_BasisTimesScalar.hpp>
32 #include <Panzer_Normals.hpp>
33 #include <Panzer_Sum.hpp>
35 #include <Phalanx_DataLayout.hpp>
36 #include <Phalanx_DataLayout_MDALayout.hpp>
37 #include <Phalanx_MDField.hpp>
45 namespace BoundaryCondition
48 template<
class EvalType,
int NumSpaceDim>
49 IncompressibleBoundaryFlux<EvalType, NumSpaceDim>::IncompressibleBoundaryFlux(
50 const panzer::BC& bc,
const Teuchos::RCP<panzer::GlobalData>& global_data)
51 : BoundaryFluxBase<EvalType, NumSpaceDim>(bc, global_data)
55 _internal_interface = bc.params()->isType<
bool>(
"Fluid/Solid Interface")
56 ? bc.params()->get<
bool>(
"Fluid/Solid Interface")
61 template<
class EvalType,
int NumSpaceDim>
63 const panzer::PhysicsBlock& side_pb,
64 const Teuchos::ParameterList& )
67 this->_bc_params = *(this->m_bc.params());
69 this->_bc_params, side_pb, this->_model_id, this->_side_pb_list);
72 const std::string continuity_model
73 = this->_side_pb_list.template isType<std::string>(
"Continuity Model")
74 ? this->_side_pb_list.template get<std::string>(
78 if (continuity_model ==
"AC")
80 _continuity_model = ConModel::AC;
82 else if (continuity_model ==
"EDAC")
84 _continuity_model = ConModel::EDAC;
86 else if (continuity_model ==
"EDACTempNC")
88 _continuity_model = ConModel::EDACTempNC;
93 = this->_side_pb_list.template get<bool>(
"Build Viscous Flux");
96 _build_temp_equ = this->_side_pb_list.template isType<bool>(
97 "Build Temperature Equation")
98 ? this->_side_pb_list.template get<bool>(
99 "Build Temperature Equation")
103 _build_ind_less_equ = this->_side_pb_list.template isType<bool>(
104 "Build Inductionless MHD Equation")
105 ? this->_side_pb_list.template get<bool>(
106 "Build Inductionless MHD Equation")
111 if (_internal_interface)
113 _build_temp_equ =
false;
114 _build_ind_less_equ =
false;
118 _turbulence_model_name
119 = this->_side_pb_list.template isType<std::string>(
"Turbulence Model")
120 ? this->_side_pb_list.template get<std::string>(
122 :
"No Turbulence Model";
123 _turbulence_model = _turbulence_model_name ==
"No Turbulence Model" ? false
129 _equ_dof_ns_pair.insert({
"continuity",
"lagrange_pressure"});
130 for (
int d = 0; d < num_space_dim; ++d)
132 const std::string ds = std::to_string(d);
133 _equ_dof_ns_pair.insert({
"momentum_" + ds,
"velocity_" + ds});
136 _equ_dof_ns_pair.insert({
"energy",
"temperature"});
139 if (_build_ind_less_equ)
141 _equ_dof_ep_pair.insert(
142 {
"electric_potential_equation",
"electric_potential"});
146 if (_turbulence_model)
148 if (std::string::npos
149 != _turbulence_model_name.find(
"Spalart-Allmaras"))
151 _equ_dof_tm_pair.insert(
152 {
"spalart_allmaras_equation",
"spalart_allmaras_variable"});
154 else if (std::string::npos != _turbulence_model_name.find(
"K-Epsilon"))
156 _equ_dof_tm_pair.insert(
157 {
"turb_kinetic_energy_equation",
"turb_kinetic_energy"});
158 _equ_dof_tm_pair.insert(
159 {
"turb_dissipation_rate_equation",
"turb_dissipation_rate"});
161 else if (std::string::npos != _turbulence_model_name.find(
"K-Omega"))
163 _equ_dof_tm_pair.insert(
164 {
"turb_kinetic_energy_equation",
"turb_kinetic_energy"});
165 _equ_dof_tm_pair.insert({
"turb_specific_dissipation_rate_equation",
166 "turb_specific_dissipation_rate"});
168 else if (std::string::npos != _turbulence_model_name.find(
"SST"))
170 _equ_dof_tm_pair.insert(
171 {
"turb_kinetic_energy_equation",
"turb_kinetic_energy"});
172 _equ_dof_tm_pair.insert({
"turb_specific_dissipation_rate_equation",
173 "turb_specific_dissipation_rate"});
175 else if (std::string::npos != _turbulence_model_name.find(
"K-Tau"))
177 _equ_dof_tm_pair.insert(
178 {
"turb_kinetic_energy_equation",
"turb_kinetic_energy"});
179 _equ_dof_tm_pair.insert({
"turb_specific_dissipation_rate_equation",
180 "turb_specific_dissipation_rate"});
186 this->initialize(side_pb, _equ_dof_ns_pair);
190 template<
class EvalType,
int NumSpaceDim>
192 PHX::FieldManager<panzer::Traits>& fm,
193 const panzer::PhysicsBlock& side_pb,
194 const panzer::ClosureModelFactory_TemplateManager<panzer::Traits>&,
195 const Teuchos::ParameterList& closure_models,
196 const Teuchos::ParameterList& user_data)
const
199 std::unordered_map<std::string, std::vector<std::string>> eq_vct_map;
202 const auto ir = this->integrationRule();
205 for (
auto& pair : _equ_dof_ns_pair)
207 this->registerDOFsGradient(fm, side_pb, pair.second);
211 for (
auto& pair : _equ_dof_ep_pair)
213 this->registerDOFsGradient(fm, side_pb, pair.second);
217 for (
auto& pair : _equ_dof_tm_pair)
219 this->registerDOFsGradient(fm, side_pb, pair.second);
223 this->registerSideNormals(fm, side_pb);
226 const std::string stabilization_method
227 = this->_side_pb_list.template get<std::string>(
228 "Stabilization Method");
232 Teuchos::ParameterList stability_param_list;
233 if (closure_models.sublist(this->_model_id).isSublist(
"Stability Parameters"))
235 stability_param_list = closure_models.sublist(this->_model_id)
236 .sublist(
"Stability Parameters");
240 Teuchos::ParameterList fluid_prop_list
241 = closure_models.sublist(this->_model_id).sublist(
"Fluid Properties");
243 const bool build_buoyancy
244 = fluid_prop_list.isType<
bool>(
"Build Buoyancy Source")
245 ? fluid_prop_list.get<
bool>(
"Build Buoyancy Source")
248 fluid_prop_list.set<
bool>(
"Build Temperature Equation", _build_temp_equ);
249 fluid_prop_list.set<
bool>(
"Build Buoyancy Source", build_buoyancy);
250 fluid_prop_list.set<
bool>(
"Build Inductionless MHD Equation",
251 _build_ind_less_equ);
253 auto eval = Teuchos::rcp(
254 new FluidProperties::IncompressibleFluidProperties<EvalType,
256 *ir, fluid_prop_list));
257 this->
template registerEvaluator<EvalType>(fm, eval);
261 const auto ns_bc_sublist = this->_bc_params.isSublist(
"Navier-Stokes")
262 ? this->_bc_params.sublist(
"Navier-Stokes")
264 auto incomp_ns_boundary_state_op = IncompressibleBoundaryStateFactory<
267 num_space_dim>::create(*ir, ns_bc_sublist, fluid_prop_list);
268 this->
template registerEvaluator<EvalType>(fm, incomp_ns_boundary_state_op);
271 if (_build_ind_less_equ)
273 const auto ep_bc_sublist
274 = this->_bc_params.sublist(
"Electric Potential");
275 auto ep_boundary_state_op = ElectricPotentialBoundaryStateFactory<
278 num_space_dim>::create(*ir, ep_bc_sublist, user_data);
279 this->
template registerEvaluator<EvalType>(fm, ep_boundary_state_op);
285 auto convective_flux_op = Teuchos::rcp(
286 new ClosureModel::IncompressibleConvectiveFlux<EvalType,
289 *ir, fluid_prop_list,
"BOUNDARY_",
"BOUNDARY_"));
290 this->
template registerEvaluator<EvalType>(fm, convective_flux_op);
292 for (
auto& pair : _equ_dof_ns_pair)
294 if (_continuity_model == ConModel::EDACTempNC
295 && std::string::npos != pair.first.find(
"energy"))
299 this->registerConvectionTypeFluxOperator(
300 pair, eq_vct_map,
"CONVECTIVE", fm, side_pb, 1.0);
304 if (_build_ind_less_equ)
307 auto cross_product_flux_op = Teuchos::rcp(
308 new ClosureModel::ElectricPotentialCrossProductFlux<EvalType,
311 *ir,
"BOUNDARY_",
"BOUNDARY_"));
312 this->
template registerEvaluator<EvalType>(fm, cross_product_flux_op);
315 auto ext_magn_field_op = Teuchos::rcp(
316 new ClosureModel::ExternalMagneticField<EvalType, panzer::Traits>(
318 this->
template registerEvaluator<EvalType>(fm, ext_magn_field_op);
320 for (
auto& pair : _equ_dof_ep_pair)
322 this->registerConvectionTypeFluxOperator(
323 pair, eq_vct_map,
"ELECTRIC_POTENTIAL", fm, side_pb, 1.0);
330 if (_build_viscous_flux)
333 std::unordered_map<std::string, std::string> _equ_dof_ns_visc_pair
337 const Teuchos::ParameterList ns_bc_params
338 = this->_bc_params.isSublist(
"Navier-Stokes")
339 ? this->_bc_params.sublist(
"Navier-Stokes")
341 const std::string bc_type = ns_bc_params.get<std::string>(
"Type");
343 const bool is_wall_func
344 = std::string::npos != bc_type.find(
"Wall Function") ? true :
false;
352 for (
auto eqn = _equ_dof_ns_visc_pair.begin();
353 eqn != _equ_dof_ns_visc_pair.end();)
355 if (std::string::npos != eqn->first.find(
"momentum"))
357 eqn = _equ_dof_ns_visc_pair.erase(eqn);
366 const std::string wall_func_stress_prefix =
"wall_func_stress_";
368 const auto wall_func_stress_op = Teuchos::rcp(
369 new BoundaryCondition::IncompressibleWallFunctionStress<
372 num_space_dim>(*ir, wall_func_stress_prefix));
374 this->
template registerEvaluator<EvalType>(fm, wall_func_stress_op);
377 const auto add_wall_stress_op = [&,
this](
378 const std::string& eqn_name,
379 const std::string& dof_name) {
381 const auto basis_layout
382 = this->getBasisIRLayout(side_pb, dof_name);
385 const std::string stress_residual_name
386 =
"WALL_FUNC_STRESS_RESIDUAL_" + eqn_name;
388 const auto shear_stress_op = Teuchos::rcp(
389 new panzer::Integrator_BasisTimesScalar<EvalType,
391 panzer::EvaluatorStyle::EVALUATES,
392 stress_residual_name,
393 wall_func_stress_prefix + eqn_name,
398 this->
template registerEvaluator<EvalType>(fm, shear_stress_op);
402 for (
auto& pair : _equ_dof_ns_pair)
404 if (std::string::npos != pair.first.find(
"momentum"))
406 add_wall_stress_op(pair.first, pair.second);
407 eq_vct_map[pair.first].push_back(
408 "WALL_FUNC_STRESS_RESIDUAL_" + pair.first);
414 for (
auto& pair : _equ_dof_ns_pair)
416 this->registerPenaltyAndViscousGradientOperator(
417 pair, fm, side_pb, this->_bc_params);
421 for (
auto& pair : this->bnd_prefix)
424 const std::string flux_prefix = pair.first;
425 const std::string gradient_prefix = pair.second;
427 auto viscous_flux_op = Teuchos::rcp(
428 new ClosureModel::IncompressibleViscousFlux<EvalType,
437 this->
template registerEvaluator<EvalType>(fm, viscous_flux_op);
439 if (std::string::npos != stabilization_method.find(
"Grad-Div"))
441 auto div_grad_op = Teuchos::rcp(
442 new ClosureModel::IncompressibleGradDiv<EvalType,
445 *ir, stability_param_list, flux_prefix, gradient_prefix));
446 this->
template registerEvaluator<EvalType>(fm, div_grad_op);
451 for (
auto& pair : _equ_dof_ns_visc_pair)
453 this->registerViscousTypeFluxOperator(
454 pair, eq_vct_map,
"VISCOUS", fm, side_pb, 1.0);
459 if (_build_ind_less_equ)
462 for (
auto& pair : _equ_dof_ep_pair)
464 this->registerPenaltyAndViscousGradientOperator(
465 pair, fm, side_pb, this->_bc_params);
469 for (
auto& pair : this->bnd_prefix)
472 const std::string flux_prefix = pair.first;
473 const std::string gradient_prefix = pair.second;
475 auto diffusion_flux_op = Teuchos::rcp(
476 new ClosureModel::ElectricPotentialDiffusionFlux<EvalType,
478 *ir, flux_prefix, gradient_prefix));
479 this->
template registerEvaluator<EvalType>(fm, diffusion_flux_op);
483 for (
auto& pair : _equ_dof_ep_pair)
485 this->registerViscousTypeFluxOperator(
486 pair, eq_vct_map,
"ELECTRIC_POTENTIAL", fm, side_pb, 1.0);
493 if (_turbulence_model)
496 const auto turb_bc_params
497 = _equ_dof_tm_pair.empty()
498 ? Teuchos::ParameterList()
499 : this->_bc_params.sublist(
"Turbulence Model");
502 for (
auto& pair : this->bnd_prefix)
505 const std::string flux_prefix = pair.first;
508 auto eddy_visc_op = Teuchos::rcp(
509 new TurbulenceBoundaryEddyViscosity<EvalType, panzer::Traits>(
510 *ir, turb_bc_params, flux_prefix));
512 this->
template registerEvaluator<EvalType>(fm, eddy_visc_op);
517 const auto tm_boundary_state_op = TurbulenceBoundaryStateFactory<
520 num_space_dim>::create(*ir,
523 _turbulence_model_name);
525 for (std::size_t i = 0; i < tm_boundary_state_op.size(); ++i)
527 this->
template registerEvaluator<EvalType>(
528 fm, tm_boundary_state_op[i]);
532 for (
auto& pair_tm : _equ_dof_tm_pair)
534 Teuchos::ParameterList tm_name_list;
535 tm_name_list.set(
"Field Name", pair_tm.second);
536 tm_name_list.set(
"Equation Name", pair_tm.first);
539 const auto convective_flux_op = Teuchos::rcp(
540 new ClosureModel::VariableConvectiveFlux<EvalType,
543 *ir, tm_name_list,
"BOUNDARY_",
"BOUNDARY_"));
544 this->
template registerEvaluator<EvalType>(fm, convective_flux_op);
546 BoundaryFluxBase<EvalType, NumSpaceDim>::registerConvectionTypeFluxOperator(
547 pair_tm, eq_vct_map,
"CONVECTIVE", fm, side_pb, 1.0);
551 BoundaryFluxBase<EvalType, NumSpaceDim>::
552 registerPenaltyAndViscousGradientOperator(
553 pair_tm, fm, side_pb, this->_bc_params);
556 for (
auto& pair_bnd :
557 BoundaryFluxBase<EvalType, NumSpaceDim>::bnd_prefix)
559 const std::string flux_prefix = pair_bnd.first;
560 const std::string gradient_prefix = pair_bnd.second;
562 const auto diffusion_flux_op = Teuchos::rcp(
563 new ClosureModel::VariableDiffusionFlux<EvalType,
565 *ir, tm_name_list, flux_prefix, gradient_prefix));
566 this->
template registerEvaluator<EvalType>(fm,
571 BoundaryFluxBase<EvalType, NumSpaceDim>::registerViscousTypeFluxOperator(
572 pair_tm, eq_vct_map,
"DIFFUSION", fm, side_pb, 1.0);
577 for (
auto& pair : _equ_dof_ns_pair)
579 this->registerResidual(pair, eq_vct_map, fm, side_pb);
583 for (
auto& pair : _equ_dof_ep_pair)
585 this->registerResidual(pair, eq_vct_map, fm, side_pb);
589 for (
auto& pair : _equ_dof_tm_pair)
591 BoundaryFluxBase<EvalType, NumSpaceDim>::registerResidual(
592 pair, eq_vct_map, fm, side_pb);
597 template<
class EvalType,
int NumSpaceDim>
598 void IncompressibleBoundaryFlux<EvalType, NumSpaceDim>::
599 buildAndRegisterScatterEvaluators(
600 PHX::FieldManager<panzer::Traits>& fm,
601 const panzer::PhysicsBlock& side_pb,
602 const panzer::LinearObjFactory<panzer::Traits>& lof,
603 const Teuchos::ParameterList& )
const
605 for (
auto& pair : _equ_dof_ns_pair)
607 this->registerScatterOperator(pair, fm, side_pb, lof);
610 for (
auto& pair : _equ_dof_ep_pair)
612 this->registerScatterOperator(pair, fm, side_pb, lof);
615 for (
auto& pair : _equ_dof_tm_pair)
618 pair, fm, side_pb, lof);
623 template<
class EvalType,
int NumSpaceDim>
624 void IncompressibleBoundaryFlux<EvalType, NumSpaceDim>::
625 buildAndRegisterGatherAndOrientationEvaluators(
626 PHX::FieldManager<panzer::Traits>& fm,
627 const panzer::PhysicsBlock& side_pb,
628 const panzer::LinearObjFactory<panzer::Traits>& lof,
629 const Teuchos::ParameterList& user_data)
const
631 side_pb.buildAndRegisterGatherAndOrientationEvaluators(fm, lof, user_data);
635 template<
class EvalType,
int NumSpaceDim>
636 void IncompressibleBoundaryFlux<EvalType, NumSpaceDim>::postRegistrationSetup(
637 typename panzer::Traits::SetupData, PHX::FieldManager<panzer::Traits>&)
642 template<
class EvalType,
int NumSpaceDim>
643 void IncompressibleBoundaryFlux<EvalType, NumSpaceDim>::evaluateFields(
644 typename panzer::Traits::EvalData)
653 #endif // end VERTEXCFD_BOUNDARYCONDITION_INCOMPRESSIBLEBOUNDARYFLUX_IMPL_HPP