52 const ::internal::MatrixFreeFunctions::ConstraintKinds
54 const unsigned int x_idx,
55 const unsigned int y_idx)
57 return ((direction == 0) &&
59 ConstraintKinds::subcell_y) !=
63 (y_idx == fe_degree))) ||
65 (((constraint_mask & ::internal::MatrixFreeFunctions::
66 ConstraintKinds::subcell_x) !=
67 ::internal::MatrixFreeFunctions::ConstraintKinds::
70 (x_idx == fe_degree)));
76 const ::internal::MatrixFreeFunctions::ConstraintKinds
78 const unsigned int x_idx,
79 const unsigned int y_idx,
80 const unsigned int z_idx,
81 const ::internal::MatrixFreeFunctions::ConstraintKinds face1_type,
82 const ::internal::MatrixFreeFunctions::ConstraintKinds face2_type,
83 const ::internal::MatrixFreeFunctions::ConstraintKinds face1,
84 const ::internal::MatrixFreeFunctions::ConstraintKinds face2,
85 const ::internal::MatrixFreeFunctions::ConstraintKinds edge)
87 const unsigned int face1_idx = (direction == 0) ? y_idx :
88 (direction == 1) ? z_idx :
90 const unsigned int face2_idx = (direction == 0) ? z_idx :
91 (direction == 1) ? x_idx :
94 const bool on_face1 = ((constraint_mask & face1_type) !=
95 ::internal::MatrixFreeFunctions::
96 ConstraintKinds::unconstrained) ?
98 (face1_idx == fe_degree);
99 const bool on_face2 = ((constraint_mask & face2_type) !=
100 ::internal::MatrixFreeFunctions::
101 ConstraintKinds::unconstrained) ?
103 (face2_idx == fe_degree);
106 ConstraintKinds::unconstrained) &&
109 ConstraintKinds::unconstrained) &&
112 ConstraintKinds::unconstrained) &&
113 on_face1 && on_face2));
125 const Kokkos::TeamPolicy<
126 MemorySpace::Default::kokkos_space::execution_space>::member_type
128 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
130 const ::internal::MatrixFreeFunctions::ConstraintKinds
134 constexpr unsigned int n_q_points_1d = fe_degree + 1;
139 const bool constrained_face =
143 ::internal::MatrixFreeFunctions::ConstraintKinds::
147 ::internal::MatrixFreeFunctions::ConstraintKinds::
152 Kokkos::parallel_for(
153 Kokkos::TeamThreadRange(team_member,
n_q_points),
154 [&](
const int &q_point) {
155 const unsigned int x_idx = q_point % n_q_points_1d;
156 const unsigned int y_idx = q_point / n_q_points_1d;
158 const auto this_type =
164 const unsigned int interp_idx = (direction == 0) ? x_idx : y_idx;
170 const bool constrained_dof =
175 if (constrained_face && constrained_dof)
177 const bool type = (constraint_mask & this_type) !=
179 ConstraintKinds::unconstrained;
183 for (
unsigned int i = 0; i <= fe_degree; ++i)
185 const unsigned int real_idx =
191 constraint_weights[i * n_q_points_1d + interp_idx] :
192 constraint_weights[interp_idx * n_q_points_1d + i];
193 tmp[q_point] += w * values[real_idx];
198 for (
unsigned int i = 0; i <= fe_degree; ++i)
200 const unsigned int real_idx =
206 constraint_weights[(fe_degree - i) * n_q_points_1d +
207 fe_degree - interp_idx] :
208 constraint_weights[(fe_degree - interp_idx) *
211 tmp[q_point] += w * values[real_idx];
219 team_member.team_barrier();
220 Kokkos::parallel_for(Kokkos::TeamThreadRange(team_member,
n_q_points),
221 [&](
const int &q_point) {
222 const unsigned int x_idx = q_point % n_q_points_1d;
223 const unsigned int y_idx = q_point / n_q_points_1d;
224 const bool constrained_dof =
226 constraint_mask, x_idx, y_idx);
227 if (constrained_face && constrained_dof)
232 team_member.team_barrier();
244 const Kokkos::TeamPolicy<
245 MemorySpace::Default::kokkos_space::execution_space>::member_type
247 Kokkos::View<Number *, MemorySpace::Default::kokkos_space>
249 const ::internal::MatrixFreeFunctions::ConstraintKinds
253 constexpr unsigned int n_q_points_1d = fe_degree + 1;
256 const auto this_type =
262 const auto face1_type =
268 const auto face2_type =
295 const auto constrained_face = constraint_mask & (face1 | face2 | edge);
298 Kokkos::parallel_for(
299 Kokkos::TeamThreadRange(team_member,
n_q_points),
300 [&](
const int &q_point) {
301 const unsigned int x_idx = q_point % n_q_points_1d;
302 const unsigned int y_idx = (q_point / n_q_points_1d) % n_q_points_1d;
303 const unsigned int z_idx = q_point / (n_q_points_1d * n_q_points_1d);
305 const unsigned int interp_idx = (direction == 0) ? x_idx :
306 (direction == 1) ? y_idx :
308 const bool constrained_dof =
320 ConstraintKinds::unconstrained) &&
323 const bool type = (constraint_mask & this_type) !=
325 ConstraintKinds::unconstrained;
328 for (
unsigned int i = 0; i <= fe_degree; ++i)
330 const unsigned int real_idx =
339 constraint_weights[i * n_q_points_1d + interp_idx] :
340 constraint_weights[interp_idx * n_q_points_1d + i];
341 tmp[q_point] += w * values[real_idx];
346 for (
unsigned int i = 0; i <= fe_degree; ++i)
348 const unsigned int real_idx =
357 constraint_weights[(fe_degree - i) * n_q_points_1d +
358 fe_degree - interp_idx] :
359 constraint_weights[(fe_degree - interp_idx) *
362 tmp[q_point] += w * values[real_idx];
370 team_member.team_barrier();
372 Kokkos::parallel_for(
373 Kokkos::TeamThreadRange(team_member,
n_q_points),
374 [&](
const int &q_point) {
375 const unsigned int x_idx = q_point % n_q_points_1d;
376 const unsigned int y_idx = (q_point / n_q_points_1d) % n_q_points_1d;
377 const unsigned int z_idx = q_point / (n_q_points_1d * n_q_points_1d);
378 const bool constrained_dof =
389 ConstraintKinds::unconstrained) &&
394 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)