VertexCFD  0.0-dev
VertexCFD_BoundaryState_TurbulenceKOmegaWallResolved_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYSTATE_TURBULENCEKOMEGAWALLRESOLVED_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_TURBULENCEKOMEGAWALLRESOLVED_IMPL_HPP
3 
4 #include <Panzer_HierarchicParallelism.hpp>
5 
6 namespace VertexCFD
7 {
8 namespace BoundaryCondition
9 {
10 //---------------------------------------------------------------------------//
11 // Boundary condition for wall-resolved K-Omega simulations with ramping
12 //---------------------------------------------------------------------------//
13 template<class EvalType, class Traits>
14 TurbulenceKOmegaWallResolved<EvalType, Traits>::TurbulenceKOmegaWallResolved(
15  const panzer::IntegrationRule& ir, const Teuchos::ParameterList& bc_params)
16  : _boundary_k("BOUNDARY_turb_kinetic_energy", ir.dl_scalar)
17  , _boundary_w("BOUNDARY_turb_specific_dissipation_rate", ir.dl_scalar)
18  , _boundary_grad_k("BOUNDARY_GRAD_turb_kinetic_energy", ir.dl_vector)
19  , _boundary_grad_w("BOUNDARY_GRAD_turb_specific_dissipation_rate",
20  ir.dl_vector)
21  , _k("turb_kinetic_energy", ir.dl_scalar)
22  , _grad_k("GRAD_turb_kinetic_energy", ir.dl_vector)
23  , _grad_w("GRAD_turb_specific_dissipation_rate", ir.dl_vector)
24  , _normals("Side Normal", ir.dl_vector)
25  , _omega_wall(bc_params.get<double>("Omega Wall Value"))
26  , _omega_wall_init(_omega_wall)
27  , _omega_ramp_time(0.0)
28  , _num_grad_dim(ir.spatial_dimension)
29 {
30  // Check for ramping parameters
31  if (bc_params.isType<double>("Omega Wall Initial Value"))
32  {
33  _omega_wall_init = bc_params.get<double>("Omega Wall Initial Value");
34  _omega_ramp_time = bc_params.get<double>("Omega Ramp Time");
35  }
36 
37  // Add evaluated fields
38  this->addEvaluatedField(_boundary_k);
39  this->addEvaluatedField(_boundary_w);
40  this->addEvaluatedField(_boundary_grad_k);
41  this->addEvaluatedField(_boundary_grad_w);
42 
43  // Add dependent fields
44  this->addDependentField(_k);
45  this->addDependentField(_grad_k);
46  this->addDependentField(_grad_w);
47  this->addDependentField(_normals);
48 
49  this->setName("Boundary State Turbulence Model KOmegaWallResolved "
50  + std::to_string(_num_grad_dim) + "D");
51 }
52 
53 //---------------------------------------------------------------------------//
54 template<class EvalType, class Traits>
55 void TurbulenceKOmegaWallResolved<EvalType, Traits>::evaluateFields(
56  typename Traits::EvalData workset)
57 {
58  _time = workset.time;
59 
60  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
61  workset.num_cells);
62  Kokkos::parallel_for(this->getName(), policy, *this);
63 }
64 
65 //---------------------------------------------------------------------------//
66 template<class EvalType, class Traits>
67 KOKKOS_INLINE_FUNCTION void
68 TurbulenceKOmegaWallResolved<EvalType, Traits>::operator()(
69  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
70 {
71  const int cell = team.league_rank();
72  const int num_point = _grad_k.extent(1);
73  using std::pow;
74 
75  double omega_wall = _omega_wall;
76 
77  // Ramp omega wall value using logarithmic interpolation
78  if (_time < _omega_ramp_time)
79  {
80  omega_wall = pow(_omega_wall_init, 1.0 - _time / _omega_ramp_time)
81  * pow(_omega_wall, _time / _omega_ramp_time);
82  }
83 
84  Kokkos::parallel_for(
85  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
86  // Assign boundary values
87  _boundary_k(cell, point) = _k(cell, point);
88  _boundary_w(cell, point) = omega_wall;
89 
90  // Assign boundary gradients
91  for (int d = 0; d < _num_grad_dim; ++d)
92  {
93  _boundary_grad_k(cell, point, d) = _grad_k(cell, point, d);
94  _boundary_grad_w(cell, point, d) = _grad_w(cell, point, d);
95  }
96 
97  // Subtract wall normal component from grad(k)
98  for (int d = 0; d < _num_grad_dim; ++d)
99  {
100  for (int grad_dim = 0; grad_dim < _num_grad_dim; ++grad_dim)
101  {
102  _boundary_grad_k(cell, point, d)
103  -= _grad_k(cell, point, grad_dim)
104  * _normals(cell, point, grad_dim)
105  * _normals(cell, point, d);
106  }
107  }
108  });
109 }
110 
111 //---------------------------------------------------------------------------//
112 
113 } // end namespace BoundaryCondition
114 } // end namespace VertexCFD
115 
116 #endif // end VERTEXCFD_BOUNDARYSTATE_TURBULENCEKOMEGAWALLRESOLVED_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23