VertexCFD  0.0-dev
VertexCFD_BoundaryState_IncompressibleLaminarFlow_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_VectorField.hpp"
5 
6 #include <Panzer_HierarchicParallelism.hpp>
7 #include <Panzer_Workset_Utilities.hpp>
8 
9 namespace VertexCFD
10 {
11 namespace BoundaryCondition
12 {
13 //---------------------------------------------------------------------------//
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",
22  ir.dl_vector)
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())
36 {
37  // Get origin coordinates if specified
38  if (bc_params.isType<Teuchos::Array<double>>("Origin Coordinates"))
39  {
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];
44  }
45  else
46  {
47  for (int dim = 0; dim < num_space_dim; ++dim)
48  _origin_coord[dim] = 0.0;
49  }
50 
51  if (continuity_model_name == "AC")
52  {
53  _continuity_model = ContinuityModel::AC;
54  }
55  else if (continuity_model_name == "EDAC")
56  {
57  _continuity_model = ContinuityModel::EDAC;
58  }
59 
60  // Add evaluated fields
61  this->addEvaluatedField(_boundary_lagrange_pressure);
62  if (_continuity_model == ContinuityModel::EDAC)
63  this->addEvaluatedField(_boundary_grad_lagrange_pressure);
64  if (_solve_temp)
65  {
66  _T_bc = bc_params.get<double>("Temperature");
67  this->addEvaluatedField(_boundary_temperature);
68  this->addEvaluatedField(_boundary_grad_temperature);
69  }
70  Utils::addEvaluatedVectorField(
71  *this, ir.dl_scalar, _boundary_velocity, "BOUNDARY_velocity_");
72 
73  Utils::addEvaluatedVectorField(*this,
74  ir.dl_vector,
75  _boundary_grad_velocity,
76  "BOUNDARY_GRAD_velocity_");
77 
78  // Add dependent fields
79  this->addDependentField(_normals);
80  this->addDependentField(_lagrange_pressure);
81  if (_continuity_model == ContinuityModel::EDAC)
82  this->addDependentField(_grad_lagrange_pressure);
83  if (_solve_temp)
84  this->addDependentField(_grad_temperature);
85  Utils::addDependentVectorField(
86  *this, ir.dl_vector, _grad_velocity, "GRAD_velocity_");
87 
88  this->setName("Boundary State Incompressible Laminar Flow "
89  + std::to_string(num_space_dim) + "D");
90 }
91 
92 //---------------------------------------------------------------------------//
93 template<class EvalType, class Traits, int NumSpaceDim>
94 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
95  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
96 {
97  _ir_index = panzer::getIntegrationRuleIndex(_ir_degree, (*sd.worksets_)[0]);
98 }
99 
100 //---------------------------------------------------------------------------//
101 template<class EvalType, class Traits, int NumSpaceDim>
102 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::evaluateFields(
103  typename Traits::EvalData workset)
104 {
105  _ip_coords = workset.int_rules[_ir_index]->ip_coordinates;
106  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
107  workset.num_cells);
108  Kokkos::parallel_for(this->getName(), policy, *this);
109 }
110 
111 //---------------------------------------------------------------------------//
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
116 {
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);
120 
121  Kokkos::parallel_for(
122  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
123  using std::pow;
124  // Set lagrange pressure
125  _boundary_lagrange_pressure(cell, point)
126  = _lagrange_pressure(cell, point);
127 
128  if (_solve_temp)
129  _boundary_temperature(cell, point) = _T_bc;
130 
131  // Set velocity and gradients at boundaries.
132  for (int d = 0; d < num_grad_dim; ++d)
133  {
134  if (_continuity_model == ContinuityModel::EDAC)
135  {
136  _boundary_grad_lagrange_pressure(cell, point, d)
137  = _grad_lagrange_pressure(cell, point, d);
138  }
139 
140  for (int vel_dim = 0; vel_dim < num_space_dim; ++vel_dim)
141  {
142  // Calculate boundary velocity and gradient.
143  // Negative wall normal is used to show inward direction.
144  _boundary_velocity[vel_dim](cell, point) = 0.0;
145  for (int dim = 0; dim < num_space_dim; ++dim)
146  {
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],
152  2)
153  / (_radius * _radius));
154  }
155 
156  _boundary_grad_velocity[vel_dim](cell, point, d)
157  = _grad_velocity[vel_dim](cell, point, d);
158  }
159  if (_solve_temp)
160  {
161  _boundary_grad_temperature(cell, point, d)
162  = _grad_temperature(cell, point, d);
163  }
164  }
165  });
166 }
167 
168 //---------------------------------------------------------------------------//
169 
170 } // end namespace BoundaryCondition
171 } // end namespace VertexCFD
172 
173 #endif // VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23