1 #ifndef VERTEXCFD_BOUNDARYSTATE_VISCOUSPENALTYPARAMETER_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYSTATE_VISCOUSPENALTYPARAMETER_IMPL_HPP
4 #include "Panzer_Workset_Utilities.hpp"
5 #include <Panzer_HierarchicParallelism.hpp>
11 namespace BoundaryCondition
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)
27 this->addEvaluatedField(_penalty_param);
29 this->setName(
"Boundary State Viscous Penalty Parameter \"" + dof_name
30 +
"\"" + std::to_string(_num_space_dim) +
"D");
34 template<
class EvalType,
class Traits>
35 void ViscousPenaltyParameter<EvalType, Traits>::postRegistrationSetup(
36 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
38 _basis_index = panzer::getPureBasisIndex(
39 _basis_name, (*sd.worksets_)[0], this->wda);
43 template<
class EvalType,
class Traits>
44 void ViscousPenaltyParameter<EvalType, Traits>::evaluateFields(
45 typename Traits::EvalData workset)
47 _ip_gradients = this->wda(workset).bases[_basis_index]->grad_basis;
48 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
50 Kokkos::parallel_for(this->getName(), policy, *
this);
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
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);
64 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
66 double one_over_h = 0.0;
67 for (
int basis = 0; basis < num_basis; ++basis)
69 double one_over_h2_basis = 0.0;
70 for (
int dim = 0; dim < _num_space_dim; ++dim)
73 += _ip_gradients(cell, basis, point, dim)
74 * _ip_gradients(cell, basis, point, dim);
76 one_over_h += sqrt(one_over_h2_basis);
79 _penalty_param(cell, point) = _penalty * one_over_h;
88 #endif // VERTEXCFD_BOUNDARYSTATE_VISCOUSPENALTYPARAMETER_IMPL_HPP