5949 const bool check_for_distorted_cells)
5951 static const int dim = 3;
5953 using raw_line_iterator =
5955 using raw_quad_iterator =
5966 for (
const auto &cell :
triangulation.active_cell_iterators_on_level(
5968 if (cell->refine_flag_set())
5995 unsigned int needed_vertices = 0;
5996 unsigned int needed_lines_single = 0;
5997 unsigned int needed_faces_single = 0;
5998 unsigned int needed_lines_pair = 0;
5999 unsigned int needed_faces_pair = 0;
6002 unsigned int new_cells = 0;
6004 for (
const auto &cell :
6006 if (cell->refine_flag_set())
6009 Assert(cell->refine_flag_set() ==
6015 new_cells += cell->reference_cell().n_isotropic_children();
6020 needed_lines_single += 6;
6021 needed_faces_single += 12;
6023 else if (cell->reference_cell() ==
6026 needed_lines_single += 1;
6027 needed_faces_single += 8;
6038 for (
const auto face : cell->face_indices())
6039 if (cell->face(face)->n_children() == 0)
6040 cell->face(face)->set_user_flag();
6042 Assert(cell->face(face)->n_children() ==
6043 cell->reference_cell()
6044 .face_reference_cell(face)
6045 .n_isotropic_children(),
6048 for (
const auto line : cell->line_indices())
6049 if (cell->line(line)->has_children() ==
false)
6050 cell->line(line)->set_user_flag();
6052 Assert(cell->line(line)->n_children() == 2,
6056 const unsigned int used_cells =
6063 used_cells + new_cells,
6068 used_cells + new_cells,
6082 if (quad->user_flag_set() ==
false)
6087 needed_faces_pair += 4;
6088 needed_lines_pair += 4;
6089 needed_vertices += 1;
6093 needed_faces_pair += 4;
6094 needed_lines_single += 3;
6107 if (line->user_flag_set() ==
false)
6110 needed_lines_pair += 2;
6111 needed_vertices += 1;
6116 needed_lines_single);
6119 needed_faces_single);
6122 needed_faces_single);
6126 needed_vertices += std::count(
triangulation.vertices_used.begin(),
6149 for (
const auto &cell :
triangulation.active_cell_iterators())
6150 if (!cell->refine_flag_set())
6151 for (
unsigned int line_n = 0; line_n < cell->n_lines();
6153 if (cell->line(line_n)->has_children())
6154 for (
unsigned int c = 0; c < 2; ++c)
6155 Assert(cell->line(line_n)->child(c)->user_flag_set() ==
6160 unsigned int current_vertex = 0;
6164 auto get_next_unused_vertex = [](
const unsigned int current_vertex,
6165 std::vector<bool> &vertices_used) {
6166 unsigned int next_vertex = current_vertex;
6167 while (next_vertex < vertices_used.size() &&
6168 vertices_used[next_vertex] ==
true)
6171 vertices_used[next_vertex] =
true;
6181 raw_line_iterator next_unused_line =
triangulation.begin_raw_line();
6183 for (; line != endl; ++line)
6185 if (line->user_flag_set() ==
false)
6189 triangulation.faces->lines.template next_free_pair_object<1>(
6197 line->set_children(0, next_unused_line->index());
6199 const std::array<raw_line_iterator, 2> children{
6200 {next_unused_line, ++next_unused_line}};
6206 get_next_unused_vertex(current_vertex,
6208 triangulation.vertices[current_vertex] = line->center(
true);
6210 children[0]->set_bounding_object_indices(
6211 {line->vertex_index(0), current_vertex});
6212 children[1]->set_bounding_object_indices(
6213 {current_vertex, line->vertex_index(1)});
6215 const auto manifold_id = line->manifold_id();
6216 const auto boundary_id = line->boundary_id();
6217 for (
const auto &child : children)
6219 child->set_used_flag();
6220 child->clear_children();
6222 child->clear_user_flag();
6223 child->set_boundary_id_internal(boundary_id);
6224 child->set_manifold_id(manifold_id);
6227 line->clear_user_flag();
6237 for (; quad != endq; ++quad)
6239 if (quad->user_flag_set() ==
false)
6242 const auto reference_face_type = quad->reference_cell();
6246 std::array<raw_line_iterator, 4> new_lines;
6249 for (
unsigned int l = 0; l < 2; ++l)
6251 auto next_unused_line =
6254 new_lines[2 * l] = next_unused_line;
6255 new_lines[2 * l + 1] = ++next_unused_line;
6260 for (
unsigned int l = 0; l < 3; ++l)
6272 for (
const unsigned int line : quad->line_indices())
6278 std::array<raw_quad_iterator, 4> new_quads;
6279 for (
unsigned int q = 0; q < 2; ++q)
6281 auto next_unused_quad =
6285 new_quads[2 * q] = next_unused_quad;
6286 new_quads[2 * q + 1] = ++next_unused_quad;
6288 quad->set_children(2 * q, new_quads[2 * q]->
index());
6294 for (
const auto &quad : new_quads)
6304 for (
const auto i : quad->vertex_indices())
6307 for (
const auto i : quad->line_indices())
6313 get_next_unused_vertex(current_vertex,
6318 quad->center(
true,
true);
6322 std::array<raw_line_iterator, 12> lines;
6323 unsigned int n_lines = 0;
6324 for (
unsigned int l = 0; l < quad->
n_lines(); ++l)
6325 for (
unsigned int c = 0; c < 2; ++c)
6326 lines[n_lines++] = quad->line(l)->child(
6327 child_line_index(c, quad->line_orientation(l)));
6329 for (
unsigned int l = 0; l < quad->
n_lines(); ++l)
6330 lines[n_lines++] = new_lines[l];
6332 std::array<int, 12> line_indices;
6333 for (
unsigned int i = 0; i < n_lines; ++i)
6334 line_indices[i] = lines[i]->
index();
6336 static constexpr ::ndarray<unsigned int, 12, 2>
6337 line_vertices_quad{{{{0, 4}},
6350 static constexpr ::ndarray<unsigned int, 4, 4>
6351 quad_lines_quad{{{{0, 8, 4, 10}},
6356 static constexpr ::ndarray<unsigned int, 12, 2>
6357 line_vertices_tri{{{{0, 3}},
6370 static constexpr ::ndarray<unsigned int, 4, 4>
6371 quad_lines_tri{{{{0, 8, 5, X}},
6376 static constexpr ::ndarray<unsigned int, 4, 4, 2>
6377 quad_line_vertices_tri{
6378 {{{{{0, 3}}, {{3, 5}}, {{5, 0}}, {{X, X}}}},
6379 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
6380 {{{{5, 4}}, {{4, 2}}, {{2, 5}}, {{X, X}}}},
6381 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}}}};
6383 const auto &line_vertices =
6385 line_vertices_quad :
6387 const auto &quad_lines =
6392 for (
unsigned int i = 0, j = 2 * quad->
n_lines();
6396 auto &new_line = new_lines[i];
6397 new_line->set_bounding_object_indices(
6400 new_line->set_used_flag();
6401 new_line->clear_user_flag();
6402 new_line->clear_user_data();
6403 new_line->clear_children();
6404 new_line->set_boundary_id_internal(quad->boundary_id());
6405 new_line->set_manifold_id(quad->manifold_id());
6409 for (
unsigned int i = 0; i < new_quads.size(); ++i)
6411 auto &new_quad = new_quads[i];
6416 reference_face_type);
6419 new_quad->set_bounding_object_indices(
6420 {line_indices[quad_lines[i][0]],
6421 line_indices[quad_lines[i][1]],
6422 line_indices[quad_lines[i][2]]});
6424 new_quad->set_bounding_object_indices(
6425 {line_indices[quad_lines[i][0]],
6426 line_indices[quad_lines[i][1]],
6427 line_indices[quad_lines[i][2]],
6428 line_indices[quad_lines[i][3]]});
6432 new_quad->set_used_flag();
6433 new_quad->clear_user_flag();
6434 new_quad->clear_user_data();
6435 new_quad->clear_children();
6436 new_quad->set_boundary_id_internal(quad->boundary_id());
6437 new_quad->set_manifold_id(quad->manifold_id());
6439 [[maybe_unused]] std::set<unsigned int> s;
6446 for (
const auto f : new_quad->line_indices())
6448 const std::array<unsigned int, 2> vertices_0 = {
6449 {lines[quad_lines[i][f]]->vertex_index(0),
6450 lines[quad_lines[i][f]]->vertex_index(1)}};
6452 const std::array<unsigned int, 2> vertices_1 = {
6456 const auto orientation =
6464 for (
const auto i : vertices_0)
6466 for (
const auto i : vertices_1)
6470 new_quad->set_line_orientation(f, orientation);
6484 static constexpr ::ndarray<unsigned int, 4, 2>
6485 quad_child_boundary_lines{
6486 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
6488 for (
unsigned int i = 0; i < 4; ++i)
6489 for (
unsigned int j = 0; j < 2; ++j)
6490 new_quads[quad_child_boundary_lines[i][j]]
6491 ->set_line_orientation(i, quad->line_orientation(i));
6494 quad->clear_user_flag();
6499 cells_with_distorted_children;
6509 hex->level() >=
static_cast<int>(
level),
6513 hex->level() ==
static_cast<int>(
level);
6516 if (hex->refine_flag_set() ==
6520 const auto &reference_cell_type = hex->reference_cell();
6523 hex->clear_refine_flag();
6524 hex->set_refinement_case(ref_case);
6526 unsigned int n_new_lines = 0;
6527 unsigned int n_new_quads = 0;
6528 unsigned int n_new_hexes = 0;
6545 std::array<raw_line_iterator, 6> new_lines;
6546 for (
unsigned int i = 0; i < n_new_lines; ++i)
6553 new_lines[i]->set_used_flag();
6554 new_lines[i]->clear_user_flag();
6555 new_lines[i]->clear_user_data();
6556 new_lines[i]->clear_children();
6557 new_lines[i]->set_boundary_id_internal(
6559 new_lines[i]->set_manifold_id(hex->manifold_id());
6562 std::array<raw_quad_iterator, 12> new_quads;
6563 for (
unsigned int i = 0; i < n_new_quads; ++i)
6569 auto &new_quad = new_quads[i];
6575 reference_cell_type.face_reference_cell(0));
6578 new_quad->set_used_flag();
6579 new_quad->clear_user_flag();
6580 new_quad->clear_user_data();
6581 new_quad->clear_children();
6582 new_quad->set_boundary_id_internal(
6584 new_quad->set_manifold_id(hex->manifold_id());
6585 for (
const auto j : new_quads[i]->line_indices())
6586 new_quad->set_line_orientation(
6596 for (
unsigned int i = 0; i < n_new_hexes; ++i)
6605 new_hexes[i] = next_unused_hex;
6607 auto &new_hex = new_hexes[i];
6611 ->reference_cell[new_hex->index()] =
6612 reference_cell_type;
6615 new_hex->set_used_flag();
6616 new_hex->clear_user_flag();
6617 new_hex->clear_user_data();
6618 new_hex->clear_children();
6619 new_hex->set_material_id(hex->material_id());
6620 new_hex->set_manifold_id(hex->manifold_id());
6621 new_hex->set_subdomain_id(hex->subdomain_id());
6624 new_hex->set_parent(hex->index());
6629 for (
const auto f : new_hex->face_indices())
6630 new_hex->set_combined_face_orientation(
6633 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
6634 hex->set_children(2 * i, new_hexes[2 * i]->index());
6646 const unsigned int n_vertices =
6648 for (
unsigned int i = 0; i < n_vertices; ++i)
6651 const std::array<unsigned int, 12> line_indices =
6652 TriaAccessorImplementation::Implementation::
6653 get_line_indices_of_cell(*hex);
6665 for (
unsigned int l = 0; l < n_lines; ++l)
6675 for (
const unsigned int i : hex->face_indices())
6677 hex->face(i)->child(0)->vertex_index(3);
6681 get_next_unused_vertex(current_vertex,
6686 hex->center(
true,
true);
6690 unsigned int chosen_line_tetrahedron = 0;
6694 static constexpr ::ndarray<unsigned int, 6, 2>
6695 new_line_vertices = {{{{22, 26}},
6701 for (
unsigned int i = 0; i < n_new_lines; ++i)
6702 new_lines[i]->set_bounding_object_indices(
6712 static constexpr ::ndarray<unsigned int, 3, 2>
6713 new_line_vertices = {{{{6, 8}}, {{5, 7}}, {{4, 9}}}};
6717 std::uint8_t refinement_choice = hex->refine_choice();
6718 if (refinement_choice ==
6723 double min_distance =
6724 std::numeric_limits<double>::infinity();
6725 for (
unsigned int i = 0; i < new_line_vertices.size();
6728 const double current_distance =
6733 [new_line_vertices[i][1]]]);
6734 if (current_distance < min_distance)
6736 chosen_line_tetrahedron = i;
6737 min_distance = current_distance;
6741 else if (refinement_choice ==
6744 chosen_line_tetrahedron = 0;
6745 else if (refinement_choice ==
6748 chosen_line_tetrahedron = 1;
6749 else if (refinement_choice ==
6752 chosen_line_tetrahedron = 2;
6756 hex->set_refinement_case(
6759 new_lines[0]->set_bounding_object_indices(
6761 [new_line_vertices[chosen_line_tetrahedron][0]],
6763 [new_line_vertices[chosen_line_tetrahedron][1]]});
6768 boost::container::small_vector<raw_line_iterator, 30>
6773 relevant_lines.resize(30);
6774 for (
unsigned int f = 0, k = 0; f < 6; ++f)
6775 for (
unsigned int c = 0; c < 4; ++c, ++k)
6778 ndarray<unsigned int, 4, 2>
6780 {{{0, 1}}, {{3, 0}}, {{0, 3}}, {{3, 2}}}};
6786 standard_to_real_face_vertex(
6788 hex->face_orientation(f),
6790 hex->face_rotation(f)))
6792 standard_to_real_face_line(
6794 hex->face_orientation(f),
6796 hex->face_rotation(f)));
6799 for (
unsigned int i = 0, k = 24; i < 6; ++i, ++k)
6800 relevant_lines[k] = new_lines[i];
6815 relevant_lines.resize(13);
6818 for (
unsigned int f = 0; f < 4; ++f)
6819 for (
unsigned int l = 0; l < 3; ++l, ++k)
6823 array<std::array<unsigned int, 3>, 6>
6824 table = {{{{0, 1, 2}},
6831 const auto combined_orientation =
6832 hex->combined_face_orientation(f);
6836 ->line(table[combined_orientation][l]);
6839 relevant_lines[k++] = new_lines[0];
6845 boost::container::small_vector<unsigned int, 30>
6846 relevant_line_indices(relevant_lines.size());
6847 for (
unsigned int i = 0; i < relevant_line_indices.size();
6849 relevant_line_indices[i] = relevant_lines[i]->
index();
6858 const auto &new_quad_lines =
6859 hex->reference_cell().new_isotropic_child_face_lines(
6860 chosen_line_tetrahedron);
6873 hex->reference_cell()
6874 .new_isotropic_child_face_line_vertices(
6875 chosen_line_tetrahedron);
6877 static constexpr ::ndarray<unsigned int, 4, 2>
6878 representative_lines{
6879 {{{0, 2}}, {{2, 0}}, {{3, 3}}, {{1, 1}}}};
6881 for (
unsigned int q = 0; q < n_new_quads; ++q)
6883 auto &new_quad = new_quads[q];
6885 if (new_quad->n_lines() == 3)
6886 new_quad->set_bounding_object_indices(
6887 {relevant_line_indices[new_quad_lines[q][0]],
6888 relevant_line_indices[new_quad_lines[q][1]],
6889 relevant_line_indices[new_quad_lines[q][2]]});
6890 else if (new_quad->n_lines() == 4)
6891 new_quad->set_bounding_object_indices(
6892 {relevant_line_indices[new_quad_lines[q][0]],
6893 relevant_line_indices[new_quad_lines[q][1]],
6894 relevant_line_indices[new_quad_lines[q][2]],
6895 relevant_line_indices[new_quad_lines[q][3]]});
6903 const unsigned int n_compute_lines =
6907 for (
unsigned int line = 0; line < n_compute_lines;
6910 const unsigned int l =
6911 (reference_cell_type ==
6913 representative_lines[q % 4][0] :
6916 const std::array<unsigned int, 2> vertices_0 = {
6917 {relevant_lines[new_quad_lines[q][l]]
6919 relevant_lines[new_quad_lines[q][l]]
6920 ->vertex_index(1)}};
6922 const std::array<unsigned int, 2> vertices_1 = {
6926 const auto orientation =
6931 new_quad->set_line_orientation(l, orientation);
6936 if (reference_cell_type ==
6938 new_quads[representative_lines[q % 4][1] + q -
6940 ->set_line_orientation(l, orientation);
6947 std::array<int, 36> quad_indices;
6951 for (
unsigned int i = 0; i < n_new_quads; ++i)
6952 quad_indices[i] = new_quads[i]->
index();
6954 for (
unsigned int f = 0, k = n_new_quads; f < 6; ++f)
6955 for (
unsigned int c = 0; c < 4; ++c, ++k)
6957 hex->face(f)->isotropic_child_index(
6960 hex->face_orientation(f),
6962 hex->face_rotation(f)));
6972 for (
unsigned int i = 0; i < n_new_quads; ++i)
6973 quad_indices[i] = new_quads[i]->
index();
6975 for (
unsigned int f = 0, k = n_new_quads; f < 4; ++f)
6976 for (
unsigned int c = 0; c < 4; ++c, ++k)
6978 const auto combined_orientation =
6979 hex->combined_face_orientation(f);
6980 quad_indices[k] = hex->face(f)->child_index(
6983 .standard_to_real_face_vertex(
6984 c, f, combined_orientation));
7000 const auto &cell_quads =
7001 hex->reference_cell().new_isotropic_child_cell_faces(
7002 chosen_line_tetrahedron);
7004 for (
unsigned int c = 0;
7005 c < GeometryInfo<dim>::max_children_per_cell;
7008 auto &new_hex = new_hexes[c];
7009 const auto reference_cell = new_hex->reference_cell();
7013 new_hex->set_bounding_object_indices(
7014 {quad_indices[cell_quads[c][0]],
7015 quad_indices[cell_quads[c][1]],
7016 quad_indices[cell_quads[c][2]],
7017 quad_indices[cell_quads[c][3]]});
7022 for (
const auto f : new_hex->face_indices())
7024 const auto &face = new_hex->face(f);
7026 Assert(face->n_vertices() == 3,
7029 const std::array<unsigned int, 3> vertices_0 = {
7030 {face->vertex_index(0),
7031 face->vertex_index(1),
7032 face->vertex_index(2)}};
7041 const auto new_hex_vertices =
7042 hex->reference_cell()
7043 .new_isotropic_child_cell_vertices(
7044 chosen_line_tetrahedron)[c];
7048 std::array<unsigned int, 3> vertices_1;
7049 for (
unsigned int face_vertex_no :
7050 face->vertex_indices())
7052 const auto cell_vertex_no =
7053 reference_cell.face_to_cell_vertices(
7058 [new_hex_vertices[cell_vertex_no]];
7061 new_hex->set_combined_face_orientation(
7063 face->reference_cell()
7064 .get_combined_orientation(
7069 else if (new_hex->n_faces() == 6)
7070 new_hex->set_bounding_object_indices(
7071 {quad_indices[cell_quads[c][0]],
7072 quad_indices[cell_quads[c][1]],
7073 quad_indices[cell_quads[c][2]],
7074 quad_indices[cell_quads[c][3]],
7075 quad_indices[cell_quads[c][4]],
7076 quad_indices[cell_quads[c][5]]});
7085 static constexpr ::ndarray<unsigned int, 6, 4>
7086 face_to_child_indices_hex{{{{0, 2, 4, 6}},
7093 for (
const auto f : hex->face_indices())
7095 const auto combined_orientation =
7096 hex->combined_face_orientation(f);
7097 for (
unsigned int c = 0; c < 4; ++c)
7098 new_hexes[face_to_child_indices_hex[f][c]]
7099 ->set_combined_face_orientation(
7100 f, combined_orientation);
7105 if (check_for_distorted_cells &&
7106 has_distorted_children<dim, spacedim>(hex))
7115 return cells_with_distorted_children;
7125 const bool check_for_distorted_cells)
7127 const unsigned int dim = 3;
7130 bool flag_isotropic_mesh =
true;
7134 for (; cell != endc; ++cell)
7144 flag_isotropic_mesh =
false;
7148 if (flag_isotropic_mesh)
7150 check_for_distorted_cells);
7161 for (
const auto &cell :
triangulation.active_cell_iterators_on_level(
7163 if (cell->refine_flag_set())
7180 line->clear_user_flag();
7185 quad->clear_user_flag();
7208 unsigned int needed_vertices = 0;
7209 unsigned int needed_lines_single = 0;
7210 unsigned int needed_quads_single = 0;
7211 unsigned int needed_lines_pair = 0;
7212 unsigned int needed_quads_pair = 0;
7217 unsigned int new_cells = 0;
7219 for (
const auto &acell :
7221 if (acell->refine_flag_set())
7231 ++needed_quads_single;
7239 ++needed_lines_single;
7240 needed_quads_single += 4;
7247 needed_lines_single += 6;
7248 needed_quads_single += 12;
7262 for (
const unsigned int face :
7266 aface = acell->face(face);
7273 acell->face_orientation(face),
7274 acell->face_flip(face),
7275 acell->face_rotation(face));
7280 if (face_ref_case ==
7283 if (aface->n_active_descendants() < 4)
7286 aface->set_user_flag();
7288 else if (aface->refinement_case() != face_ref_case)
7299 Assert(aface->refinement_case() ==
7302 aface->refinement_case() ==
7305 aface->set_user_index(face_ref_case);
7311 for (
unsigned int line = 0;
7312 line < GeometryInfo<dim>::lines_per_cell;
7316 !acell->line(line)->has_children())
7317 acell->line(line)->set_user_flag();
7323 const unsigned int used_cells =
7333 used_cells + new_cells,
7346 if (quad->user_flag_set())
7352 needed_quads_pair += 4;
7353 needed_lines_pair += 4;
7354 needed_vertices += 1;
7356 if (quad->user_index())
7360 needed_quads_pair += 2;
7361 needed_lines_single += 1;
7374 if (quad->has_children())
7376 Assert(quad->refinement_case() ==
7379 if ((face_refinement_cases[quad->user_index()] ==
7381 (quad->child(0)->line_index(1) + 1 !=
7382 quad->child(2)->line_index(1))) ||
7383 (face_refinement_cases[quad->user_index()] ==
7385 (quad->child(0)->line_index(3) + 1 !=
7386 quad->child(1)->line_index(3))))
7387 needed_lines_pair += 2;
7396 if (line->user_flag_set())
7398 needed_lines_pair += 2;
7399 needed_vertices += 1;
7405 needed_lines_single);
7409 needed_quads_single);
7412 needed_quads_single);
7416 needed_vertices += std::count(
triangulation.vertices_used.begin(),
7441 for (
const auto &cell :
triangulation.active_cell_iterators())
7442 if (!cell->refine_flag_set())
7443 for (
unsigned int line = 0;
7444 line < GeometryInfo<dim>::lines_per_cell;
7446 if (cell->line(line)->has_children())
7447 for (
unsigned int c = 0; c < 2; ++c)
7448 Assert(cell->line(line)->child(c)->user_flag_set() ==
7461 unsigned int next_unused_vertex = 0;
7472 for (; line != endl; ++line)
7473 if (line->user_flag_set())
7479 while (
triangulation.vertices_used[next_unused_vertex] ==
true)
7480 ++next_unused_vertex;
7484 "Internal error: During refinement, the triangulation wants to access an element of the 'vertices' array but it turns out that the array is not large enough."));
7487 triangulation.vertices[next_unused_vertex] = line->center(
true);
7501 line->set_children(0, next_unused_line->index());
7505 children[2] = {next_unused_line, ++next_unused_line};
7512 children[0]->set_bounding_object_indices(
7513 {line->vertex_index(0), next_unused_vertex});
7514 children[1]->set_bounding_object_indices(
7515 {next_unused_vertex, line->vertex_index(1)});
7517 children[0]->set_used_flag();
7518 children[1]->set_used_flag();
7519 children[0]->clear_children();
7520 children[1]->clear_children();
7523 children[0]->clear_user_flag();
7524 children[1]->clear_user_flag();
7526 children[0]->set_boundary_id_internal(line->boundary_id());
7527 children[1]->set_boundary_id_internal(line->boundary_id());
7529 children[0]->set_manifold_id(line->manifold_id());
7530 children[1]->set_manifold_id(line->manifold_id());
7535 line->clear_user_flag();
7565 for (
unsigned int loop = 0; loop < 2; ++loop)
7578 for (; quad != endq; ++quad)
7580 if (quad->user_index())
7583 face_refinement_cases[quad->user_index()];
7592 if (aniso_quad_ref_case == quad->refinement_case())
7595 Assert(quad->refinement_case() ==
7597 quad->refinement_case() ==
7602 Assert(quad->user_index() ==
7604 quad->user_index() ==
7634 quad->line(2)->child(0)->vertex_index(1);
7636 quad->line(3)->child(0)->vertex_index(1);
7641 quad->line(0)->child(0)->vertex_index(1);
7643 quad->line(1)->child(0)->vertex_index(1);
7646 new_line->set_bounding_object_indices(
7648 new_line->set_used_flag();
7649 new_line->clear_user_flag();
7651 new_line->clear_children();
7652 new_line->set_boundary_id_internal(quad->boundary_id());
7653 new_line->set_manifold_id(quad->manifold_id());
7663 new_quads[0] = next_unused_quad;
7667 new_quads[1] = next_unused_quad;
7672 new_quads[0]->set_bounding_object_indices(
7673 {
static_cast<int>(quad->line_index(0)),
7677 child_line_index(0, quad->line_orientation(2)))
7681 child_line_index(0, quad->line_orientation(3)))
7683 new_quads[1]->set_bounding_object_indices(
7685 static_cast<int>(quad->line_index(1)),
7688 child_line_index(1, quad->line_orientation(2)))
7692 child_line_index(1, quad->line_orientation(3)))
7697 new_quads[0]->set_bounding_object_indices(
7700 child_line_index(0, quad->line_orientation(0)))
7704 child_line_index(0, quad->line_orientation(1)))
7706 static_cast<int>(quad->line_index(2)),
7707 new_line->index()});
7708 new_quads[1]->set_bounding_object_indices(
7711 child_line_index(1, quad->line_orientation(0)))
7715 child_line_index(1, quad->line_orientation(1)))
7718 static_cast<int>(quad->line_index(3))});
7721 for (
const auto &new_quad : new_quads)
7723 new_quad->set_used_flag();
7724 new_quad->clear_user_flag();
7726 new_quad->clear_children();
7727 new_quad->set_boundary_id_internal(quad->boundary_id());
7728 new_quad->set_manifold_id(quad->manifold_id());
7732 for (
unsigned int j = 0;
7733 j < GeometryInfo<dim>::lines_per_face;
7735 new_quad->set_line_orientation(
7742 new_quads[0]->set_line_orientation(
7743 0, quad->line_orientation(0));
7744 new_quads[0]->set_line_orientation(
7745 2, quad->line_orientation(2));
7746 new_quads[1]->set_line_orientation(
7747 1, quad->line_orientation(1));
7748 new_quads[1]->set_line_orientation(
7749 3, quad->line_orientation(3));
7752 new_quads[0]->set_line_orientation(
7753 3, quad->line_orientation(3));
7754 new_quads[1]->set_line_orientation(
7755 2, quad->line_orientation(2));
7759 new_quads[0]->set_line_orientation(
7760 1, quad->line_orientation(1));
7761 new_quads[1]->set_line_orientation(
7762 0, quad->line_orientation(0));
7768 if (quad->refinement_case() ==
7791 if (aniso_quad_ref_case ==
7794 old_child[0] = quad->child(0)->line(1);
7795 old_child[1] = quad->child(2)->line(1);
7799 Assert(aniso_quad_ref_case ==
7803 old_child[0] = quad->child(0)->line(3);
7804 old_child[1] = quad->child(1)->line(3);
7807 if (old_child[0]->
index() + 1 != old_child[1]->
index())
7813 spacedim>::raw_line_iterator
7816 new_child[0] = new_child[1] =
7818 .template next_free_pair_object<1>(
7822 new_child[0]->set_used_flag();
7823 new_child[1]->set_used_flag();
7825 const int old_index_0 = old_child[0]->index(),
7826 old_index_1 = old_child[1]->index(),
7827 new_index_0 = new_child[0]->index(),
7828 new_index_1 = new_child[1]->index();
7832 for (
unsigned int q = 0;
7835 for (
unsigned int l = 0;
7836 l < GeometryInfo<dim>::lines_per_face;
7839 const int this_index =
7841 .get_bounding_object_indices(q)[l];
7842 if (this_index == old_index_0)
7844 .get_bounding_object_indices(q)[l] =
7846 else if (this_index == old_index_1)
7848 .get_bounding_object_indices(q)[l] =
7853 for (
unsigned int i = 0; i < 2; ++i)
7855 Assert(!old_child[i]->has_children(),
7858 new_child[i]->set_bounding_object_indices(
7859 {old_child[i]->vertex_index(0),
7860 old_child[i]->vertex_index(1)});
7861 new_child[i]->set_boundary_id_internal(
7862 old_child[i]->boundary_id());
7863 new_child[i]->set_manifold_id(
7864 old_child[i]->manifold_id());
7865 new_child[i]->set_user_index(
7866 old_child[i]->user_index());
7867 if (old_child[i]->user_flag_set())
7868 new_child[i]->set_user_flag();
7870 new_child[i]->clear_user_flag();
7872 new_child[i]->clear_children();
7874 old_child[i]->clear_user_flag();
7875 old_child[i]->clear_user_index();
7876 old_child[i]->clear_used_flag();
7882 if (aniso_quad_ref_case ==
7885 new_line->set_children(
7886 0, quad->child(0)->line_index(1));
7887 Assert(new_line->child(1) ==
7888 quad->child(2)->line(1),
7925 quad_iterator switch_1 = quad->child(1),
7926 switch_2 = quad->child(2);
7927 const int switch_1_index = switch_1->index();
7928 const int switch_2_index = switch_2->index();
7929 for (
unsigned int l = 0;
7932 for (
unsigned int h = 0;
7936 for (
const unsigned int q :
7939 const int face_index =
7941 ->cells.get_bounding_object_indices(
7943 if (face_index == switch_1_index)
7945 ->cells.get_bounding_object_indices(
7946 h)[q] = switch_2_index;
7947 else if (face_index == switch_2_index)
7949 ->cells.get_bounding_object_indices(
7950 h)[q] = switch_1_index;
7954 const unsigned int switch_1_lines[4] = {
7955 switch_1->line_index(0),
7956 switch_1->line_index(1),
7957 switch_1->line_index(2),
7958 switch_1->line_index(3)};
7960 switch_1_line_orientations[4] = {
7961 switch_1->line_orientation(0),
7962 switch_1->line_orientation(1),
7963 switch_1->line_orientation(2),
7964 switch_1->line_orientation(3)};
7966 switch_1->boundary_id();
7967 const unsigned int switch_1_user_index =
7968 switch_1->user_index();
7969 const bool switch_1_user_flag =
7970 switch_1->user_flag_set();
7972 switch_1_refinement_case =
7973 switch_1->refinement_case();
7974 const int switch_1_first_child_pair =
7975 (switch_1_refinement_case ?
7976 switch_1->child_index(0) :
7978 const int switch_1_second_child_pair =
7979 (switch_1_refinement_case ==
7981 switch_1->child_index(2) :
7984 switch_1->set_bounding_object_indices(
7985 {switch_2->line_index(0),
7986 switch_2->line_index(1),
7987 switch_2->line_index(2),
7988 switch_2->line_index(3)});
7989 switch_1->set_line_orientation(
7990 0, switch_2->line_orientation(0));
7991 switch_1->set_line_orientation(
7992 1, switch_2->line_orientation(1));
7993 switch_1->set_line_orientation(
7994 2, switch_2->line_orientation(2));
7995 switch_1->set_line_orientation(
7996 3, switch_2->line_orientation(3));
7997 switch_1->set_boundary_id_internal(
7998 switch_2->boundary_id());
7999 switch_1->set_manifold_id(switch_2->manifold_id());
8000 switch_1->set_user_index(switch_2->user_index());
8001 if (switch_2->user_flag_set())
8002 switch_1->set_user_flag();
8004 switch_1->clear_user_flag();
8005 switch_1->clear_refinement_case();
8006 switch_1->set_refinement_case(
8007 switch_2->refinement_case());
8008 switch_1->clear_children();
8009 if (switch_2->refinement_case())
8010 switch_1->set_children(0,
8011 switch_2->child_index(0));
8012 if (switch_2->refinement_case() ==
8014 switch_1->set_children(2,
8015 switch_2->child_index(2));
8017 switch_2->set_bounding_object_indices(
8021 switch_1_lines[3]});
8022 switch_2->set_line_orientation(
8023 0, switch_1_line_orientations[0]);
8024 switch_2->set_line_orientation(
8025 1, switch_1_line_orientations[1]);
8026 switch_2->set_line_orientation(
8027 2, switch_1_line_orientations[2]);
8028 switch_2->set_line_orientation(
8029 3, switch_1_line_orientations[3]);
8030 switch_2->set_boundary_id_internal(
8031 switch_1_boundary_id);
8032 switch_2->set_manifold_id(switch_1->manifold_id());
8033 switch_2->set_user_index(switch_1_user_index);
8034 if (switch_1_user_flag)
8035 switch_2->set_user_flag();
8037 switch_2->clear_user_flag();
8038 switch_2->clear_refinement_case();
8039 switch_2->set_refinement_case(
8040 switch_1_refinement_case);
8041 switch_2->clear_children();
8042 switch_2->set_children(0,
8043 switch_1_first_child_pair);
8044 switch_2->set_children(2,
8045 switch_1_second_child_pair);
8047 new_quads[0]->set_refinement_case(
8049 new_quads[0]->set_children(0, quad->child_index(0));
8050 new_quads[1]->set_refinement_case(
8052 new_quads[1]->set_children(0, quad->child_index(2));
8056 new_quads[0]->set_refinement_case(
8058 new_quads[0]->set_children(0, quad->child_index(0));
8059 new_quads[1]->set_refinement_case(
8061 new_quads[1]->set_children(0, quad->child_index(2));
8062 new_line->set_children(
8063 0, quad->child(0)->line_index(3));
8064 Assert(new_line->child(1) ==
8065 quad->child(1)->line(3),
8068 quad->clear_children();
8072 quad->set_children(0, new_quads[0]->
index());
8074 quad->set_refinement_case(aniso_quad_ref_case);
8081 if (quad->user_flag_set())
8093 ++next_unused_vertex;
8097 "Internal error: During refinement, the triangulation wants to access an element of the 'vertices' array but it turns out that the array is not large enough."));
8105 quad->refinement_case();
8111 quad->child(0)->set_user_index(
8113 quad->child(1)->set_user_index(
8119 middle_line = quad->child(0)->line(1);
8121 middle_line = quad->child(0)->line(3);
8128 if (!middle_line->has_children())
8136 middle_line->center(
true);
8144 .template next_free_pair_object<1>(
8149 middle_line->set_children(
8150 0, next_unused_line->index());
8154 raw_line_iterator children[2] = {
8155 next_unused_line, ++next_unused_line};
8163 children[0]->set_bounding_object_indices(
8164 {middle_line->vertex_index(0),
8165 next_unused_vertex});
8166 children[1]->set_bounding_object_indices(
8167 {next_unused_vertex,
8168 middle_line->vertex_index(1)});
8170 children[0]->set_used_flag();
8171 children[1]->set_used_flag();
8172 children[0]->clear_children();
8173 children[1]->clear_children();
8176 children[0]->clear_user_flag();
8177 children[1]->clear_user_flag();
8179 children[0]->set_boundary_id_internal(
8180 middle_line->boundary_id());
8181 children[1]->set_boundary_id_internal(
8182 middle_line->boundary_id());
8184 children[0]->set_manifold_id(
8185 middle_line->manifold_id());
8186 children[1]->set_manifold_id(
8187 middle_line->manifold_id());
8193 quad->clear_user_flag();
8223 quad->center(
true,
true);
8232 for (
unsigned int i = 0; i < 4; ++i)
8245 new_lines[i] = next_unused_line;
8269 quad->line(0)->child(0)->vertex_index(1),
8270 quad->line(1)->child(0)->vertex_index(1),
8271 quad->line(2)->child(0)->vertex_index(1),
8272 quad->line(3)->child(0)->vertex_index(1),
8273 next_unused_vertex};
8275 new_lines[0]->set_bounding_object_indices(
8277 new_lines[1]->set_bounding_object_indices(
8279 new_lines[2]->set_bounding_object_indices(
8281 new_lines[3]->set_bounding_object_indices(
8284 for (
const auto &new_line : new_lines)
8286 new_line->set_used_flag();
8287 new_line->clear_user_flag();
8289 new_line->clear_children();
8290 new_line->set_boundary_id_internal(quad->boundary_id());
8291 new_line->set_manifold_id(quad->manifold_id());
8304 const int line_indices[12] = {
8306 ->child(child_line_index(0, quad->line_orientation(0)))
8309 ->child(child_line_index(1, quad->line_orientation(0)))
8312 ->child(child_line_index(0, quad->line_orientation(1)))
8315 ->child(child_line_index(1, quad->line_orientation(1)))
8318 ->child(child_line_index(0, quad->line_orientation(2)))
8321 ->child(child_line_index(1, quad->line_orientation(2)))
8324 ->child(child_line_index(0, quad->line_orientation(3)))
8327 ->child(child_line_index(1, quad->line_orientation(3)))
8329 new_lines[0]->index(),
8330 new_lines[1]->index(),
8331 new_lines[2]->index(),
8332 new_lines[3]->index()};
8344 new_quads[0] = next_unused_quad;
8348 new_quads[1] = next_unused_quad;
8354 new_quads[2] = next_unused_quad;
8358 new_quads[3] = next_unused_quad;
8362 quad->set_children(0, new_quads[0]->
index());
8363 quad->set_children(2, new_quads[2]->
index());
8366 new_quads[0]->set_bounding_object_indices(
8371 new_quads[1]->set_bounding_object_indices(
8376 new_quads[2]->set_bounding_object_indices(
8381 new_quads[3]->set_bounding_object_indices(
8386 for (
const auto &new_quad : new_quads)
8388 new_quad->set_used_flag();
8389 new_quad->clear_user_flag();
8391 new_quad->clear_children();
8392 new_quad->set_boundary_id_internal(quad->boundary_id());
8393 new_quad->set_manifold_id(quad->manifold_id());
8397 for (
unsigned int j = 0;
8398 j < GeometryInfo<dim>::lines_per_face;
8400 new_quad->set_line_orientation(
8407 new_quads[0]->set_line_orientation(
8408 0, quad->line_orientation(0));
8409 new_quads[0]->set_line_orientation(
8410 2, quad->line_orientation(2));
8411 new_quads[1]->set_line_orientation(
8412 1, quad->line_orientation(1));
8413 new_quads[1]->set_line_orientation(
8414 2, quad->line_orientation(2));
8415 new_quads[2]->set_line_orientation(
8416 0, quad->line_orientation(0));
8417 new_quads[2]->set_line_orientation(
8418 3, quad->line_orientation(3));
8419 new_quads[3]->set_line_orientation(
8420 1, quad->line_orientation(1));
8421 new_quads[3]->set_line_orientation(
8422 3, quad->line_orientation(3));
8426 quad->clear_user_flag();
8437 cells_with_distorted_children;
8451 for (; hex != endh; ++hex)
8452 if (hex->refine_flag_set())
8460 hex->clear_refine_flag();
8461 hex->set_refinement_case(ref_case);
8472 unsigned int n_new_lines = 0;
8473 unsigned int n_new_quads = 0;
8474 unsigned int n_new_hexes = 0;
8505 new_lines(n_new_lines);
8506 for (
unsigned int i = 0; i < n_new_lines; ++i)
8513 new_lines[i]->set_used_flag();
8514 new_lines[i]->clear_user_flag();
8515 new_lines[i]->clear_user_data();
8516 new_lines[i]->clear_children();
8518 new_lines[i]->set_boundary_id_internal(
8522 new_lines[i]->set_manifold_id(hex->manifold_id());
8529 new_quads(n_new_quads);
8530 for (
unsigned int i = 0; i < n_new_quads; ++i)
8537 new_quads[i]->set_used_flag();
8538 new_quads[i]->clear_user_flag();
8539 new_quads[i]->clear_user_data();
8540 new_quads[i]->clear_children();
8542 new_quads[i]->set_boundary_id_internal(
8546 new_quads[i]->set_manifold_id(hex->manifold_id());
8549 for (
unsigned int j = 0;
8550 j < GeometryInfo<dim>::lines_per_face;
8552 new_quads[i]->set_line_orientation(
8562 new_hexes(n_new_hexes);
8563 for (
unsigned int i = 0; i < n_new_hexes; ++i)
8572 new_hexes[i] = next_unused_hex;
8575 new_hexes[i]->set_used_flag();
8576 new_hexes[i]->clear_user_flag();
8577 new_hexes[i]->clear_user_data();
8578 new_hexes[i]->clear_children();
8581 new_hexes[i]->set_material_id(hex->material_id());
8582 new_hexes[i]->set_manifold_id(hex->manifold_id());
8583 new_hexes[i]->set_subdomain_id(subdomainid);
8586 new_hexes[i]->set_parent(hex->index());
8598 for (
const unsigned int f :
8600 new_hexes[i]->set_combined_face_orientation(
8604 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
8605 hex->set_children(2 * i, new_hexes[2 * i]->index());
8612 const bool f_or[6] = {hex->face_orientation(0),
8613 hex->face_orientation(1),
8614 hex->face_orientation(2),
8615 hex->face_orientation(3),
8616 hex->face_orientation(4),
8617 hex->face_orientation(5)};
8620 const bool f_fl[6] = {hex->face_flip(0),
8628 const bool f_ro[6] = {hex->face_rotation(0),
8629 hex->face_rotation(1),
8630 hex->face_rotation(2),
8631 hex->face_rotation(3),
8632 hex->face_rotation(4),
8633 hex->face_rotation(5)};
8637 hex->combined_face_orientation(0),
8638 hex->combined_face_orientation(1),
8639 hex->combined_face_orientation(2),
8640 hex->combined_face_orientation(3),
8641 hex->combined_face_orientation(4),
8642 hex->combined_face_orientation(5)};
8652 const unsigned int child_at_origin[2][2][2] = {
8739 raw_line_iterator lines[4] = {
8740 hex->face(2)->child(0)->line(
8741 (hex->face(2)->refinement_case() ==
8745 hex->face(3)->child(0)->line(
8746 (hex->face(3)->refinement_case() ==
8750 hex->face(4)->child(0)->line(
8751 (hex->face(4)->refinement_case() ==
8755 hex->face(5)->child(0)->line(
8756 (hex->face(5)->refinement_case() ==
8762 unsigned int line_indices[4];
8763 for (
unsigned int i = 0; i < 4; ++i)
8764 line_indices[i] = lines[i]->
index();
8777 const unsigned int middle_vertices[2] = {
8778 hex->line(2)->child(0)->vertex_index(1),
8779 hex->line(7)->child(0)->vertex_index(1)};
8781 for (
unsigned int i = 0; i < 4; ++i)
8782 if (lines[i]->vertex_index(i % 2) ==
8783 middle_vertices[i % 2])
8784 line_orientation[i] =
8789 Assert(lines[i]->vertex_index((i + 1) % 2) ==
8790 middle_vertices[i % 2],
8792 line_orientation[i] =
8798 new_quads[0]->set_bounding_object_indices(
8804 new_quads[0]->set_line_orientation(
8805 0, line_orientation[0]);
8806 new_quads[0]->set_line_orientation(
8807 1, line_orientation[1]);
8808 new_quads[0]->set_line_orientation(
8809 2, line_orientation[2]);
8810 new_quads[0]->set_line_orientation(
8811 3, line_orientation[3]);
8844 const int quad_indices[11] = {
8845 new_quads[0]->index(),
8847 hex->face(0)->index(),
8849 hex->face(1)->index(),
8851 hex->face(2)->child_index(
8852 child_at_origin[hex->face(2)->refinement_case() -
8853 1][f_fl[2]][f_ro[2]]),
8854 hex->face(2)->child_index(
8856 child_at_origin[hex->face(2)->refinement_case() -
8857 1][f_fl[2]][f_ro[2]]),
8859 hex->face(3)->child_index(
8860 child_at_origin[hex->face(3)->refinement_case() -
8861 1][f_fl[3]][f_ro[3]]),
8862 hex->face(3)->child_index(
8864 child_at_origin[hex->face(3)->refinement_case() -
8865 1][f_fl[3]][f_ro[3]]),
8867 hex->face(4)->child_index(
8868 child_at_origin[hex->face(4)->refinement_case() -
8869 1][f_fl[4]][f_ro[4]]),
8870 hex->face(4)->child_index(
8872 child_at_origin[hex->face(4)->refinement_case() -
8873 1][f_fl[4]][f_ro[4]]),
8875 hex->face(5)->child_index(
8876 child_at_origin[hex->face(5)->refinement_case() -
8877 1][f_fl[5]][f_ro[5]]),
8878 hex->face(5)->child_index(
8880 child_at_origin[hex->face(5)->refinement_case() -
8881 1][f_fl[5]][f_ro[5]])
8885 new_hexes[0]->set_bounding_object_indices(
8892 new_hexes[1]->set_bounding_object_indices(
8967 raw_line_iterator lines[4] = {
8968 hex->face(0)->child(0)->line(
8969 (hex->face(0)->refinement_case() ==
8973 hex->face(1)->child(0)->line(
8974 (hex->face(1)->refinement_case() ==
8978 hex->face(4)->child(0)->line(
8979 (hex->face(4)->refinement_case() ==
8983 hex->face(5)->child(0)->line(
8984 (hex->face(5)->refinement_case() ==
8990 unsigned int line_indices[4];
8991 for (
unsigned int i = 0; i < 4; ++i)
8992 line_indices[i] = lines[i]->
index();
9005 const unsigned int middle_vertices[2] = {
9006 hex->line(0)->child(0)->vertex_index(1),
9007 hex->line(5)->child(0)->vertex_index(1)};
9009 for (
unsigned int i = 0; i < 4; ++i)
9010 if (lines[i]->vertex_index(i % 2) ==
9011 middle_vertices[i % 2])
9012 line_orientation[i] =
9017 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9018 middle_vertices[i % 2],
9020 line_orientation[i] =
9026 new_quads[0]->set_bounding_object_indices(
9032 new_quads[0]->set_line_orientation(
9033 0, line_orientation[2]);
9034 new_quads[0]->set_line_orientation(
9035 1, line_orientation[3]);
9036 new_quads[0]->set_line_orientation(
9037 2, line_orientation[0]);
9038 new_quads[0]->set_line_orientation(
9039 3, line_orientation[1]);
9072 const int quad_indices[11] = {
9073 new_quads[0]->index(),
9075 hex->face(0)->child_index(
9076 child_at_origin[hex->face(0)->refinement_case() -
9077 1][f_fl[0]][f_ro[0]]),
9078 hex->face(0)->child_index(
9080 child_at_origin[hex->face(0)->refinement_case() -
9081 1][f_fl[0]][f_ro[0]]),
9083 hex->face(1)->child_index(
9084 child_at_origin[hex->face(1)->refinement_case() -
9085 1][f_fl[1]][f_ro[1]]),
9086 hex->face(1)->child_index(
9088 child_at_origin[hex->face(1)->refinement_case() -
9089 1][f_fl[1]][f_ro[1]]),
9091 hex->face(2)->index(),
9093 hex->face(3)->index(),
9095 hex->face(4)->child_index(
9096 child_at_origin[hex->face(4)->refinement_case() -
9097 1][f_fl[4]][f_ro[4]]),
9098 hex->face(4)->child_index(
9100 child_at_origin[hex->face(4)->refinement_case() -
9101 1][f_fl[4]][f_ro[4]]),
9103 hex->face(5)->child_index(
9104 child_at_origin[hex->face(5)->refinement_case() -
9105 1][f_fl[5]][f_ro[5]]),
9106 hex->face(5)->child_index(
9108 child_at_origin[hex->face(5)->refinement_case() -
9109 1][f_fl[5]][f_ro[5]])
9113 new_hexes[0]->set_bounding_object_indices(
9120 new_hexes[1]->set_bounding_object_indices(
9197 raw_line_iterator lines[4] = {
9198 hex->face(0)->child(0)->line(
9199 (hex->face(0)->refinement_case() ==
9203 hex->face(1)->child(0)->line(
9204 (hex->face(1)->refinement_case() ==
9208 hex->face(2)->child(0)->line(
9209 (hex->face(2)->refinement_case() ==
9213 hex->face(3)->child(0)->line(
9214 (hex->face(3)->refinement_case() ==
9220 unsigned int line_indices[4];
9221 for (
unsigned int i = 0; i < 4; ++i)
9222 line_indices[i] = lines[i]->
index();
9235 const unsigned int middle_vertices[2] = {
9236 middle_vertex_index<dim, spacedim>(hex->line(8)),
9237 middle_vertex_index<dim, spacedim>(hex->line(11))};
9239 for (
unsigned int i = 0; i < 4; ++i)
9240 if (lines[i]->vertex_index(i % 2) ==
9241 middle_vertices[i % 2])
9242 line_orientation[i] =
9247 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9248 middle_vertices[i % 2],
9250 line_orientation[i] =
9256 new_quads[0]->set_bounding_object_indices(
9262 new_quads[0]->set_line_orientation(
9263 0, line_orientation[0]);
9264 new_quads[0]->set_line_orientation(
9265 1, line_orientation[1]);
9266 new_quads[0]->set_line_orientation(
9267 2, line_orientation[2]);
9268 new_quads[0]->set_line_orientation(
9269 3, line_orientation[3]);
9303 const int quad_indices[11] = {
9304 new_quads[0]->index(),
9306 hex->face(0)->child_index(
9307 child_at_origin[hex->face(0)->refinement_case() -
9308 1][f_fl[0]][f_ro[0]]),
9309 hex->face(0)->child_index(
9311 child_at_origin[hex->face(0)->refinement_case() -
9312 1][f_fl[0]][f_ro[0]]),
9314 hex->face(1)->child_index(
9315 child_at_origin[hex->face(1)->refinement_case() -
9316 1][f_fl[1]][f_ro[1]]),
9317 hex->face(1)->child_index(
9319 child_at_origin[hex->face(1)->refinement_case() -
9320 1][f_fl[1]][f_ro[1]]),
9322 hex->face(2)->child_index(
9323 child_at_origin[hex->face(2)->refinement_case() -
9324 1][f_fl[2]][f_ro[2]]),
9325 hex->face(2)->child_index(
9327 child_at_origin[hex->face(2)->refinement_case() -
9328 1][f_fl[2]][f_ro[2]]),
9330 hex->face(3)->child_index(
9331 child_at_origin[hex->face(3)->refinement_case() -
9332 1][f_fl[3]][f_ro[3]]),
9333 hex->face(3)->child_index(
9335 child_at_origin[hex->face(3)->refinement_case() -
9336 1][f_fl[3]][f_ro[3]]),
9338 hex->face(4)->index(),
9340 hex->face(5)->index()
9343 new_hexes[0]->set_bounding_object_indices(
9350 new_hexes[1]->set_bounding_object_indices(
9382 new_lines[0]->set_bounding_object_indices(
9383 {middle_vertex_index<dim, spacedim>(hex->face(4)),
9384 middle_vertex_index<dim, spacedim>(hex->face(5))});
9452 spacedim>::raw_line_iterator lines[13] = {
9453 hex->face(0)->child(0)->line(
9454 (hex->face(0)->refinement_case() ==
9458 hex->face(1)->child(0)->line(
9459 (hex->face(1)->refinement_case() ==
9463 hex->face(2)->child(0)->line(
9464 (hex->face(2)->refinement_case() ==
9468 hex->face(3)->child(0)->line(
9469 (hex->face(3)->refinement_case() ==
9477 0, f_or[4], f_fl[4], f_ro[4]))
9480 1, f_or[4], f_fl[4], f_ro[4])),
9484 3, f_or[4], f_fl[4], f_ro[4]))
9487 0, f_or[4], f_fl[4], f_ro[4])),
9491 0, f_or[4], f_fl[4], f_ro[4]))
9494 3, f_or[4], f_fl[4], f_ro[4])),
9498 3, f_or[4], f_fl[4], f_ro[4]))
9501 2, f_or[4], f_fl[4], f_ro[4])),
9506 0, f_or[5], f_fl[5], f_ro[5]))
9509 1, f_or[5], f_fl[5], f_ro[5])),
9513 3, f_or[5], f_fl[5], f_ro[5]))
9516 0, f_or[5], f_fl[5], f_ro[5])),
9520 0, f_or[5], f_fl[5], f_ro[5]))
9523 3, f_or[5], f_fl[5], f_ro[5])),
9527 3, f_or[5], f_fl[5], f_ro[5]))
9530 2, f_or[5], f_fl[5], f_ro[5])),
9535 unsigned int line_indices[13];
9536 for (
unsigned int i = 0; i < 13; ++i)
9537 line_indices[i] = lines[i]->
index();
9548 const unsigned int middle_vertices[4] = {
9549 hex->line(0)->child(0)->vertex_index(1),
9550 hex->line(1)->child(0)->vertex_index(1),
9551 hex->line(2)->child(0)->vertex_index(1),
9552 hex->line(3)->child(0)->vertex_index(1),
9558 for (
unsigned int i = 0; i < 4; ++i)
9559 if (lines[i]->vertex_index(0) == middle_vertices[i])
9560 line_orientation[i] =
9565 Assert(lines[i]->vertex_index(1) ==
9568 line_orientation[i] =
9578 for (
unsigned int i = 4; i < 12; ++i)
9579 if (lines[i]->vertex_index((i + 1) % 2) ==
9580 middle_vertex_index<dim, spacedim>(
9581 hex->face(3 + i / 4)))
9582 line_orientation[i] =
9587 Assert(lines[i]->vertex_index(i % 2) ==
9588 (middle_vertex_index<dim, spacedim>(
9589 hex->face(3 + i / 4))),
9591 line_orientation[i] =
9597 line_orientation[12] =
9623 new_quads[0]->set_bounding_object_indices(
9628 new_quads[1]->set_bounding_object_indices(
9633 new_quads[2]->set_bounding_object_indices(
9638 new_quads[3]->set_bounding_object_indices(
9644 new_quads[0]->set_line_orientation(
9645 0, line_orientation[2]);
9646 new_quads[0]->set_line_orientation(
9647 2, line_orientation[4]);
9648 new_quads[0]->set_line_orientation(
9649 3, line_orientation[8]);
9651 new_quads[1]->set_line_orientation(
9652 1, line_orientation[3]);
9653 new_quads[1]->set_line_orientation(
9654 2, line_orientation[5]);
9655 new_quads[1]->set_line_orientation(
9656 3, line_orientation[9]);
9658 new_quads[2]->set_line_orientation(
9659 0, line_orientation[6]);
9660 new_quads[2]->set_line_orientation(
9661 1, line_orientation[10]);
9662 new_quads[2]->set_line_orientation(
9663 2, line_orientation[0]);
9665 new_quads[3]->set_line_orientation(
9666 0, line_orientation[7]);
9667 new_quads[3]->set_line_orientation(
9668 1, line_orientation[11]);
9669 new_quads[3]->set_line_orientation(
9670 3, line_orientation[1]);
9703 const int quad_indices[20] = {
9704 new_quads[0]->index(),
9705 new_quads[1]->index(),
9706 new_quads[2]->index(),
9707 new_quads[3]->index(),
9709 hex->face(0)->child_index(
9710 child_at_origin[hex->face(0)->refinement_case() -
9711 1][f_fl[0]][f_ro[0]]),
9712 hex->face(0)->child_index(
9714 child_at_origin[hex->face(0)->refinement_case() -
9715 1][f_fl[0]][f_ro[0]]),
9717 hex->face(1)->child_index(
9718 child_at_origin[hex->face(1)->refinement_case() -
9719 1][f_fl[1]][f_ro[1]]),
9720 hex->face(1)->child_index(
9722 child_at_origin[hex->face(1)->refinement_case() -
9723 1][f_fl[1]][f_ro[1]]),
9725 hex->face(2)->child_index(
9726 child_at_origin[hex->face(2)->refinement_case() -
9727 1][f_fl[2]][f_ro[2]]),
9728 hex->face(2)->child_index(
9730 child_at_origin[hex->face(2)->refinement_case() -
9731 1][f_fl[2]][f_ro[2]]),
9733 hex->face(3)->child_index(
9734 child_at_origin[hex->face(3)->refinement_case() -
9735 1][f_fl[3]][f_ro[3]]),
9736 hex->face(3)->child_index(
9738 child_at_origin[hex->face(3)->refinement_case() -
9739 1][f_fl[3]][f_ro[3]]),
9741 hex->face(4)->isotropic_child_index(
9743 0, f_or[4], f_fl[4], f_ro[4])),
9744 hex->face(4)->isotropic_child_index(
9746 1, f_or[4], f_fl[4], f_ro[4])),
9747 hex->face(4)->isotropic_child_index(
9749 2, f_or[4], f_fl[4], f_ro[4])),
9750 hex->face(4)->isotropic_child_index(
9752 3, f_or[4], f_fl[4], f_ro[4])),
9754 hex->face(5)->isotropic_child_index(
9756 0, f_or[5], f_fl[5], f_ro[5])),
9757 hex->face(5)->isotropic_child_index(
9759 1, f_or[5], f_fl[5], f_ro[5])),
9760 hex->face(5)->isotropic_child_index(
9762 2, f_or[5], f_fl[5], f_ro[5])),
9763 hex->face(5)->isotropic_child_index(
9765 3, f_or[5], f_fl[5], f_ro[5]))};
9767 new_hexes[0]->set_bounding_object_indices(
9774 new_hexes[1]->set_bounding_object_indices(
9781 new_hexes[2]->set_bounding_object_indices(
9788 new_hexes[3]->set_bounding_object_indices(
9820 new_lines[0]->set_bounding_object_indices(
9821 {middle_vertex_index<dim, spacedim>(hex->face(2)),
9822 middle_vertex_index<dim, spacedim>(hex->face(3))});
9890 spacedim>::raw_line_iterator lines[13] = {
9891 hex->face(0)->child(0)->line(
9892 (hex->face(0)->refinement_case() ==
9896 hex->face(1)->child(0)->line(
9897 (hex->face(1)->refinement_case() ==
9901 hex->face(4)->child(0)->line(
9902 (hex->face(4)->refinement_case() ==
9906 hex->face(5)->child(0)->line(
9907 (hex->face(5)->refinement_case() ==
9915 0, f_or[2], f_fl[2], f_ro[2]))
9918 3, f_or[2], f_fl[2], f_ro[2])),
9922 3, f_or[2], f_fl[2], f_ro[2]))
9925 2, f_or[2], f_fl[2], f_ro[2])),
9929 0, f_or[2], f_fl[2], f_ro[2]))
9932 1, f_or[2], f_fl[2], f_ro[2])),
9936 3, f_or[2], f_fl[2], f_ro[2]))
9939 0, f_or[2], f_fl[2], f_ro[2])),
9944 0, f_or[3], f_fl[3], f_ro[3]))
9947 3, f_or[3], f_fl[3], f_ro[3])),
9951 3, f_or[3], f_fl[3], f_ro[3]))
9954 2, f_or[3], f_fl[3], f_ro[3])),
9958 0, f_or[3], f_fl[3], f_ro[3]))
9961 1, f_or[3], f_fl[3], f_ro[3])),
9965 3, f_or[3], f_fl[3], f_ro[3]))
9968 0, f_or[3], f_fl[3], f_ro[3])),
9973 unsigned int line_indices[13];
9974 for (
unsigned int i = 0; i < 13; ++i)
9975 line_indices[i] = lines[i]->
index();
9986 const unsigned int middle_vertices[4] = {
9987 hex->line(8)->child(0)->vertex_index(1),
9988 hex->line(9)->child(0)->vertex_index(1),
9989 hex->line(2)->child(0)->vertex_index(1),
9990 hex->line(6)->child(0)->vertex_index(1),
9995 for (
unsigned int i = 0; i < 4; ++i)
9996 if (lines[i]->vertex_index(0) == middle_vertices[i])
9997 line_orientation[i] =
10002 Assert(lines[i]->vertex_index(1) ==
10003 middle_vertices[i],
10005 line_orientation[i] =
10015 for (
unsigned int i = 4; i < 12; ++i)
10016 if (lines[i]->vertex_index((i + 1) % 2) ==
10017 middle_vertex_index<dim, spacedim>(
10018 hex->face(1 + i / 4)))
10019 line_orientation[i] =
10025 Assert(lines[i]->vertex_index(i % 2) ==
10026 (middle_vertex_index<dim, spacedim>(
10027 hex->face(1 + i / 4))),
10029 line_orientation[i] =
10035 line_orientation[12] =
10062 new_quads[0]->set_bounding_object_indices(
10066 line_indices[10]});
10067 new_quads[1]->set_bounding_object_indices(
10071 line_indices[11]});
10072 new_quads[2]->set_bounding_object_indices(
10076 line_indices[12]});
10077 new_quads[3]->set_bounding_object_indices(
10083 new_quads[0]->set_line_orientation(
10084 0, line_orientation[0]);
10085 new_quads[0]->set_line_orientation(
10086 2, line_orientation[6]);
10087 new_quads[0]->set_line_orientation(
10088 3, line_orientation[10]);
10090 new_quads[1]->set_line_orientation(
10091 1, line_orientation[1]);
10092 new_quads[1]->set_line_orientation(
10093 2, line_orientation[7]);
10094 new_quads[1]->set_line_orientation(
10095 3, line_orientation[11]);
10097 new_quads[2]->set_line_orientation(
10098 0, line_orientation[4]);
10099 new_quads[2]->set_line_orientation(
10100 1, line_orientation[8]);
10101 new_quads[2]->set_line_orientation(
10102 2, line_orientation[2]);
10104 new_quads[3]->set_line_orientation(
10105 0, line_orientation[5]);
10106 new_quads[3]->set_line_orientation(
10107 1, line_orientation[9]);
10108 new_quads[3]->set_line_orientation(
10109 3, line_orientation[3]);
10143 const int quad_indices[20] = {
10144 new_quads[0]->index(),
10145 new_quads[1]->index(),
10146 new_quads[2]->index(),
10147 new_quads[3]->index(),
10149 hex->face(0)->child_index(
10150 child_at_origin[hex->face(0)->refinement_case() -
10151 1][f_fl[0]][f_ro[0]]),
10152 hex->face(0)->child_index(
10154 child_at_origin[hex->face(0)->refinement_case() -
10155 1][f_fl[0]][f_ro[0]]),
10157 hex->face(1)->child_index(
10158 child_at_origin[hex->face(1)->refinement_case() -
10159 1][f_fl[1]][f_ro[1]]),
10160 hex->face(1)->child_index(
10162 child_at_origin[hex->face(1)->refinement_case() -
10163 1][f_fl[1]][f_ro[1]]),
10165 hex->face(2)->isotropic_child_index(
10167 0, f_or[2], f_fl[2], f_ro[2])),
10168 hex->face(2)->isotropic_child_index(
10170 1, f_or[2], f_fl[2], f_ro[2])),
10171 hex->face(2)->isotropic_child_index(
10173 2, f_or[2], f_fl[2], f_ro[2])),
10174 hex->face(2)->isotropic_child_index(
10176 3, f_or[2], f_fl[2], f_ro[2])),
10178 hex->face(3)->isotropic_child_index(
10180 0, f_or[3], f_fl[3], f_ro[3])),
10181 hex->face(3)->isotropic_child_index(
10183 1, f_or[3], f_fl[3], f_ro[3])),
10184 hex->face(3)->isotropic_child_index(
10186 2, f_or[3], f_fl[3], f_ro[3])),
10187 hex->face(3)->isotropic_child_index(
10189 3, f_or[3], f_fl[3], f_ro[3])),
10191 hex->face(4)->child_index(
10192 child_at_origin[hex->face(4)->refinement_case() -
10193 1][f_fl[4]][f_ro[4]]),
10194 hex->face(4)->child_index(
10196 child_at_origin[hex->face(4)->refinement_case() -
10197 1][f_fl[4]][f_ro[4]]),
10199 hex->face(5)->child_index(
10200 child_at_origin[hex->face(5)->refinement_case() -
10201 1][f_fl[5]][f_ro[5]]),
10202 hex->face(5)->child_index(
10204 child_at_origin[hex->face(5)->refinement_case() -
10205 1][f_fl[5]][f_ro[5]])};
10216 new_hexes[0]->set_bounding_object_indices(
10223 new_hexes[1]->set_bounding_object_indices(
10229 quad_indices[18]});
10230 new_hexes[2]->set_bounding_object_indices(
10237 new_hexes[3]->set_bounding_object_indices(
10243 quad_indices[19]});
10270 new_lines[0]->set_bounding_object_indices(
10272 {middle_vertex_index<dim, spacedim>(hex->face(0)),
10273 middle_vertex_index<dim, spacedim>(hex->face(1))});
10342 spacedim>::raw_line_iterator lines[13] = {
10343 hex->face(2)->child(0)->line(
10344 (hex->face(2)->refinement_case() ==
10348 hex->face(3)->child(0)->line(
10349 (hex->face(3)->refinement_case() ==
10353 hex->face(4)->child(0)->line(
10354 (hex->face(4)->refinement_case() ==
10358 hex->face(5)->child(0)->line(
10359 (hex->face(5)->refinement_case() ==
10367 0, f_or[0], f_fl[0], f_ro[0]))
10370 1, f_or[0], f_fl[0], f_ro[0])),
10374 3, f_or[0], f_fl[0], f_ro[0]))
10377 0, f_or[0], f_fl[0], f_ro[0])),
10381 0, f_or[0], f_fl[0], f_ro[0]))
10384 3, f_or[0], f_fl[0], f_ro[0])),
10388 3, f_or[0], f_fl[0], f_ro[0]))
10391 2, f_or[0], f_fl[0], f_ro[0])),
10396 0, f_or[1], f_fl[1], f_ro[1]))
10399 1, f_or[1], f_fl[1], f_ro[1])),
10403 3, f_or[1], f_fl[1], f_ro[1]))
10406 0, f_or[1], f_fl[1], f_ro[1])),
10410 0, f_or[1], f_fl[1], f_ro[1]))
10413 3, f_or[1], f_fl[1], f_ro[1])),
10417 3, f_or[1], f_fl[1], f_ro[1]))
10420 2, f_or[1], f_fl[1], f_ro[1])),
10425 unsigned int line_indices[13];
10427 for (
unsigned int i = 0; i < 13; ++i)
10428 line_indices[i] = lines[i]->
index();
10439 const unsigned int middle_vertices[4] = {
10440 hex->line(8)->child(0)->vertex_index(1),
10441 hex->line(10)->child(0)->vertex_index(1),
10442 hex->line(0)->child(0)->vertex_index(1),
10443 hex->line(4)->child(0)->vertex_index(1),
10448 for (
unsigned int i = 0; i < 4; ++i)
10449 if (lines[i]->vertex_index(0) == middle_vertices[i])
10450 line_orientation[i] =
10455 Assert(lines[i]->vertex_index(1) ==
10456 middle_vertices[i],
10458 line_orientation[i] =
10468 for (
unsigned int i = 4; i < 12; ++i)
10469 if (lines[i]->vertex_index((i + 1) % 2) ==
10470 middle_vertex_index<dim, spacedim>(
10471 hex->face(i / 4 - 1)))
10472 line_orientation[i] =
10477 Assert(lines[i]->vertex_index(i % 2) ==
10478 (middle_vertex_index<dim, spacedim>(
10479 hex->face(i / 4 - 1))),
10481 line_orientation[i] =
10486 line_orientation[12] =
10507 new_quads[0]->set_bounding_object_indices(
10511 line_indices[12]});
10512 new_quads[1]->set_bounding_object_indices(
10517 new_quads[2]->set_bounding_object_indices(
10522 new_quads[3]->set_bounding_object_indices(
10528 new_quads[0]->set_line_orientation(
10529 0, line_orientation[6]);
10530 new_quads[0]->set_line_orientation(
10531 1, line_orientation[10]);
10532 new_quads[0]->set_line_orientation(
10533 2, line_orientation[0]);
10535 new_quads[1]->set_line_orientation(
10536 0, line_orientation[7]);
10537 new_quads[1]->set_line_orientation(
10538 1, line_orientation[11]);
10539 new_quads[1]->set_line_orientation(
10540 3, line_orientation[1]);
10542 new_quads[2]->set_line_orientation(
10543 0, line_orientation[2]);
10544 new_quads[2]->set_line_orientation(
10545 2, line_orientation[4]);
10546 new_quads[2]->set_line_orientation(
10547 3, line_orientation[8]);
10549 new_quads[3]->set_line_orientation(
10550 1, line_orientation[3]);
10551 new_quads[3]->set_line_orientation(
10552 2, line_orientation[5]);
10553 new_quads[3]->set_line_orientation(
10554 3, line_orientation[9]);
10588 const int quad_indices[20] = {
10589 new_quads[0]->index(),
10590 new_quads[1]->index(),
10591 new_quads[2]->index(),
10592 new_quads[3]->index(),
10594 hex->face(0)->isotropic_child_index(
10596 0, f_or[0], f_fl[0], f_ro[0])),
10597 hex->face(0)->isotropic_child_index(
10599 1, f_or[0], f_fl[0], f_ro[0])),
10600 hex->face(0)->isotropic_child_index(
10602 2, f_or[0], f_fl[0], f_ro[0])),
10603 hex->face(0)->isotropic_child_index(
10605 3, f_or[0], f_fl[0], f_ro[0])),
10607 hex->face(1)->isotropic_child_index(
10609 0, f_or[1], f_fl[1], f_ro[1])),
10610 hex->face(1)->isotropic_child_index(
10612 1, f_or[1], f_fl[1], f_ro[1])),
10613 hex->face(1)->isotropic_child_index(
10615 2, f_or[1], f_fl[1], f_ro[1])),
10616 hex->face(1)->isotropic_child_index(
10618 3, f_or[1], f_fl[1], f_ro[1])),
10620 hex->face(2)->child_index(
10621 child_at_origin[hex->face(2)->refinement_case() -
10622 1][f_fl[2]][f_ro[2]]),
10623 hex->face(2)->child_index(
10625 child_at_origin[hex->face(2)->refinement_case() -
10626 1][f_fl[2]][f_ro[2]]),
10628 hex->face(3)->child_index(
10629 child_at_origin[hex->face(3)->refinement_case() -
10630 1][f_fl[3]][f_ro[3]]),
10631 hex->face(3)->child_index(
10633 child_at_origin[hex->face(3)->refinement_case() -
10634 1][f_fl[3]][f_ro[3]]),
10636 hex->face(4)->child_index(
10637 child_at_origin[hex->face(4)->refinement_case() -
10638 1][f_fl[4]][f_ro[4]]),
10639 hex->face(4)->child_index(
10641 child_at_origin[hex->face(4)->refinement_case() -
10642 1][f_fl[4]][f_ro[4]]),
10644 hex->face(5)->child_index(
10645 child_at_origin[hex->face(5)->refinement_case() -
10646 1][f_fl[5]][f_ro[5]]),
10647 hex->face(5)->child_index(
10649 child_at_origin[hex->face(5)->refinement_case() -
10650 1][f_fl[5]][f_ro[5]])};
10652 new_hexes[0]->set_bounding_object_indices(
10659 new_hexes[1]->set_bounding_object_indices(
10666 new_hexes[2]->set_bounding_object_indices(
10672 quad_indices[18]});
10673 new_hexes[3]->set_bounding_object_indices(
10679 quad_indices[19]});
10711 ++next_unused_vertex;
10715 "Internal error: During refinement, the triangulation wants to access an element of the 'vertices' array but it turns out that the array is not large enough."));
10726 hex->center(
true,
true);
10748 middle_vertex_index<dim, spacedim>(hex->face(0)),
10749 middle_vertex_index<dim, spacedim>(hex->face(1)),
10750 middle_vertex_index<dim, spacedim>(hex->face(2)),
10751 middle_vertex_index<dim, spacedim>(hex->face(3)),
10752 middle_vertex_index<dim, spacedim>(hex->face(4)),
10753 middle_vertex_index<dim, spacedim>(hex->face(5)),
10754 next_unused_vertex};
10756 new_lines[0]->set_bounding_object_indices(
10758 new_lines[1]->set_bounding_object_indices(
10760 new_lines[2]->set_bounding_object_indices(
10762 new_lines[3]->set_bounding_object_indices(
10764 new_lines[4]->set_bounding_object_indices(
10766 new_lines[5]->set_bounding_object_indices(
10836 spacedim>::raw_line_iterator lines[30] = {
10840 0, f_or[0], f_fl[0], f_ro[0]))
10843 1, f_or[0], f_fl[0], f_ro[0])),
10847 3, f_or[0], f_fl[0], f_ro[0]))
10850 0, f_or[0], f_fl[0], f_ro[0])),
10854 0, f_or[0], f_fl[0], f_ro[0]))
10857 3, f_or[0], f_fl[0], f_ro[0])),
10861 3, f_or[0], f_fl[0], f_ro[0]))
10864 2, f_or[0], f_fl[0], f_ro[0])),
10869 0, f_or[1], f_fl[1], f_ro[1]))
10872 1, f_or[1], f_fl[1], f_ro[1])),
10876 3, f_or[1], f_fl[1], f_ro[1]))
10879 0, f_or[1], f_fl[1], f_ro[1])),
10883 0, f_or[1], f_fl[1], f_ro[1]))
10886 3, f_or[1], f_fl[1], f_ro[1])),
10890 3, f_or[1], f_fl[1], f_ro[1]))
10893 2, f_or[1], f_fl[1], f_ro[1])),
10898 0, f_or[2], f_fl[2], f_ro[2]))
10901 1, f_or[2], f_fl[2], f_ro[2])),
10905 3, f_or[2], f_fl[2], f_ro[2]))
10908 0, f_or[2], f_fl[2], f_ro[2])),
10912 0, f_or[2], f_fl[2], f_ro[2]))
10915 3, f_or[2], f_fl[2], f_ro[2])),
10919 3, f_or[2], f_fl[2], f_ro[2]))
10922 2, f_or[2], f_fl[2], f_ro[2])),
10927 0, f_or[3], f_fl[3], f_ro[3]))
10930 1, f_or[3], f_fl[3], f_ro[3])),
10934 3, f_or[3], f_fl[3], f_ro[3]))
10937 0, f_or[3], f_fl[3], f_ro[3])),
10941 0, f_or[3], f_fl[3], f_ro[3]))
10944 3, f_or[3], f_fl[3], f_ro[3])),
10948 3, f_or[3], f_fl[3], f_ro[3]))
10951 2, f_or[3], f_fl[3], f_ro[3])),
10956 0, f_or[4], f_fl[4], f_ro[4]))
10959 1, f_or[4], f_fl[4], f_ro[4])),
10963 3, f_or[4], f_fl[4], f_ro[4]))
10966 0, f_or[4], f_fl[4], f_ro[4])),
10970 0, f_or[4], f_fl[4], f_ro[4]))
10973 3, f_or[4], f_fl[4], f_ro[4])),
10977 3, f_or[4], f_fl[4], f_ro[4]))
10980 2, f_or[4], f_fl[4], f_ro[4])),
10985 0, f_or[5], f_fl[5], f_ro[5]))
10988 1, f_or[5], f_fl[5], f_ro[5])),
10992 3, f_or[5], f_fl[5], f_ro[5]))
10995 0, f_or[5], f_fl[5], f_ro[5])),
10999 0, f_or[5], f_fl[5], f_ro[5]))
11002 3, f_or[5], f_fl[5], f_ro[5])),
11006 3, f_or[5], f_fl[5], f_ro[5]))
11009 2, f_or[5], f_fl[5], f_ro[5])),
11019 unsigned int line_indices[30];
11020 for (
unsigned int i = 0; i < 30; ++i)
11021 line_indices[i] = lines[i]->
index();
11036 for (
unsigned int i = 0; i < 24; ++i)
11037 if (lines[i]->vertex_index((i + 1) % 2) ==
11039 line_orientation[i] =
11045 Assert(lines[i]->vertex_index(i % 2) ==
11048 line_orientation[i] =
11054 for (
unsigned int i = 24; i < 30; ++i)
11055 line_orientation[i] =
11088 new_quads[0]->set_bounding_object_indices(
11092 line_indices[24]});
11093 new_quads[1]->set_bounding_object_indices(
11097 line_indices[25]});
11098 new_quads[2]->set_bounding_object_indices(
11102 line_indices[20]});
11103 new_quads[3]->set_bounding_object_indices(
11107 line_indices[21]});
11108 new_quads[4]->set_bounding_object_indices(
11112 line_indices[28]});
11113 new_quads[5]->set_bounding_object_indices(
11117 line_indices[29]});
11118 new_quads[6]->set_bounding_object_indices(
11123 new_quads[7]->set_bounding_object_indices(
11128 new_quads[8]->set_bounding_object_indices(
11132 line_indices[26]});
11133 new_quads[9]->set_bounding_object_indices(
11137 line_indices[27]});
11138 new_quads[10]->set_bounding_object_indices(
11142 line_indices[12]});
11143 new_quads[11]->set_bounding_object_indices(
11147 line_indices[13]});
11152 new_quads[0]->set_line_orientation(
11153 0, line_orientation[10]);
11154 new_quads[0]->set_line_orientation(
11155 2, line_orientation[16]);
11157 new_quads[1]->set_line_orientation(
11158 1, line_orientation[14]);
11159 new_quads[1]->set_line_orientation(
11160 2, line_orientation[17]);
11162 new_quads[2]->set_line_orientation(
11163 0, line_orientation[11]);
11164 new_quads[2]->set_line_orientation(
11165 3, line_orientation[20]);
11167 new_quads[3]->set_line_orientation(
11168 1, line_orientation[15]);
11169 new_quads[3]->set_line_orientation(
11170 3, line_orientation[21]);
11172 new_quads[4]->set_line_orientation(
11173 0, line_orientation[18]);
11174 new_quads[4]->set_line_orientation(
11175 2, line_orientation[0]);
11177 new_quads[5]->set_line_orientation(
11178 1, line_orientation[22]);
11179 new_quads[5]->set_line_orientation(
11180 2, line_orientation[1]);
11182 new_quads[6]->set_line_orientation(
11183 0, line_orientation[19]);
11184 new_quads[6]->set_line_orientation(
11185 3, line_orientation[4]);
11187 new_quads[7]->set_line_orientation(
11188 1, line_orientation[23]);
11189 new_quads[7]->set_line_orientation(
11190 3, line_orientation[5]);
11192 new_quads[8]->set_line_orientation(
11193 0, line_orientation[2]);
11194 new_quads[8]->set_line_orientation(
11195 2, line_orientation[8]);
11197 new_quads[9]->set_line_orientation(
11198 1, line_orientation[6]);
11199 new_quads[9]->set_line_orientation(
11200 2, line_orientation[9]);
11202 new_quads[10]->set_line_orientation(
11203 0, line_orientation[3]);
11204 new_quads[10]->set_line_orientation(
11205 3, line_orientation[12]);
11207 new_quads[11]->set_line_orientation(
11208 1, line_orientation[7]);
11209 new_quads[11]->set_line_orientation(
11210 3, line_orientation[13]);
11251 const int quad_indices[36] = {
11252 new_quads[0]->index(),
11253 new_quads[1]->index(),
11254 new_quads[2]->index(),
11255 new_quads[3]->index(),
11256 new_quads[4]->index(),
11257 new_quads[5]->index(),
11258 new_quads[6]->index(),
11259 new_quads[7]->index(),
11260 new_quads[8]->index(),
11261 new_quads[9]->index(),
11262 new_quads[10]->index(),
11263 new_quads[11]->index(),
11265 hex->face(0)->isotropic_child_index(
11267 0, f_or[0], f_fl[0], f_ro[0])),
11268 hex->face(0)->isotropic_child_index(
11270 1, f_or[0], f_fl[0], f_ro[0])),
11271 hex->face(0)->isotropic_child_index(
11273 2, f_or[0], f_fl[0], f_ro[0])),
11274 hex->face(0)->isotropic_child_index(
11276 3, f_or[0], f_fl[0], f_ro[0])),
11278 hex->face(1)->isotropic_child_index(
11280 0, f_or[1], f_fl[1], f_ro[1])),
11281 hex->face(1)->isotropic_child_index(
11283 1, f_or[1], f_fl[1], f_ro[1])),
11284 hex->face(1)->isotropic_child_index(
11286 2, f_or[1], f_fl[1], f_ro[1])),
11287 hex->face(1)->isotropic_child_index(
11289 3, f_or[1], f_fl[1], f_ro[1])),
11291 hex->face(2)->isotropic_child_index(
11293 0, f_or[2], f_fl[2], f_ro[2])),
11294 hex->face(2)->isotropic_child_index(
11296 1, f_or[2], f_fl[2], f_ro[2])),
11297 hex->face(2)->isotropic_child_index(
11299 2, f_or[2], f_fl[2], f_ro[2])),
11300 hex->face(2)->isotropic_child_index(
11302 3, f_or[2], f_fl[2], f_ro[2])),
11304 hex->face(3)->isotropic_child_index(
11306 0, f_or[3], f_fl[3], f_ro[3])),
11307 hex->face(3)->isotropic_child_index(
11309 1, f_or[3], f_fl[3], f_ro[3])),
11310 hex->face(3)->isotropic_child_index(
11312 2, f_or[3], f_fl[3], f_ro[3])),
11313 hex->face(3)->isotropic_child_index(
11315 3, f_or[3], f_fl[3], f_ro[3])),
11317 hex->face(4)->isotropic_child_index(
11319 0, f_or[4], f_fl[4], f_ro[4])),
11320 hex->face(4)->isotropic_child_index(
11322 1, f_or[4], f_fl[4], f_ro[4])),
11323 hex->face(4)->isotropic_child_index(
11325 2, f_or[4], f_fl[4], f_ro[4])),
11326 hex->face(4)->isotropic_child_index(
11328 3, f_or[4], f_fl[4], f_ro[4])),
11330 hex->face(5)->isotropic_child_index(
11332 0, f_or[5], f_fl[5], f_ro[5])),
11333 hex->face(5)->isotropic_child_index(
11335 1, f_or[5], f_fl[5], f_ro[5])),
11336 hex->face(5)->isotropic_child_index(
11338 2, f_or[5], f_fl[5], f_ro[5])),
11339 hex->face(5)->isotropic_child_index(
11341 3, f_or[5], f_fl[5], f_ro[5]))};
11344 new_hexes[0]->set_bounding_object_indices(
11351 new_hexes[1]->set_bounding_object_indices(
11358 new_hexes[2]->set_bounding_object_indices(
11364 quad_indices[10]});
11365 new_hexes[3]->set_bounding_object_indices(
11371 quad_indices[11]});
11374 new_hexes[4]->set_bounding_object_indices(
11380 quad_indices[32]});
11381 new_hexes[5]->set_bounding_object_indices(
11387 quad_indices[33]});
11388 new_hexes[6]->set_bounding_object_indices(
11394 quad_indices[34]});
11395 new_hexes[7]->set_bounding_object_indices(
11401 quad_indices[35]});
11435 for (
unsigned int s = 0;
11442 const unsigned int current_child =
11451 ref_case, f, f_or[f], f_fl[f], f_ro[f]));
11452 new_hexes[current_child]->set_combined_face_orientation(
11458 if (check_for_distorted_cells &&
11459 has_distorted_children<dim, spacedim>(hex))
11479 return cells_with_distorted_children;