VertexCFD  0.0-dev
VertexCFD_BoundaryState_ViscousPenaltyParameter_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYSTATE_VISCOUSPENALTYPARAMETER_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_VISCOUSPENALTYPARAMETER_IMPL_HPP
3 
4 #include "Panzer_Workset_Utilities.hpp"
5 #include <Panzer_HierarchicParallelism.hpp>
6 
7 #include <cmath>
8 
9 namespace VertexCFD
10 {
11 namespace BoundaryCondition
12 {
13 //---------------------------------------------------------------------------//
14 template<class EvalType, class Traits>
15 ViscousPenaltyParameter<EvalType, Traits>::ViscousPenaltyParameter(
16  const panzer::IntegrationRule& ir,
17  const panzer::PureBasis& basis,
18  const std::string& dof_name,
19  const double& penalty)
20  : _penalty_param("viscous_penalty_parameter_" + dof_name, ir.dl_scalar)
21  , _basis_name(basis.name())
22  , _num_space_dim(ir.spatial_dimension)
23  , _penalty(penalty)
24 {
25  // Note: Default penalty is set in BoundaryFluxBase
26  // Add evaluated field
27  this->addEvaluatedField(_penalty_param);
28 
29  this->setName("Boundary State Viscous Penalty Parameter \"" + dof_name
30  + "\"" + std::to_string(_num_space_dim) + "D");
31 }
32 
33 //---------------------------------------------------------------------------//
34 template<class EvalType, class Traits>
35 void ViscousPenaltyParameter<EvalType, Traits>::postRegistrationSetup(
36  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
37 {
38  _basis_index = panzer::getPureBasisIndex(
39  _basis_name, (*sd.worksets_)[0], this->wda);
40 }
41 
42 //---------------------------------------------------------------------------//
43 template<class EvalType, class Traits>
44 void ViscousPenaltyParameter<EvalType, Traits>::evaluateFields(
45  typename Traits::EvalData workset)
46 {
47  _ip_gradients = this->wda(workset).bases[_basis_index]->grad_basis;
48  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
49  workset.num_cells);
50  Kokkos::parallel_for(this->getName(), policy, *this);
51 }
52 
53 //---------------------------------------------------------------------------//
54 template<class EvalType, class Traits>
55 KOKKOS_INLINE_FUNCTION void
56 ViscousPenaltyParameter<EvalType, Traits>::operator()(
57  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
58 {
59  const int cell = team.league_rank();
60  const int num_basis = _ip_gradients.extent(1);
61  const int num_point = _ip_gradients.extent(2);
62 
63  Kokkos::parallel_for(
64  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
65  using std::sqrt;
66  double one_over_h = 0.0;
67  for (int basis = 0; basis < num_basis; ++basis)
68  {
69  double one_over_h2_basis = 0.0;
70  for (int dim = 0; dim < _num_space_dim; ++dim)
71  {
72  one_over_h2_basis
73  += _ip_gradients(cell, basis, point, dim)
74  * _ip_gradients(cell, basis, point, dim);
75  }
76  one_over_h += sqrt(one_over_h2_basis);
77  }
78 
79  _penalty_param(cell, point) = _penalty * one_over_h;
80  });
81 }
82 
83 //---------------------------------------------------------------------------//
84 
85 } // end namespace BoundaryCondition
86 } // end namespace VertexCFD
87 
88 #endif // VERTEXCFD_BOUNDARYSTATE_VISCOUSPENALTYPARAMETER_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23