16#ifndef dealii_cuda_hanging_nodes_internal_h
17#define dealii_cuda_hanging_nodes_internal_h
25#include <Kokkos_Macros.hpp>
35 template <
unsigned int size>
44 template <
unsigned int size>
46 index3(
unsigned int i,
unsigned int j,
unsigned int k)
48 return i + size *
j + size * size *
k;
53 template <
unsigned int fe_degree,
unsigned int direction>
56 const ::internal::MatrixFreeFunctions::ConstraintKinds
58 const unsigned int x_idx,
59 const unsigned int y_idx)
61 return ((direction == 0) &&
62 (((constraint_mask & ::internal::MatrixFreeFunctions::
63 ConstraintKinds::subcell_y) !=
67 (
y_idx == fe_degree))) ||
74 (
x_idx == fe_degree)));
77 template <
unsigned int fe_degree,
unsigned int direction>
80 const ::internal::MatrixFreeFunctions::ConstraintKinds
82 const unsigned int x_idx,
83 const unsigned int y_idx,
84 const unsigned int z_idx,
85 const ::internal::MatrixFreeFunctions::ConstraintKinds
face1_type,
86 const ::internal::MatrixFreeFunctions::ConstraintKinds
face2_type,
87 const ::internal::MatrixFreeFunctions::ConstraintKinds
face1,
88 const ::internal::MatrixFreeFunctions::ConstraintKinds
face2,
89 const ::internal::MatrixFreeFunctions::ConstraintKinds
edge)
92 (direction == 1) ?
z_idx :
95 (direction == 1) ?
x_idx :
99 ::internal::MatrixFreeFunctions::
100 ConstraintKinds::unconstrained) ?
104 ::internal::MatrixFreeFunctions::
105 ConstraintKinds::unconstrained) ?
109 (((constraint_mask &
face1) != ::internal::MatrixFreeFunctions::
110 ConstraintKinds::unconstrained) &&
112 (((constraint_mask &
face2) != ::internal::MatrixFreeFunctions::
113 ConstraintKinds::unconstrained) &&
115 (((constraint_mask &
edge) != ::internal::MatrixFreeFunctions::
116 ConstraintKinds::unconstrained) &&
122 template <
unsigned int fe_degree,
123 unsigned int direction,
129 MemorySpace::Default::kokkos_space::execution_space>
::member_type
131 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
133 const ::internal::MatrixFreeFunctions::ConstraintKinds
135 Kokkos::View<Number *,
136 MemorySpace::Default::kokkos_space::execution_space::
140 constexpr unsigned int n_q_points_1d = fe_degree + 1;
141 constexpr unsigned int n_q_points =
Utilities::pow(n_q_points_1d, 2);
157 Number tmp[n_q_points];
158 Kokkos::parallel_for(
183 const bool type = (constraint_mask &
this_type) !=
184 ::internal::MatrixFreeFunctions::
185 ConstraintKinds::unconstrained;
189 for (
unsigned int i = 0; i <= fe_degree; ++i)
197 constraint_weights[i * n_q_points_1d +
interp_idx] :
198 constraint_weights[
interp_idx * n_q_points_1d + i];
204 for (
unsigned int i = 0; i <= fe_degree; ++i)
212 constraint_weights[(fe_degree - i) * n_q_points_1d +
225 team_member.team_barrier();
238 team_member.team_barrier();
243 template <
unsigned int fe_degree,
244 unsigned int direction,
250 MemorySpace::Default::kokkos_space::execution_space>
::member_type
252 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
254 const ::internal::MatrixFreeFunctions::ConstraintKinds
256 Kokkos::View<Number *,
257 MemorySpace::Default::kokkos_space::execution_space::
261 constexpr unsigned int n_q_points_1d = fe_degree + 1;
262 constexpr unsigned int n_q_points =
Utilities::pow(n_q_points_1d, 3);
305 Number tmp[n_q_points];
306 Kokkos::parallel_for(
310 const unsigned int y_idx = (
q_point / n_q_points_1d) % n_q_points_1d;
311 const unsigned int z_idx =
q_point / (n_q_points_1d * n_q_points_1d);
314 (direction == 1) ?
y_idx :
328 ConstraintKinds::unconstrained) &&
331 const bool type = (constraint_mask &
this_type) !=
332 ::internal::MatrixFreeFunctions::
333 ConstraintKinds::unconstrained;
336 for (
unsigned int i = 0; i <= fe_degree; ++i)
347 constraint_weights[i * n_q_points_1d +
interp_idx] :
348 constraint_weights[
interp_idx * n_q_points_1d + i];
354 for (
unsigned int i = 0; i <= fe_degree; ++i)
365 constraint_weights[(fe_degree - i) * n_q_points_1d +
378 team_member.team_barrier();
380 Kokkos::parallel_for(
384 const unsigned int y_idx = (
q_point / n_q_points_1d) % n_q_points_1d;
385 const unsigned int z_idx =
q_point / (n_q_points_1d * n_q_points_1d);
397 ConstraintKinds::unconstrained) &&
402 team_member.team_barrier();
414 template <
int dim,
int fe_degree,
bool transpose,
typename Number>
418 MemorySpace::Default::kokkos_space::execution_space>
::member_type
420 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
422 const ::internal::MatrixFreeFunctions::ConstraintKinds
424 Kokkos::View<Number *,
425 MemorySpace::Default::kokkos_space::execution_space::
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
void interpolate_boundary_3d(const Kokkos::TeamPolicy< MemorySpace::Default::kokkos_space::execution_space >::member_type &team_member, Kokkos::View< Number *, MemorySpace::Default::kokkos_space > constraint_weights, const ::internal::MatrixFreeFunctions::ConstraintKinds constraint_mask, Kokkos::View< Number *, MemorySpace::Default::kokkos_space::execution_space::scratch_memory_space, Kokkos::MemoryTraits< Kokkos::Unmanaged > > values)
unsigned int index3(unsigned int i, unsigned int j, unsigned int k)
void interpolate_boundary_2d(const Kokkos::TeamPolicy< MemorySpace::Default::kokkos_space::execution_space >::member_type &team_member, Kokkos::View< Number *, MemorySpace::Default::kokkos_space > constraint_weights, const ::internal::MatrixFreeFunctions::ConstraintKinds &constraint_mask, Kokkos::View< Number *, MemorySpace::Default::kokkos_space::execution_space::scratch_memory_space, Kokkos::MemoryTraits< Kokkos::Unmanaged > > values)
bool is_constrained_dof_2d(const ::internal::MatrixFreeFunctions::ConstraintKinds &constraint_mask, const unsigned int x_idx, const unsigned int y_idx)
bool is_constrained_dof_3d(const ::internal::MatrixFreeFunctions::ConstraintKinds &constraint_mask, const unsigned int x_idx, const unsigned int y_idx, const unsigned int z_idx, const ::internal::MatrixFreeFunctions::ConstraintKinds face1_type, const ::internal::MatrixFreeFunctions::ConstraintKinds face2_type, const ::internal::MatrixFreeFunctions::ConstraintKinds face1, const ::internal::MatrixFreeFunctions::ConstraintKinds face2, const ::internal::MatrixFreeFunctions::ConstraintKinds edge)
unsigned int index2(unsigned int i, unsigned int j)
void resolve_hanging_nodes(const Kokkos::TeamPolicy< MemorySpace::Default::kokkos_space::execution_space >::member_type &team_member, Kokkos::View< Number *, MemorySpace::Default::kokkos_space > constraint_weights, const ::internal::MatrixFreeFunctions::ConstraintKinds constraint_mask, Kokkos::View< Number *, MemorySpace::Default::kokkos_space::execution_space::scratch_memory_space, Kokkos::MemoryTraits< Kokkos::Unmanaged > > values)
constexpr T pow(const T base, const int iexp)
#define DEAL_II_HOST_DEVICE