1 #ifndef VERTEXCFD_CLOSURE_WALLDISTANCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_WALLDISTANCE_IMPL_HPP
4 #include "mesh/VertexCFD_Mesh_GeometryPrimitives.hpp"
6 #include <Panzer_Workset_Utilities.hpp>
12 namespace ClosureModel
16 template<
class EvalType,
class Traits,
int NumSpaceDim>
17 WallDistance<EvalType, Traits, NumSpaceDim>::WallDistance(
18 const panzer::IntegrationRule& ir,
19 Teuchos::RCP<Mesh::Topology::SidesetGeometry> sideset_geometry)
20 : _distance(
"distance", ir.dl_scalar)
21 , _ir_degree(ir.cubature_degree)
23 this->addEvaluatedField(_distance);
24 this->setName(
"distance");
26 _key = sideset_geometry->topology()->getKey();
27 _sides = sideset_geometry->sides();
29 _normals = Kokkos::View<double**, PHX::mem_space>(
30 "normals", _sides.extent(0), num_space_dim);
34 template<
class EvalType,
class Traits,
int NumSpaceDim>
35 void WallDistance<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
36 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
38 _ir_index = panzer::getIntegrationRuleIndex(_ir_degree, (*sd.worksets_)[0]);
39 _number_worksets = (*sd.worksets_).size();
43 = Kokkos::View<double***, PHX::mem_space>(
"distance_vector",
49 _workset_id.resize(_number_worksets);
52 for (std::size_t wks = 0; wks < (*sd.worksets_).size(); ++wks)
54 _current_workset = wks;
55 panzer::Workset workset = (*sd.worksets_)[wks];
57 if (workset.num_cells > 0)
59 _workset_id[wks] = workset.getIdentifier();
61 _ip_coords = workset.int_rules[_ir_index]->ip_coordinates;
62 auto policy = Kokkos::RangePolicy<PHX::exec_space, RegistrationTag>(
63 0, workset.num_cells);
65 Kokkos::parallel_for(this->getName(), policy, *
this);
72 template<
class EvalType,
class Traits,
int NumSpaceDim>
73 void WallDistance<EvalType, Traits, NumSpaceDim>::evaluateFields(
74 typename Traits::EvalData workset)
77 if (workset.num_cells > 0)
79 for (
int i = 0; i < _number_worksets; ++i)
82 if (_workset_id[i] == workset.getIdentifier())
91 auto policy = Kokkos::RangePolicy<PHX::exec_space, EvaluateTag>(
92 0, workset.num_cells);
93 Kokkos::parallel_for(
"SetDistanceField", policy, *
this);
99 template<
class EvalType,
class Traits,
int NumSpaceDim>
100 KOKKOS_INLINE_FUNCTION
void
101 WallDistance<EvalType, Traits, NumSpaceDim>::operator()(RegistrationTag,
102 const int cell)
const
104 const int num_point = _distance.extent(1);
105 for (
int point = 0; point < num_point; ++point)
107 double distance = 1e8;
111 for (
long unsigned int n = 0; n < _sides.extent(0); ++n)
115 if constexpr (num_space_dim == 3)
117 if (_key == shards::Tetrahedron<4>::key)
119 int index[3] = {0, 1, 2};
120 temp = GeometryPrimitives::distanceToTriangleFace(
121 _sides, _normals, n, _ip_coords, cell, point, index);
123 if (_key == shards::Hexahedron<8>::key)
125 int index[3] = {0, 1, 2};
126 const double t2 = GeometryPrimitives::distanceToTriangleFace(
127 _sides, _normals, n, _ip_coords, cell, point, index);
130 const double t1 = GeometryPrimitives::distanceToTriangleFace(
131 _sides, _normals, n, _ip_coords, cell, point, index);
132 temp = std::fmin(t1, t2);
135 if constexpr (num_space_dim == 2)
137 int index[2] = {0, 1};
138 temp = GeometryPrimitives::distanceToLinearEdge(
139 _sides, n, _ip_coords, cell, point, 2, index);
147 _distance_vector(_current_workset, cell, point) = distance;
153 template<
class EvalType,
class Traits,
int NumSpaceDim>
154 KOKKOS_INLINE_FUNCTION
void
155 WallDistance<EvalType, Traits, NumSpaceDim>::operator()(EvaluateTag,
156 const int cell)
const
158 const int num_point = _distance.extent(1);
159 for (
int point = 0; point < num_point; ++point)
161 _distance(cell, point)
162 = _distance_vector(_current_workset, cell, point);
170 #endif // end VERTEXCFD_CLOSURE_WALLDISTANCE_IMPL_HPP