VertexCFD  0.0-dev
VertexCFD_BoundaryState_IncompressibleCavityLid_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLECAVITYLID_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLECAVITYLID_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 IncompressibleCavityLid<EvalType, Traits, NumSpaceDim>::IncompressibleCavityLid(
16  const panzer::IntegrationRule& ir,
17  const Teuchos::ParameterList& fluid_params,
18  const Teuchos::ParameterList& bc_params,
19  const bool is_edac)
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  , _solve_temp(fluid_params.get<bool>("Build Temperature Equation"))
30  , _is_edac(is_edac)
31  , _wall_dir(bc_params.get<int>("Wall Normal Direction"))
32  , _vel_dir(bc_params.get<int>("Velocity Direction"))
33  , _h(bc_params.get<double>("Half Width"))
34  , _u_wall(bc_params.get<double>("Wall Velocity"))
35  , _T_bc(std::numeric_limits<double>::quiet_NaN())
36 {
37  // Check that dimensions make sense
38  if (_wall_dir >= num_space_dim)
39  {
40  const std::string msg
41  = "Wall normal direction greater than "
42  "number of solution dimensions in Cavity Lid boundary "
43  "condition.";
44 
45  throw std::runtime_error(msg);
46  }
47  if (_vel_dir >= num_space_dim)
48  {
49  const std::string msg
50  = "Velocity direction greater than "
51  "number of solution dimensions in Cavity Lid boundary "
52  "condition.";
53 
54  throw std::runtime_error(msg);
55  }
56  if (_wall_dir == _vel_dir)
57  {
58  const std::string msg
59  = "Velocity direction is same as wall normal in "
60  "Cavity Lid boundary condition.";
61 
62  throw std::runtime_error(msg);
63  }
64 
65  // Add evaluated fields
66  this->addEvaluatedField(_boundary_lagrange_pressure);
67  if (_is_edac)
68  this->addEvaluatedField(_boundary_grad_lagrange_pressure);
69  if (_solve_temp)
70  {
71  _T_bc = bc_params.get<double>("Temperature");
72  this->addEvaluatedField(_boundary_temperature);
73  this->addEvaluatedField(_boundary_grad_temperature);
74  }
75  Utils::addEvaluatedVectorField(
76  *this, ir.dl_scalar, _boundary_velocity, "BOUNDARY_velocity_");
77 
78  Utils::addEvaluatedVectorField(*this,
79  ir.dl_vector,
80  _boundary_grad_velocity,
81  "BOUNDARY_GRAD_velocity_");
82 
83  // Add dependent fields
84  this->addDependentField(_lagrange_pressure);
85  if (_is_edac)
86  this->addDependentField(_grad_lagrange_pressure);
87  if (_solve_temp)
88  this->addDependentField(_grad_temperature);
89  Utils::addDependentVectorField(
90  *this, ir.dl_vector, _grad_velocity, "GRAD_velocity_");
91 
92  this->setName("Boundary State Incompressible Cavity Lid "
93  + std::to_string(num_space_dim) + "D");
94 }
95 
96 //---------------------------------------------------------------------------//
97 template<class EvalType, class Traits, int NumSpaceDim>
98 void IncompressibleCavityLid<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
99  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
100 {
101  _ir_index = panzer::getIntegrationRuleIndex(_ir_degree, (*sd.worksets_)[0]);
102 }
103 
104 //---------------------------------------------------------------------------//
105 template<class EvalType, class Traits, int NumSpaceDim>
106 void IncompressibleCavityLid<EvalType, Traits, NumSpaceDim>::evaluateFields(
107  typename Traits::EvalData workset)
108 {
109  _ip_coords = workset.int_rules[_ir_index]->ip_coordinates;
110  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
111  workset.num_cells);
112  Kokkos::parallel_for(this->getName(), policy, *this);
113 }
114 
115 //---------------------------------------------------------------------------//
116 template<class EvalType, class Traits, int NumSpaceDim>
117 KOKKOS_INLINE_FUNCTION void
118 IncompressibleCavityLid<EvalType, Traits, NumSpaceDim>::operator()(
119  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
120 {
121  const int cell = team.league_rank();
122  const int num_point = _lagrange_pressure.extent(1);
123  const int num_grad_dim = _boundary_grad_velocity[0].extent(2);
124 
125  using std::pow;
126 
127  Kokkos::parallel_for(
128  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
129  // Set lagrange pressure
130  _boundary_lagrange_pressure(cell, point)
131  = _lagrange_pressure(cell, point);
132 
133  // Set boundary values for velocity components
134  for (int vel_dim = 0; vel_dim < num_space_dim; ++vel_dim)
135  {
136  if (vel_dim == _vel_dir)
137  {
138  _boundary_velocity[vel_dim](cell, point) = _u_wall;
139 
140  for (int dim = 0; dim < num_space_dim; ++dim)
141  {
142  if (dim != _wall_dir)
143  {
144  _boundary_velocity[vel_dim](cell, point) *= pow(
145  1.0
146  - pow(_ip_coords(cell, point, dim) / _h,
147  18.0),
148  2.0);
149  }
150  }
151  }
152  else
153  {
154  _boundary_velocity[vel_dim](cell, point) = 0.0;
155  }
156  }
157 
158  if (_solve_temp)
159  _boundary_temperature(cell, point) = _T_bc;
160 
161  // Set gradients at boundaries.
162  for (int d = 0; d < num_grad_dim; ++d)
163  {
164  if (_is_edac)
165  {
166  _boundary_grad_lagrange_pressure(cell, point, d)
167  = _grad_lagrange_pressure(cell, point, d);
168  }
169 
170  for (int vel_dim = 0; vel_dim < num_space_dim; ++vel_dim)
171  {
172  _boundary_grad_velocity[vel_dim](cell, point, d)
173  = _grad_velocity[vel_dim](cell, point, d);
174  }
175 
176  if (_solve_temp)
177  {
178  _boundary_grad_temperature(cell, point, d)
179  = _grad_temperature(cell, point, d);
180  }
181  }
182  });
183 }
184 
185 //---------------------------------------------------------------------------//
186 
187 } // end namespace BoundaryCondition
188 } // end namespace VertexCFD
189 
190 #endif // VERTEXCFD_BOUNDARYSTATE_INCOMPRESSIBLECAVITYLID_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23