1 #ifndef VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
4 #include "utils/VertexCFD_Utils_VectorField.hpp"
6 #include <Panzer_HierarchicParallelism.hpp>
7 #include <Panzer_Workset_Utilities.hpp>
11 namespace BoundaryCondition
14 template<
class EvalType,
class Traits,
int NumSpaceDim>
15 IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::IncompressibleLaminarFlow(
16 const panzer::IntegrationRule& ir,
17 const Teuchos::ParameterList& fluid_params,
18 const Teuchos::ParameterList& bc_params,
19 const std::string& continuity_model_name)
20 : _boundary_lagrange_pressure(
"BOUNDARY_lagrange_pressure", ir.dl_scalar)
21 , _boundary_grad_lagrange_pressure(
"BOUNDARY_GRAD_lagrange_pressure",
23 , _boundary_temperature(
"BOUNDARY_temperature", ir.dl_scalar)
24 , _boundary_grad_temperature(
"BOUNDARY_GRAD_temperature", ir.dl_vector)
25 , _ir_degree(ir.cubature_degree)
26 , _lagrange_pressure(
"lagrange_pressure", ir.dl_scalar)
27 , _grad_lagrange_pressure(
"GRAD_lagrange_pressure", ir.dl_vector)
28 , _grad_temperature(
"GRAD_temperature", ir.dl_vector)
29 , _normals(
"Side Normal", ir.dl_vector)
30 , _solve_temp(fluid_params.get<bool>(
"Build Temperature Equation"))
31 , _continuity_model_name(continuity_model_name)
32 , _radius(bc_params.get<double>(
"Characteristic Radius"))
33 , _vel_avg(bc_params.get<double>(
"Average velocity"))
34 , _vel_max(num_space_dim == 2 ? 3.0 / 2.0 * _vel_avg : 2.0 * _vel_avg)
35 , _T_bc(std::numeric_limits<double>::quiet_NaN())
38 if (bc_params.isType<Teuchos::Array<double>>(
"Origin Coordinates"))
40 const auto origin_coord
41 = bc_params.get<Teuchos::Array<double>>(
"Origin Coordinates");
42 for (
int dim = 0; dim < num_space_dim; ++dim)
43 _origin_coord[dim] = origin_coord[dim];
47 for (
int dim = 0; dim < num_space_dim; ++dim)
48 _origin_coord[dim] = 0.0;
51 if (continuity_model_name ==
"AC")
53 _continuity_model = ContinuityModel::AC;
55 else if (continuity_model_name ==
"EDAC")
57 _continuity_model = ContinuityModel::EDAC;
61 this->addEvaluatedField(_boundary_lagrange_pressure);
62 if (_continuity_model == ContinuityModel::EDAC)
63 this->addEvaluatedField(_boundary_grad_lagrange_pressure);
66 _T_bc = bc_params.get<
double>(
"Temperature");
67 this->addEvaluatedField(_boundary_temperature);
68 this->addEvaluatedField(_boundary_grad_temperature);
70 Utils::addEvaluatedVectorField(
71 *
this, ir.dl_scalar, _boundary_velocity,
"BOUNDARY_velocity_");
73 Utils::addEvaluatedVectorField(*
this,
75 _boundary_grad_velocity,
76 "BOUNDARY_GRAD_velocity_");
79 this->addDependentField(_normals);
80 this->addDependentField(_lagrange_pressure);
81 if (_continuity_model == ContinuityModel::EDAC)
82 this->addDependentField(_grad_lagrange_pressure);
84 this->addDependentField(_grad_temperature);
85 Utils::addDependentVectorField(
86 *
this, ir.dl_vector, _grad_velocity,
"GRAD_velocity_");
88 this->setName(
"Boundary State Incompressible Laminar Flow "
89 + std::to_string(num_space_dim) +
"D");
93 template<
class EvalType,
class Traits,
int NumSpaceDim>
94 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
95 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
97 _ir_index = panzer::getIntegrationRuleIndex(_ir_degree, (*sd.worksets_)[0]);
101 template<
class EvalType,
class Traits,
int NumSpaceDim>
102 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::evaluateFields(
103 typename Traits::EvalData workset)
105 _ip_coords = workset.int_rules[_ir_index]->ip_coordinates;
106 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
108 Kokkos::parallel_for(this->getName(), policy, *
this);
112 template<
class EvalType,
class Traits,
int NumSpaceDim>
113 KOKKOS_INLINE_FUNCTION
void
114 IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::operator()(
115 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
117 const int cell = team.league_rank();
118 const int num_point = _lagrange_pressure.extent(1);
119 const int num_grad_dim = _boundary_grad_velocity[0].extent(2);
121 Kokkos::parallel_for(
122 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
125 _boundary_lagrange_pressure(cell, point)
126 = _lagrange_pressure(cell, point);
129 _boundary_temperature(cell, point) = _T_bc;
132 for (
int d = 0; d < num_grad_dim; ++d)
134 if (_continuity_model == ContinuityModel::EDAC)
136 _boundary_grad_lagrange_pressure(cell, point, d)
137 = _grad_lagrange_pressure(cell, point, d);
140 for (
int vel_dim = 0; vel_dim < num_space_dim; ++vel_dim)
144 _boundary_velocity[vel_dim](cell, point) = 0.0;
145 for (
int dim = 0; dim < num_space_dim; ++dim)
147 _boundary_velocity[vel_dim](cell, point)
148 -= _vel_max * _normals(cell, point, vel_dim)
149 * (1.0 / num_space_dim
150 - pow(_ip_coords(cell, point, dim)
151 - _origin_coord[dim],
153 / (_radius * _radius));
156 _boundary_grad_velocity[vel_dim](cell, point, d)
157 = _grad_velocity[vel_dim](cell, point, d);
161 _boundary_grad_temperature(cell, point, d)
162 = _grad_temperature(cell, point, d);
173 #endif // VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP