54 const ::internal::MatrixFreeFunctions::ConstraintKinds
56 const unsigned int x_idx,
57 const unsigned int y_idx)
59 return ((direction == 0) &&
61 ConstraintKinds::subcell_y) !=
65 (y_idx == fe_degree))) ||
67 (((constraint_mask & ::internal::MatrixFreeFunctions::
68 ConstraintKinds::subcell_x) !=
69 ::internal::MatrixFreeFunctions::ConstraintKinds::
72 (x_idx == fe_degree)));
78 const ::internal::MatrixFreeFunctions::ConstraintKinds
80 const unsigned int x_idx,
81 const unsigned int y_idx,
82 const unsigned int z_idx,
83 const ::internal::MatrixFreeFunctions::ConstraintKinds face1_type,
84 const ::internal::MatrixFreeFunctions::ConstraintKinds face2_type,
85 const ::internal::MatrixFreeFunctions::ConstraintKinds face1,
86 const ::internal::MatrixFreeFunctions::ConstraintKinds face2,
87 const ::internal::MatrixFreeFunctions::ConstraintKinds edge)
89 const unsigned int face1_idx = (direction == 0) ? y_idx :
90 (direction == 1) ? z_idx :
92 const unsigned int face2_idx = (direction == 0) ? z_idx :
93 (direction == 1) ? x_idx :
96 const bool on_face1 = ((constraint_mask & face1_type) !=
97 ::internal::MatrixFreeFunctions::
98 ConstraintKinds::unconstrained) ?
100 (face1_idx == fe_degree);
101 const bool on_face2 = ((constraint_mask & face2_type) !=
102 ::internal::MatrixFreeFunctions::
103 ConstraintKinds::unconstrained) ?
105 (face2_idx == fe_degree);
108 ConstraintKinds::unconstrained) &&
111 ConstraintKinds::unconstrained) &&
114 ConstraintKinds::unconstrained) &&
115 on_face1 && on_face2));
127 const Kokkos::TeamPolicy<
128 MemorySpace::Default::kokkos_space::execution_space>::member_type
130 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
132 const ::internal::MatrixFreeFunctions::ConstraintKinds
136 constexpr unsigned int n_q_points_1d = fe_degree + 1;
137 constexpr unsigned int n_q_points =
Utilities::pow(n_q_points_1d, 2);
141 const bool constrained_face =
145 ::internal::MatrixFreeFunctions::ConstraintKinds::
149 ::internal::MatrixFreeFunctions::ConstraintKinds::
153 Number tmp[n_q_points];
154 Kokkos::parallel_for(
155 Kokkos::TeamThreadRange(team_member, n_q_points),
156 [&](
const int &q_point) {
157 const unsigned int x_idx = q_point % n_q_points_1d;
158 const unsigned int y_idx = q_point / n_q_points_1d;
160 const auto this_type =
166 const unsigned int interp_idx = (direction == 0) ? x_idx : y_idx;
172 const bool constrained_dof =
177 if (constrained_face && constrained_dof)
179 const bool type = (constraint_mask & this_type) !=
181 ConstraintKinds::unconstrained;
185 for (
unsigned int i = 0; i <= fe_degree; ++i)
187 const unsigned int real_idx =
193 constraint_weights[i * n_q_points_1d + interp_idx] :
194 constraint_weights[interp_idx * n_q_points_1d + i];
195 tmp[q_point] += w * values[real_idx];
200 for (
unsigned int i = 0; i <= fe_degree; ++i)
202 const unsigned int real_idx =
208 constraint_weights[(fe_degree - i) * n_q_points_1d +
209 fe_degree - interp_idx] :
210 constraint_weights[(fe_degree - interp_idx) *
213 tmp[q_point] += w * values[real_idx];
221 team_member.team_barrier();
222 Kokkos::parallel_for(Kokkos::TeamThreadRange(team_member, n_q_points),
223 [&](
const int &q_point) {
224 const unsigned int x_idx = q_point % n_q_points_1d;
225 const unsigned int y_idx = q_point / n_q_points_1d;
226 const bool constrained_dof =
228 constraint_mask, x_idx, y_idx);
229 if (constrained_face && constrained_dof)
234 team_member.team_barrier();
246 const Kokkos::TeamPolicy<
247 MemorySpace::Default::kokkos_space::execution_space>::member_type
249 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
251 const ::internal::MatrixFreeFunctions::ConstraintKinds
255 constexpr unsigned int n_q_points_1d = fe_degree + 1;
256 constexpr unsigned int n_q_points =
Utilities::pow(n_q_points_1d, 3);
258 const auto this_type =
264 const auto face1_type =
270 const auto face2_type =
297 const auto constrained_face = constraint_mask & (face1 | face2 | edge);
299 Number tmp[n_q_points];
300 Kokkos::parallel_for(
301 Kokkos::TeamThreadRange(team_member, n_q_points),
302 [&](
const int &q_point) {
303 const unsigned int x_idx = q_point % n_q_points_1d;
304 const unsigned int y_idx = (q_point / n_q_points_1d) % n_q_points_1d;
305 const unsigned int z_idx = q_point / (n_q_points_1d * n_q_points_1d);
307 const unsigned int interp_idx = (direction == 0) ? x_idx :
308 (direction == 1) ? y_idx :
310 const bool constrained_dof =
322 ConstraintKinds::unconstrained) &&
325 const bool type = (constraint_mask & this_type) !=
327 ConstraintKinds::unconstrained;
330 for (
unsigned int i = 0; i <= fe_degree; ++i)
332 const unsigned int real_idx =
341 constraint_weights[i * n_q_points_1d + interp_idx] :
342 constraint_weights[interp_idx * n_q_points_1d + i];
343 tmp[q_point] += w * values[real_idx];
348 for (
unsigned int i = 0; i <= fe_degree; ++i)
350 const unsigned int real_idx =
359 constraint_weights[(fe_degree - i) * n_q_points_1d +
360 fe_degree - interp_idx] :
361 constraint_weights[(fe_degree - interp_idx) *
364 tmp[q_point] += w * values[real_idx];
372 team_member.team_barrier();
374 Kokkos::parallel_for(
375 Kokkos::TeamThreadRange(team_member, n_q_points),
376 [&](
const int &q_point) {
377 const unsigned int x_idx = q_point % n_q_points_1d;
378 const unsigned int y_idx = (q_point / n_q_points_1d) % n_q_points_1d;
379 const unsigned int z_idx = q_point / (n_q_points_1d * n_q_points_1d);
380 const bool constrained_dof =
391 ConstraintKinds::unconstrained) &&
396 team_member.team_barrier();
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, ViewType values)
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)
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, ViewType values)
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, ViewType values)