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())
5994 unsigned int needed_vertices = 0;
5995 unsigned int needed_lines_single = 0;
5996 unsigned int needed_quads_single = 0;
5997 unsigned int needed_lines_pair = 0;
5998 unsigned int needed_quads_pair = 0;
6001 unsigned int new_cells = 0;
6003 for (
const auto &cell :
6005 if (cell->refine_flag_set())
6008 Assert(cell->refine_flag_set() ==
6014 new_cells += cell->reference_cell().n_isotropic_children();
6019 needed_lines_single += 6;
6020 needed_quads_single += 12;
6022 else if (cell->reference_cell() ==
6025 needed_lines_single += 1;
6026 needed_quads_single += 8;
6037 for (
const auto face : cell->face_indices())
6038 if (cell->face(face)->n_children() == 0)
6039 cell->face(face)->set_user_flag();
6041 Assert(cell->face(face)->n_children() ==
6042 cell->reference_cell()
6043 .face_reference_cell(face)
6044 .n_isotropic_children(),
6047 for (
const auto line : cell->line_indices())
6048 if (cell->line(line)->has_children() ==
false)
6049 cell->line(line)->set_user_flag();
6051 Assert(cell->line(line)->n_children() == 2,
6055 const unsigned int used_cells =
6062 used_cells + new_cells,
6067 used_cells + new_cells,
6081 if (quad->user_flag_set() ==
false)
6086 needed_quads_pair += 4;
6087 needed_lines_pair += 4;
6088 needed_vertices += 1;
6092 needed_quads_pair += 4;
6093 needed_lines_single += 3;
6106 if (line->user_flag_set() ==
false)
6109 needed_lines_pair += 2;
6110 needed_vertices += 1;
6115 needed_lines_single);
6118 needed_quads_single);
6121 needed_quads_single);
6125 needed_vertices += std::count(
triangulation.vertices_used.begin(),
6147 for (
const auto &cell :
triangulation.active_cell_iterators())
6148 if (!cell->refine_flag_set())
6149 for (
unsigned int line_n = 0; line_n < cell->n_lines();
6151 if (cell->line(line_n)->has_children())
6152 for (
unsigned int c = 0; c < 2; ++c)
6153 Assert(cell->line(line_n)->child(c)->user_flag_set() ==
6158 unsigned int current_vertex = 0;
6162 auto get_next_unused_vertex = [](
const unsigned int current_vertex,
6163 std::vector<bool> &vertices_used) {
6164 unsigned int next_vertex = current_vertex;
6165 while (next_vertex < vertices_used.size() &&
6166 vertices_used[next_vertex] ==
true)
6169 vertices_used[next_vertex] =
true;
6179 raw_line_iterator next_unused_line =
triangulation.begin_raw_line();
6181 for (; line != endl; ++line)
6183 if (line->user_flag_set() ==
false)
6187 triangulation.faces->lines.template next_free_pair_object<1>(
6195 line->set_children(0, next_unused_line->index());
6197 const std::array<raw_line_iterator, 2> children{
6198 {next_unused_line, ++next_unused_line}};
6204 get_next_unused_vertex(current_vertex,
6206 triangulation.vertices[current_vertex] = line->center(
true);
6208 children[0]->set_bounding_object_indices(
6209 {line->vertex_index(0), current_vertex});
6210 children[1]->set_bounding_object_indices(
6211 {current_vertex, line->vertex_index(1)});
6213 const auto manifold_id = line->manifold_id();
6214 const auto boundary_id = line->boundary_id();
6215 for (
const auto &child : children)
6217 child->set_used_flag();
6218 child->clear_children();
6220 child->clear_user_flag();
6221 child->set_boundary_id_internal(boundary_id);
6222 child->set_manifold_id(manifold_id);
6225 line->clear_user_flag();
6235 for (; quad != endq; ++quad)
6237 if (quad->user_flag_set() ==
false)
6240 const auto reference_face_type = quad->reference_cell();
6244 std::array<raw_line_iterator, 4> new_lines;
6247 for (
unsigned int l = 0; l < 2; ++l)
6249 auto next_unused_line =
6252 new_lines[2 * l] = next_unused_line;
6253 new_lines[2 * l + 1] = ++next_unused_line;
6258 for (
unsigned int l = 0; l < 3; ++l)
6270 for (
const unsigned int line : quad->line_indices())
6276 std::array<raw_quad_iterator, 4> new_quads;
6277 for (
unsigned int q = 0; q < 2; ++q)
6279 auto next_unused_quad =
6283 new_quads[2 * q] = next_unused_quad;
6284 new_quads[2 * q + 1] = ++next_unused_quad;
6286 quad->set_children(2 * q, new_quads[2 * q]->
index());
6292 for (
const auto &quad : new_quads)
6302 for (
const auto i : quad->vertex_indices())
6305 for (
const auto i : quad->line_indices())
6311 get_next_unused_vertex(current_vertex,
6316 quad->center(
true,
true);
6320 std::array<raw_line_iterator, 12> lines;
6321 unsigned int n_lines = 0;
6322 for (
unsigned int l = 0; l < quad->
n_lines(); ++l)
6323 for (
unsigned int c = 0; c < 2; ++c)
6324 lines[n_lines++] = quad->line(l)->child(
6325 child_line_index(c, quad->line_orientation(l)));
6327 for (
unsigned int l = 0; l < quad->
n_lines(); ++l)
6328 lines[n_lines++] = new_lines[l];
6330 std::array<int, 12> line_indices;
6331 for (
unsigned int i = 0; i < n_lines; ++i)
6332 line_indices[i] = lines[i]->
index();
6334 static constexpr ::ndarray<unsigned int, 12, 2>
6335 line_vertices_quad{{{{0, 4}},
6348 static constexpr ::ndarray<unsigned int, 4, 4>
6349 quad_lines_quad{{{{0, 8, 4, 10}},
6354 static constexpr ::ndarray<unsigned int, 12, 2>
6355 line_vertices_tri{{{{0, 3}},
6368 static constexpr ::ndarray<unsigned int, 4, 4>
6369 quad_lines_tri{{{{0, 8, 5, X}},
6374 static constexpr ::ndarray<unsigned int, 4, 4, 2>
6375 quad_line_vertices_tri{
6376 {{{{{0, 3}}, {{3, 5}}, {{5, 0}}, {{X, X}}}},
6377 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
6378 {{{{5, 4}}, {{4, 2}}, {{2, 5}}, {{X, X}}}},
6379 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}}}};
6381 const auto &line_vertices =
6383 line_vertices_quad :
6385 const auto &quad_lines =
6390 for (
unsigned int i = 0, j = 2 * quad->
n_lines();
6394 auto &new_line = new_lines[i];
6395 new_line->set_bounding_object_indices(
6398 new_line->set_used_flag();
6399 new_line->clear_user_flag();
6400 new_line->clear_user_data();
6401 new_line->clear_children();
6402 new_line->set_boundary_id_internal(quad->boundary_id());
6403 new_line->set_manifold_id(quad->manifold_id());
6407 for (
unsigned int i = 0; i < new_quads.size(); ++i)
6409 auto &new_quad = new_quads[i];
6414 reference_face_type);
6417 new_quad->set_bounding_object_indices(
6418 {line_indices[quad_lines[i][0]],
6419 line_indices[quad_lines[i][1]],
6420 line_indices[quad_lines[i][2]]});
6422 new_quad->set_bounding_object_indices(
6423 {line_indices[quad_lines[i][0]],
6424 line_indices[quad_lines[i][1]],
6425 line_indices[quad_lines[i][2]],
6426 line_indices[quad_lines[i][3]]});
6430 new_quad->set_used_flag();
6431 new_quad->clear_user_flag();
6432 new_quad->clear_user_data();
6433 new_quad->clear_children();
6434 new_quad->set_boundary_id_internal(quad->boundary_id());
6435 new_quad->set_manifold_id(quad->manifold_id());
6437 [[maybe_unused]] std::set<unsigned int> s;
6444 for (
const auto f : new_quad->line_indices())
6446 const std::array<unsigned int, 2> vertices_0 = {
6447 {lines[quad_lines[i][f]]->vertex_index(0),
6448 lines[quad_lines[i][f]]->vertex_index(1)}};
6450 const std::array<unsigned int, 2> vertices_1 = {
6454 const auto orientation =
6462 for (
const auto i : vertices_0)
6464 for (
const auto i : vertices_1)
6468 new_quad->set_line_orientation(f, orientation);
6482 static constexpr ::ndarray<unsigned int, 4, 2>
6483 quad_child_boundary_lines{
6484 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
6486 for (
unsigned int i = 0; i < 4; ++i)
6487 for (
unsigned int j = 0; j < 2; ++j)
6488 new_quads[quad_child_boundary_lines[i][j]]
6489 ->set_line_orientation(i, quad->line_orientation(i));
6492 quad->clear_user_flag();
6497 cells_with_distorted_children;
6507 hex->level() >=
static_cast<int>(
level),
6511 hex->level() ==
static_cast<int>(
level);
6514 if (hex->refine_flag_set() ==
6518 const auto &reference_cell_type = hex->reference_cell();
6521 hex->clear_refine_flag();
6522 hex->set_refinement_case(ref_case);
6524 unsigned int n_new_lines = 0;
6525 unsigned int n_new_quads = 0;
6526 unsigned int n_new_hexes = 0;
6543 std::array<raw_line_iterator, 6> new_lines;
6544 for (
unsigned int i = 0; i < n_new_lines; ++i)
6551 new_lines[i]->set_used_flag();
6552 new_lines[i]->clear_user_flag();
6553 new_lines[i]->clear_user_data();
6554 new_lines[i]->clear_children();
6555 new_lines[i]->set_boundary_id_internal(
6557 new_lines[i]->set_manifold_id(hex->manifold_id());
6560 std::array<raw_quad_iterator, 12> new_quads;
6561 for (
unsigned int i = 0; i < n_new_quads; ++i)
6567 auto &new_quad = new_quads[i];
6573 reference_cell_type.face_reference_cell(0));
6576 new_quad->set_used_flag();
6577 new_quad->clear_user_flag();
6578 new_quad->clear_user_data();
6579 new_quad->clear_children();
6580 new_quad->set_boundary_id_internal(
6582 new_quad->set_manifold_id(hex->manifold_id());
6583 for (
const auto j : new_quads[i]->line_indices())
6584 new_quad->set_line_orientation(
6594 for (
unsigned int i = 0; i < n_new_hexes; ++i)
6603 new_hexes[i] = next_unused_hex;
6605 auto &new_hex = new_hexes[i];
6609 ->reference_cell[new_hex->index()] =
6610 reference_cell_type;
6613 new_hex->set_used_flag();
6614 new_hex->clear_user_flag();
6615 new_hex->clear_user_data();
6616 new_hex->clear_children();
6617 new_hex->set_material_id(hex->material_id());
6618 new_hex->set_manifold_id(hex->manifold_id());
6619 new_hex->set_subdomain_id(hex->subdomain_id());
6622 new_hex->set_parent(hex->index());
6627 for (
const auto f : new_hex->face_indices())
6628 new_hex->set_combined_face_orientation(
6631 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
6632 hex->set_children(2 * i, new_hexes[2 * i]->index());
6644 const unsigned int n_vertices =
6646 for (
unsigned int i = 0; i < n_vertices; ++i)
6649 const std::array<unsigned int, 12> line_indices =
6650 TriaAccessorImplementation::Implementation::
6651 get_line_indices_of_cell(*hex);
6663 for (
unsigned int l = 0; l < n_lines; ++l)
6673 for (
const unsigned int i : hex->face_indices())
6675 hex->face(i)->child(0)->vertex_index(3);
6679 get_next_unused_vertex(current_vertex,
6684 hex->center(
true,
true);
6688 unsigned int chosen_line_tetrahedron = 0;
6692 static constexpr ::ndarray<unsigned int, 6, 2>
6693 new_line_vertices = {{{{22, 26}},
6699 for (
unsigned int i = 0; i < n_new_lines; ++i)
6700 new_lines[i]->set_bounding_object_indices(
6710 static constexpr ::ndarray<unsigned int, 3, 2>
6711 new_line_vertices = {{{{6, 8}}, {{5, 7}}, {{4, 9}}}};
6715 std::uint8_t refinement_choice = hex->refine_choice();
6716 if (refinement_choice ==
6721 double min_distance =
6722 std::numeric_limits<double>::infinity();
6723 for (
unsigned int i = 0; i < new_line_vertices.size();
6726 const double current_distance =
6731 [new_line_vertices[i][1]]]);
6732 if (current_distance < min_distance)
6734 chosen_line_tetrahedron = i;
6735 min_distance = current_distance;
6739 else if (refinement_choice ==
6742 chosen_line_tetrahedron = 0;
6743 else if (refinement_choice ==
6746 chosen_line_tetrahedron = 1;
6747 else if (refinement_choice ==
6750 chosen_line_tetrahedron = 2;
6754 hex->set_refinement_case(
6757 new_lines[0]->set_bounding_object_indices(
6759 [new_line_vertices[chosen_line_tetrahedron][0]],
6761 [new_line_vertices[chosen_line_tetrahedron][1]]});
6766 boost::container::small_vector<raw_line_iterator, 30>
6771 relevant_lines.resize(30);
6772 for (
unsigned int f = 0, k = 0; f < 6; ++f)
6773 for (
unsigned int c = 0; c < 4; ++c, ++k)
6776 ndarray<unsigned int, 4, 2>
6778 {{{0, 1}}, {{3, 0}}, {{0, 3}}, {{3, 2}}}};
6784 standard_to_real_face_vertex(
6786 hex->face_orientation(f),
6788 hex->face_rotation(f)))
6790 standard_to_real_face_line(
6792 hex->face_orientation(f),
6794 hex->face_rotation(f)));
6797 for (
unsigned int i = 0, k = 24; i < 6; ++i, ++k)
6798 relevant_lines[k] = new_lines[i];
6813 relevant_lines.resize(13);
6816 for (
unsigned int f = 0; f < 4; ++f)
6817 for (
unsigned int l = 0; l < 3; ++l, ++k)
6821 array<std::array<unsigned int, 3>, 6>
6822 table = {{{{1, 0, 2}},
6829 const auto combined_orientation =
6830 hex->combined_face_orientation(f);
6834 ->line(table[combined_orientation][l]);
6837 relevant_lines[k++] = new_lines[0];
6843 boost::container::small_vector<unsigned int, 30>
6844 relevant_line_indices(relevant_lines.size());
6845 for (
unsigned int i = 0; i < relevant_line_indices.size();
6847 relevant_line_indices[i] = relevant_lines[i]->
index();
6856 const auto &new_quad_lines =
6857 hex->reference_cell().new_isotropic_child_face_lines(
6858 chosen_line_tetrahedron);
6871 hex->reference_cell()
6872 .new_isotropic_child_face_line_vertices(
6873 chosen_line_tetrahedron);
6875 static constexpr ::ndarray<unsigned int, 4, 2>
6876 representative_lines{
6877 {{{0, 2}}, {{2, 0}}, {{3, 3}}, {{1, 1}}}};
6879 for (
unsigned int q = 0; q < n_new_quads; ++q)
6881 auto &new_quad = new_quads[q];
6883 if (new_quad->n_lines() == 3)
6884 new_quad->set_bounding_object_indices(
6885 {relevant_line_indices[new_quad_lines[q][0]],
6886 relevant_line_indices[new_quad_lines[q][1]],
6887 relevant_line_indices[new_quad_lines[q][2]]});
6888 else if (new_quad->n_lines() == 4)
6889 new_quad->set_bounding_object_indices(
6890 {relevant_line_indices[new_quad_lines[q][0]],
6891 relevant_line_indices[new_quad_lines[q][1]],
6892 relevant_line_indices[new_quad_lines[q][2]],
6893 relevant_line_indices[new_quad_lines[q][3]]});
6901 const unsigned int n_compute_lines =
6905 for (
unsigned int line = 0; line < n_compute_lines;
6908 const unsigned int l =
6909 (reference_cell_type ==
6911 representative_lines[q % 4][0] :
6914 const std::array<unsigned int, 2> vertices_0 = {
6915 {relevant_lines[new_quad_lines[q][l]]
6917 relevant_lines[new_quad_lines[q][l]]
6918 ->vertex_index(1)}};
6920 const std::array<unsigned int, 2> vertices_1 = {
6924 const auto orientation =
6929 new_quad->set_line_orientation(l, orientation);
6934 if (reference_cell_type ==
6936 new_quads[representative_lines[q % 4][1] + q -
6938 ->set_line_orientation(l, orientation);
6945 std::array<int, 36> quad_indices;
6949 for (
unsigned int i = 0; i < n_new_quads; ++i)
6950 quad_indices[i] = new_quads[i]->
index();
6952 for (
unsigned int f = 0, k = n_new_quads; f < 6; ++f)
6953 for (
unsigned int c = 0; c < 4; ++c, ++k)
6955 hex->face(f)->isotropic_child_index(
6958 hex->face_orientation(f),
6960 hex->face_rotation(f)));
6970 for (
unsigned int i = 0; i < n_new_quads; ++i)
6971 quad_indices[i] = new_quads[i]->
index();
6973 for (
unsigned int f = 0, k = n_new_quads; f < 4; ++f)
6974 for (
unsigned int c = 0; c < 4; ++c, ++k)
6976 const auto combined_orientation =
6977 hex->combined_face_orientation(f);
6978 quad_indices[k] = hex->face(f)->child_index(
6981 .standard_to_real_face_vertex(
6982 c, f, combined_orientation));
6998 const auto &cell_quads =
6999 hex->reference_cell().new_isotropic_child_cell_faces(
7000 chosen_line_tetrahedron);
7002 for (
unsigned int c = 0;
7003 c < GeometryInfo<dim>::max_children_per_cell;
7006 auto &new_hex = new_hexes[c];
7007 const auto reference_cell = new_hex->reference_cell();
7011 new_hex->set_bounding_object_indices(
7012 {quad_indices[cell_quads[c][0]],
7013 quad_indices[cell_quads[c][1]],
7014 quad_indices[cell_quads[c][2]],
7015 quad_indices[cell_quads[c][3]]});
7020 for (
const auto f : new_hex->face_indices())
7022 const auto &face = new_hex->face(f);
7024 Assert(face->n_vertices() == 3,
7027 const std::array<unsigned int, 3> vertices_0 = {
7028 {face->vertex_index(0),
7029 face->vertex_index(1),
7030 face->vertex_index(2)}};
7039 const auto new_hex_vertices =
7040 hex->reference_cell()
7041 .new_isotropic_child_cell_vertices(
7042 chosen_line_tetrahedron)[c];
7046 std::array<unsigned int, 3> vertices_1;
7047 for (
unsigned int face_vertex_no :
7048 face->vertex_indices())
7050 const auto cell_vertex_no =
7051 reference_cell.face_to_cell_vertices(
7056 [new_hex_vertices[cell_vertex_no]];
7059 new_hex->set_combined_face_orientation(
7061 face->reference_cell()
7062 .get_combined_orientation(
7067 else if (new_hex->n_faces() == 6)
7068 new_hex->set_bounding_object_indices(
7069 {quad_indices[cell_quads[c][0]],
7070 quad_indices[cell_quads[c][1]],
7071 quad_indices[cell_quads[c][2]],
7072 quad_indices[cell_quads[c][3]],
7073 quad_indices[cell_quads[c][4]],
7074 quad_indices[cell_quads[c][5]]});
7083 static constexpr ::ndarray<unsigned int, 6, 4>
7084 face_to_child_indices_hex{{{{0, 2, 4, 6}},
7091 for (
const auto f : hex->face_indices())
7093 const auto combined_orientation =
7094 hex->combined_face_orientation(f);
7095 for (
unsigned int c = 0; c < 4; ++c)
7096 new_hexes[face_to_child_indices_hex[f][c]]
7097 ->set_combined_face_orientation(
7098 f, combined_orientation);
7103 if (check_for_distorted_cells &&
7104 has_distorted_children<dim, spacedim>(hex))
7113 return cells_with_distorted_children;
7123 const bool check_for_distorted_cells)
7125 const unsigned int dim = 3;
7128 bool flag_isotropic_mesh =
true;
7132 for (; cell != endc; ++cell)
7142 flag_isotropic_mesh =
false;
7146 if (flag_isotropic_mesh)
7148 check_for_distorted_cells);
7159 for (
const auto &cell :
triangulation.active_cell_iterators_on_level(
7161 if (cell->refine_flag_set())
7178 line->clear_user_flag();
7183 quad->clear_user_flag();
7206 unsigned int needed_vertices = 0;
7207 unsigned int needed_lines_single = 0;
7208 unsigned int needed_quads_single = 0;
7209 unsigned int needed_lines_pair = 0;
7210 unsigned int needed_quads_pair = 0;
7215 unsigned int new_cells = 0;
7217 for (
const auto &acell :
7219 if (acell->refine_flag_set())
7229 ++needed_quads_single;
7237 ++needed_lines_single;
7238 needed_quads_single += 4;
7245 needed_lines_single += 6;
7246 needed_quads_single += 12;
7260 for (
const unsigned int face :
7264 aface = acell->face(face);
7271 acell->face_orientation(face),
7272 acell->face_flip(face),
7273 acell->face_rotation(face));
7278 if (face_ref_case ==
7281 if (aface->n_active_descendants() < 4)
7284 aface->set_user_flag();
7286 else if (aface->refinement_case() != face_ref_case)
7297 Assert(aface->refinement_case() ==
7300 aface->refinement_case() ==
7303 aface->set_user_index(face_ref_case);
7309 for (
unsigned int line = 0;
7310 line < GeometryInfo<dim>::lines_per_cell;
7314 !acell->line(line)->has_children())
7315 acell->line(line)->set_user_flag();
7321 const unsigned int used_cells =
7331 used_cells + new_cells,
7344 if (quad->user_flag_set())
7350 needed_quads_pair += 4;
7351 needed_lines_pair += 4;
7352 needed_vertices += 1;
7354 if (quad->user_index())
7358 needed_quads_pair += 2;
7359 needed_lines_single += 1;
7372 if (quad->has_children())
7374 Assert(quad->refinement_case() ==
7377 if ((face_refinement_cases[quad->user_index()] ==
7379 (quad->child(0)->line_index(1) + 1 !=
7380 quad->child(2)->line_index(1))) ||
7381 (face_refinement_cases[quad->user_index()] ==
7383 (quad->child(0)->line_index(3) + 1 !=
7384 quad->child(1)->line_index(3))))
7385 needed_lines_pair += 2;
7394 if (line->user_flag_set())
7396 needed_lines_pair += 2;
7397 needed_vertices += 1;
7403 needed_lines_single);
7407 needed_quads_single);
7410 needed_quads_single);
7414 needed_vertices += std::count(
triangulation.vertices_used.begin(),
7439 for (
const auto &cell :
triangulation.active_cell_iterators())
7440 if (!cell->refine_flag_set())
7441 for (
unsigned int line = 0;
7442 line < GeometryInfo<dim>::lines_per_cell;
7444 if (cell->line(line)->has_children())
7445 for (
unsigned int c = 0; c < 2; ++c)
7446 Assert(cell->line(line)->child(c)->user_flag_set() ==
7459 unsigned int next_unused_vertex = 0;
7470 for (; line != endl; ++line)
7471 if (line->user_flag_set())
7477 while (
triangulation.vertices_used[next_unused_vertex] ==
true)
7478 ++next_unused_vertex;
7482 "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."));
7485 triangulation.vertices[next_unused_vertex] = line->center(
true);
7499 line->set_children(0, next_unused_line->index());
7503 children[2] = {next_unused_line, ++next_unused_line};
7510 children[0]->set_bounding_object_indices(
7511 {line->vertex_index(0), next_unused_vertex});
7512 children[1]->set_bounding_object_indices(
7513 {next_unused_vertex, line->vertex_index(1)});
7515 children[0]->set_used_flag();
7516 children[1]->set_used_flag();
7517 children[0]->clear_children();
7518 children[1]->clear_children();
7521 children[0]->clear_user_flag();
7522 children[1]->clear_user_flag();
7524 children[0]->set_boundary_id_internal(line->boundary_id());
7525 children[1]->set_boundary_id_internal(line->boundary_id());
7527 children[0]->set_manifold_id(line->manifold_id());
7528 children[1]->set_manifold_id(line->manifold_id());
7533 line->clear_user_flag();
7563 for (
unsigned int loop = 0; loop < 2; ++loop)
7576 for (; quad != endq; ++quad)
7578 if (quad->user_index())
7581 face_refinement_cases[quad->user_index()];
7590 if (aniso_quad_ref_case == quad->refinement_case())
7593 Assert(quad->refinement_case() ==
7595 quad->refinement_case() ==
7600 Assert(quad->user_index() ==
7602 quad->user_index() ==
7632 quad->line(2)->child(0)->vertex_index(1);
7634 quad->line(3)->child(0)->vertex_index(1);
7639 quad->line(0)->child(0)->vertex_index(1);
7641 quad->line(1)->child(0)->vertex_index(1);
7644 new_line->set_bounding_object_indices(
7646 new_line->set_used_flag();
7647 new_line->clear_user_flag();
7649 new_line->clear_children();
7650 new_line->set_boundary_id_internal(quad->boundary_id());
7651 new_line->set_manifold_id(quad->manifold_id());
7661 new_quads[0] = next_unused_quad;
7665 new_quads[1] = next_unused_quad;
7670 new_quads[0]->set_bounding_object_indices(
7671 {
static_cast<int>(quad->line_index(0)),
7675 child_line_index(0, quad->line_orientation(2)))
7679 child_line_index(0, quad->line_orientation(3)))
7681 new_quads[1]->set_bounding_object_indices(
7683 static_cast<int>(quad->line_index(1)),
7686 child_line_index(1, quad->line_orientation(2)))
7690 child_line_index(1, quad->line_orientation(3)))
7695 new_quads[0]->set_bounding_object_indices(
7698 child_line_index(0, quad->line_orientation(0)))
7702 child_line_index(0, quad->line_orientation(1)))
7704 static_cast<int>(quad->line_index(2)),
7705 new_line->index()});
7706 new_quads[1]->set_bounding_object_indices(
7709 child_line_index(1, quad->line_orientation(0)))
7713 child_line_index(1, quad->line_orientation(1)))
7716 static_cast<int>(quad->line_index(3))});
7719 for (
const auto &new_quad : new_quads)
7721 new_quad->set_used_flag();
7722 new_quad->clear_user_flag();
7724 new_quad->clear_children();
7725 new_quad->set_boundary_id_internal(quad->boundary_id());
7726 new_quad->set_manifold_id(quad->manifold_id());
7730 for (
unsigned int j = 0;
7731 j < GeometryInfo<dim>::lines_per_face;
7733 new_quad->set_line_orientation(
7740 new_quads[0]->set_line_orientation(
7741 0, quad->line_orientation(0));
7742 new_quads[0]->set_line_orientation(
7743 2, quad->line_orientation(2));
7744 new_quads[1]->set_line_orientation(
7745 1, quad->line_orientation(1));
7746 new_quads[1]->set_line_orientation(
7747 3, quad->line_orientation(3));
7750 new_quads[0]->set_line_orientation(
7751 3, quad->line_orientation(3));
7752 new_quads[1]->set_line_orientation(
7753 2, quad->line_orientation(2));
7757 new_quads[0]->set_line_orientation(
7758 1, quad->line_orientation(1));
7759 new_quads[1]->set_line_orientation(
7760 0, quad->line_orientation(0));
7766 if (quad->refinement_case() ==
7789 if (aniso_quad_ref_case ==
7792 old_child[0] = quad->child(0)->line(1);
7793 old_child[1] = quad->child(2)->line(1);
7797 Assert(aniso_quad_ref_case ==
7801 old_child[0] = quad->child(0)->line(3);
7802 old_child[1] = quad->child(1)->line(3);
7805 if (old_child[0]->
index() + 1 != old_child[1]->
index())
7811 spacedim>::raw_line_iterator
7814 new_child[0] = new_child[1] =
7816 .template next_free_pair_object<1>(
7820 new_child[0]->set_used_flag();
7821 new_child[1]->set_used_flag();
7823 const int old_index_0 = old_child[0]->index(),
7824 old_index_1 = old_child[1]->index(),
7825 new_index_0 = new_child[0]->index(),
7826 new_index_1 = new_child[1]->index();
7830 for (
unsigned int q = 0;
7833 for (
unsigned int l = 0;
7834 l < GeometryInfo<dim>::lines_per_face;
7837 const int this_index =
7839 .get_bounding_object_indices(q)[l];
7840 if (this_index == old_index_0)
7842 .get_bounding_object_indices(q)[l] =
7844 else if (this_index == old_index_1)
7846 .get_bounding_object_indices(q)[l] =
7851 for (
unsigned int i = 0; i < 2; ++i)
7853 Assert(!old_child[i]->has_children(),
7856 new_child[i]->set_bounding_object_indices(
7857 {old_child[i]->vertex_index(0),
7858 old_child[i]->vertex_index(1)});
7859 new_child[i]->set_boundary_id_internal(
7860 old_child[i]->boundary_id());
7861 new_child[i]->set_manifold_id(
7862 old_child[i]->manifold_id());
7863 new_child[i]->set_user_index(
7864 old_child[i]->user_index());
7865 if (old_child[i]->user_flag_set())
7866 new_child[i]->set_user_flag();
7868 new_child[i]->clear_user_flag();
7870 new_child[i]->clear_children();
7872 old_child[i]->clear_user_flag();
7873 old_child[i]->clear_user_index();
7874 old_child[i]->clear_used_flag();
7880 if (aniso_quad_ref_case ==
7883 new_line->set_children(
7884 0, quad->child(0)->line_index(1));
7885 Assert(new_line->child(1) ==
7886 quad->child(2)->line(1),
7923 quad_iterator switch_1 = quad->child(1),
7924 switch_2 = quad->child(2);
7925 const int switch_1_index = switch_1->index();
7926 const int switch_2_index = switch_2->index();
7927 for (
unsigned int l = 0;
7930 for (
unsigned int h = 0;
7934 for (
const unsigned int q :
7937 const int face_index =
7939 ->cells.get_bounding_object_indices(
7941 if (face_index == switch_1_index)
7943 ->cells.get_bounding_object_indices(
7944 h)[q] = switch_2_index;
7945 else if (face_index == switch_2_index)
7947 ->cells.get_bounding_object_indices(
7948 h)[q] = switch_1_index;
7952 const unsigned int switch_1_lines[4] = {
7953 switch_1->line_index(0),
7954 switch_1->line_index(1),
7955 switch_1->line_index(2),
7956 switch_1->line_index(3)};
7958 switch_1_line_orientations[4] = {
7959 switch_1->line_orientation(0),
7960 switch_1->line_orientation(1),
7961 switch_1->line_orientation(2),
7962 switch_1->line_orientation(3)};
7964 switch_1->boundary_id();
7965 const unsigned int switch_1_user_index =
7966 switch_1->user_index();
7967 const bool switch_1_user_flag =
7968 switch_1->user_flag_set();
7970 switch_1_refinement_case =
7971 switch_1->refinement_case();
7972 const int switch_1_first_child_pair =
7973 (switch_1_refinement_case ?
7974 switch_1->child_index(0) :
7976 const int switch_1_second_child_pair =
7977 (switch_1_refinement_case ==
7979 switch_1->child_index(2) :
7982 switch_1->set_bounding_object_indices(
7983 {switch_2->line_index(0),
7984 switch_2->line_index(1),
7985 switch_2->line_index(2),
7986 switch_2->line_index(3)});
7987 switch_1->set_line_orientation(
7988 0, switch_2->line_orientation(0));
7989 switch_1->set_line_orientation(
7990 1, switch_2->line_orientation(1));
7991 switch_1->set_line_orientation(
7992 2, switch_2->line_orientation(2));
7993 switch_1->set_line_orientation(
7994 3, switch_2->line_orientation(3));
7995 switch_1->set_boundary_id_internal(
7996 switch_2->boundary_id());
7997 switch_1->set_manifold_id(switch_2->manifold_id());
7998 switch_1->set_user_index(switch_2->user_index());
7999 if (switch_2->user_flag_set())
8000 switch_1->set_user_flag();
8002 switch_1->clear_user_flag();
8003 switch_1->clear_refinement_case();
8004 switch_1->set_refinement_case(
8005 switch_2->refinement_case());
8006 switch_1->clear_children();
8007 if (switch_2->refinement_case())
8008 switch_1->set_children(0,
8009 switch_2->child_index(0));
8010 if (switch_2->refinement_case() ==
8012 switch_1->set_children(2,
8013 switch_2->child_index(2));
8015 switch_2->set_bounding_object_indices(
8019 switch_1_lines[3]});
8020 switch_2->set_line_orientation(
8021 0, switch_1_line_orientations[0]);
8022 switch_2->set_line_orientation(
8023 1, switch_1_line_orientations[1]);
8024 switch_2->set_line_orientation(
8025 2, switch_1_line_orientations[2]);
8026 switch_2->set_line_orientation(
8027 3, switch_1_line_orientations[3]);
8028 switch_2->set_boundary_id_internal(
8029 switch_1_boundary_id);
8030 switch_2->set_manifold_id(switch_1->manifold_id());
8031 switch_2->set_user_index(switch_1_user_index);
8032 if (switch_1_user_flag)
8033 switch_2->set_user_flag();
8035 switch_2->clear_user_flag();
8036 switch_2->clear_refinement_case();
8037 switch_2->set_refinement_case(
8038 switch_1_refinement_case);
8039 switch_2->clear_children();
8040 switch_2->set_children(0,
8041 switch_1_first_child_pair);
8042 switch_2->set_children(2,
8043 switch_1_second_child_pair);
8045 new_quads[0]->set_refinement_case(
8047 new_quads[0]->set_children(0, quad->child_index(0));
8048 new_quads[1]->set_refinement_case(
8050 new_quads[1]->set_children(0, quad->child_index(2));
8054 new_quads[0]->set_refinement_case(
8056 new_quads[0]->set_children(0, quad->child_index(0));
8057 new_quads[1]->set_refinement_case(
8059 new_quads[1]->set_children(0, quad->child_index(2));
8060 new_line->set_children(
8061 0, quad->child(0)->line_index(3));
8062 Assert(new_line->child(1) ==
8063 quad->child(1)->line(3),
8066 quad->clear_children();
8070 quad->set_children(0, new_quads[0]->
index());
8072 quad->set_refinement_case(aniso_quad_ref_case);
8079 if (quad->user_flag_set())
8091 ++next_unused_vertex;
8095 "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."));
8103 quad->refinement_case();
8109 quad->child(0)->set_user_index(
8111 quad->child(1)->set_user_index(
8117 middle_line = quad->child(0)->line(1);
8119 middle_line = quad->child(0)->line(3);
8126 if (!middle_line->has_children())
8134 middle_line->center(
true);
8142 .template next_free_pair_object<1>(
8147 middle_line->set_children(
8148 0, next_unused_line->index());
8152 raw_line_iterator children[2] = {
8153 next_unused_line, ++next_unused_line};
8161 children[0]->set_bounding_object_indices(
8162 {middle_line->vertex_index(0),
8163 next_unused_vertex});
8164 children[1]->set_bounding_object_indices(
8165 {next_unused_vertex,
8166 middle_line->vertex_index(1)});
8168 children[0]->set_used_flag();
8169 children[1]->set_used_flag();
8170 children[0]->clear_children();
8171 children[1]->clear_children();
8174 children[0]->clear_user_flag();
8175 children[1]->clear_user_flag();
8177 children[0]->set_boundary_id_internal(
8178 middle_line->boundary_id());
8179 children[1]->set_boundary_id_internal(
8180 middle_line->boundary_id());
8182 children[0]->set_manifold_id(
8183 middle_line->manifold_id());
8184 children[1]->set_manifold_id(
8185 middle_line->manifold_id());
8191 quad->clear_user_flag();
8221 quad->center(
true,
true);
8230 for (
unsigned int i = 0; i < 4; ++i)
8243 new_lines[i] = next_unused_line;
8267 quad->line(0)->child(0)->vertex_index(1),
8268 quad->line(1)->child(0)->vertex_index(1),
8269 quad->line(2)->child(0)->vertex_index(1),
8270 quad->line(3)->child(0)->vertex_index(1),
8271 next_unused_vertex};
8273 new_lines[0]->set_bounding_object_indices(
8275 new_lines[1]->set_bounding_object_indices(
8277 new_lines[2]->set_bounding_object_indices(
8279 new_lines[3]->set_bounding_object_indices(
8282 for (
const auto &new_line : new_lines)
8284 new_line->set_used_flag();
8285 new_line->clear_user_flag();
8287 new_line->clear_children();
8288 new_line->set_boundary_id_internal(quad->boundary_id());
8289 new_line->set_manifold_id(quad->manifold_id());
8302 const int line_indices[12] = {
8304 ->child(child_line_index(0, quad->line_orientation(0)))
8307 ->child(child_line_index(1, quad->line_orientation(0)))
8310 ->child(child_line_index(0, quad->line_orientation(1)))
8313 ->child(child_line_index(1, quad->line_orientation(1)))
8316 ->child(child_line_index(0, quad->line_orientation(2)))
8319 ->child(child_line_index(1, quad->line_orientation(2)))
8322 ->child(child_line_index(0, quad->line_orientation(3)))
8325 ->child(child_line_index(1, quad->line_orientation(3)))
8327 new_lines[0]->index(),
8328 new_lines[1]->index(),
8329 new_lines[2]->index(),
8330 new_lines[3]->index()};
8342 new_quads[0] = next_unused_quad;
8346 new_quads[1] = next_unused_quad;
8352 new_quads[2] = next_unused_quad;
8356 new_quads[3] = next_unused_quad;
8360 quad->set_children(0, new_quads[0]->
index());
8361 quad->set_children(2, new_quads[2]->
index());
8364 new_quads[0]->set_bounding_object_indices(
8369 new_quads[1]->set_bounding_object_indices(
8374 new_quads[2]->set_bounding_object_indices(
8379 new_quads[3]->set_bounding_object_indices(
8384 for (
const auto &new_quad : new_quads)
8386 new_quad->set_used_flag();
8387 new_quad->clear_user_flag();
8389 new_quad->clear_children();
8390 new_quad->set_boundary_id_internal(quad->boundary_id());
8391 new_quad->set_manifold_id(quad->manifold_id());
8395 for (
unsigned int j = 0;
8396 j < GeometryInfo<dim>::lines_per_face;
8398 new_quad->set_line_orientation(
8405 new_quads[0]->set_line_orientation(
8406 0, quad->line_orientation(0));
8407 new_quads[0]->set_line_orientation(
8408 2, quad->line_orientation(2));
8409 new_quads[1]->set_line_orientation(
8410 1, quad->line_orientation(1));
8411 new_quads[1]->set_line_orientation(
8412 2, quad->line_orientation(2));
8413 new_quads[2]->set_line_orientation(
8414 0, quad->line_orientation(0));
8415 new_quads[2]->set_line_orientation(
8416 3, quad->line_orientation(3));
8417 new_quads[3]->set_line_orientation(
8418 1, quad->line_orientation(1));
8419 new_quads[3]->set_line_orientation(
8420 3, quad->line_orientation(3));
8424 quad->clear_user_flag();
8435 cells_with_distorted_children;
8449 for (; hex != endh; ++hex)
8450 if (hex->refine_flag_set())
8458 hex->clear_refine_flag();
8459 hex->set_refinement_case(ref_case);
8470 unsigned int n_new_lines = 0;
8471 unsigned int n_new_quads = 0;
8472 unsigned int n_new_hexes = 0;
8503 new_lines(n_new_lines);
8504 for (
unsigned int i = 0; i < n_new_lines; ++i)
8511 new_lines[i]->set_used_flag();
8512 new_lines[i]->clear_user_flag();
8513 new_lines[i]->clear_user_data();
8514 new_lines[i]->clear_children();
8516 new_lines[i]->set_boundary_id_internal(
8520 new_lines[i]->set_manifold_id(hex->manifold_id());
8527 new_quads(n_new_quads);
8528 for (
unsigned int i = 0; i < n_new_quads; ++i)
8535 new_quads[i]->set_used_flag();
8536 new_quads[i]->clear_user_flag();
8537 new_quads[i]->clear_user_data();
8538 new_quads[i]->clear_children();
8540 new_quads[i]->set_boundary_id_internal(
8544 new_quads[i]->set_manifold_id(hex->manifold_id());
8547 for (
unsigned int j = 0;
8548 j < GeometryInfo<dim>::lines_per_face;
8550 new_quads[i]->set_line_orientation(
8560 new_hexes(n_new_hexes);
8561 for (
unsigned int i = 0; i < n_new_hexes; ++i)
8570 new_hexes[i] = next_unused_hex;
8573 new_hexes[i]->set_used_flag();
8574 new_hexes[i]->clear_user_flag();
8575 new_hexes[i]->clear_user_data();
8576 new_hexes[i]->clear_children();
8579 new_hexes[i]->set_material_id(hex->material_id());
8580 new_hexes[i]->set_manifold_id(hex->manifold_id());
8581 new_hexes[i]->set_subdomain_id(subdomainid);
8584 new_hexes[i]->set_parent(hex->index());
8596 for (
const unsigned int f :
8598 new_hexes[i]->set_combined_face_orientation(
8602 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
8603 hex->set_children(2 * i, new_hexes[2 * i]->index());
8610 const bool f_or[6] = {hex->face_orientation(0),
8611 hex->face_orientation(1),
8612 hex->face_orientation(2),
8613 hex->face_orientation(3),
8614 hex->face_orientation(4),
8615 hex->face_orientation(5)};
8618 const bool f_fl[6] = {hex->face_flip(0),
8626 const bool f_ro[6] = {hex->face_rotation(0),
8627 hex->face_rotation(1),
8628 hex->face_rotation(2),
8629 hex->face_rotation(3),
8630 hex->face_rotation(4),
8631 hex->face_rotation(5)};
8635 hex->combined_face_orientation(0),
8636 hex->combined_face_orientation(1),
8637 hex->combined_face_orientation(2),
8638 hex->combined_face_orientation(3),
8639 hex->combined_face_orientation(4),
8640 hex->combined_face_orientation(5)};
8650 const unsigned int child_at_origin[2][2][2] = {
8737 raw_line_iterator lines[4] = {
8738 hex->face(2)->child(0)->line(
8739 (hex->face(2)->refinement_case() ==
8743 hex->face(3)->child(0)->line(
8744 (hex->face(3)->refinement_case() ==
8748 hex->face(4)->child(0)->line(
8749 (hex->face(4)->refinement_case() ==
8753 hex->face(5)->child(0)->line(
8754 (hex->face(5)->refinement_case() ==
8760 unsigned int line_indices[4];
8761 for (
unsigned int i = 0; i < 4; ++i)
8762 line_indices[i] = lines[i]->
index();
8775 const unsigned int middle_vertices[2] = {
8776 hex->line(2)->child(0)->vertex_index(1),
8777 hex->line(7)->child(0)->vertex_index(1)};
8779 for (
unsigned int i = 0; i < 4; ++i)
8780 if (lines[i]->vertex_index(i % 2) ==
8781 middle_vertices[i % 2])
8782 line_orientation[i] =
8787 Assert(lines[i]->vertex_index((i + 1) % 2) ==
8788 middle_vertices[i % 2],
8790 line_orientation[i] =
8796 new_quads[0]->set_bounding_object_indices(
8802 new_quads[0]->set_line_orientation(
8803 0, line_orientation[0]);
8804 new_quads[0]->set_line_orientation(
8805 1, line_orientation[1]);
8806 new_quads[0]->set_line_orientation(
8807 2, line_orientation[2]);
8808 new_quads[0]->set_line_orientation(
8809 3, line_orientation[3]);
8842 const int quad_indices[11] = {
8843 new_quads[0]->index(),
8845 hex->face(0)->index(),
8847 hex->face(1)->index(),
8849 hex->face(2)->child_index(
8850 child_at_origin[hex->face(2)->refinement_case() -
8851 1][f_fl[2]][f_ro[2]]),
8852 hex->face(2)->child_index(
8854 child_at_origin[hex->face(2)->refinement_case() -
8855 1][f_fl[2]][f_ro[2]]),
8857 hex->face(3)->child_index(
8858 child_at_origin[hex->face(3)->refinement_case() -
8859 1][f_fl[3]][f_ro[3]]),
8860 hex->face(3)->child_index(
8862 child_at_origin[hex->face(3)->refinement_case() -
8863 1][f_fl[3]][f_ro[3]]),
8865 hex->face(4)->child_index(
8866 child_at_origin[hex->face(4)->refinement_case() -
8867 1][f_fl[4]][f_ro[4]]),
8868 hex->face(4)->child_index(
8870 child_at_origin[hex->face(4)->refinement_case() -
8871 1][f_fl[4]][f_ro[4]]),
8873 hex->face(5)->child_index(
8874 child_at_origin[hex->face(5)->refinement_case() -
8875 1][f_fl[5]][f_ro[5]]),
8876 hex->face(5)->child_index(
8878 child_at_origin[hex->face(5)->refinement_case() -
8879 1][f_fl[5]][f_ro[5]])
8883 new_hexes[0]->set_bounding_object_indices(
8890 new_hexes[1]->set_bounding_object_indices(
8965 raw_line_iterator lines[4] = {
8966 hex->face(0)->child(0)->line(
8967 (hex->face(0)->refinement_case() ==
8971 hex->face(1)->child(0)->line(
8972 (hex->face(1)->refinement_case() ==
8976 hex->face(4)->child(0)->line(
8977 (hex->face(4)->refinement_case() ==
8981 hex->face(5)->child(0)->line(
8982 (hex->face(5)->refinement_case() ==
8988 unsigned int line_indices[4];
8989 for (
unsigned int i = 0; i < 4; ++i)
8990 line_indices[i] = lines[i]->
index();
9003 const unsigned int middle_vertices[2] = {
9004 hex->line(0)->child(0)->vertex_index(1),
9005 hex->line(5)->child(0)->vertex_index(1)};
9007 for (
unsigned int i = 0; i < 4; ++i)
9008 if (lines[i]->vertex_index(i % 2) ==
9009 middle_vertices[i % 2])
9010 line_orientation[i] =
9015 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9016 middle_vertices[i % 2],
9018 line_orientation[i] =
9024 new_quads[0]->set_bounding_object_indices(
9030 new_quads[0]->set_line_orientation(
9031 0, line_orientation[2]);
9032 new_quads[0]->set_line_orientation(
9033 1, line_orientation[3]);
9034 new_quads[0]->set_line_orientation(
9035 2, line_orientation[0]);
9036 new_quads[0]->set_line_orientation(
9037 3, line_orientation[1]);
9070 const int quad_indices[11] = {
9071 new_quads[0]->index(),
9073 hex->face(0)->child_index(
9074 child_at_origin[hex->face(0)->refinement_case() -
9075 1][f_fl[0]][f_ro[0]]),
9076 hex->face(0)->child_index(
9078 child_at_origin[hex->face(0)->refinement_case() -
9079 1][f_fl[0]][f_ro[0]]),
9081 hex->face(1)->child_index(
9082 child_at_origin[hex->face(1)->refinement_case() -
9083 1][f_fl[1]][f_ro[1]]),
9084 hex->face(1)->child_index(
9086 child_at_origin[hex->face(1)->refinement_case() -
9087 1][f_fl[1]][f_ro[1]]),
9089 hex->face(2)->index(),
9091 hex->face(3)->index(),
9093 hex->face(4)->child_index(
9094 child_at_origin[hex->face(4)->refinement_case() -
9095 1][f_fl[4]][f_ro[4]]),
9096 hex->face(4)->child_index(
9098 child_at_origin[hex->face(4)->refinement_case() -
9099 1][f_fl[4]][f_ro[4]]),
9101 hex->face(5)->child_index(
9102 child_at_origin[hex->face(5)->refinement_case() -
9103 1][f_fl[5]][f_ro[5]]),
9104 hex->face(5)->child_index(
9106 child_at_origin[hex->face(5)->refinement_case() -
9107 1][f_fl[5]][f_ro[5]])
9111 new_hexes[0]->set_bounding_object_indices(
9118 new_hexes[1]->set_bounding_object_indices(
9195 raw_line_iterator lines[4] = {
9196 hex->face(0)->child(0)->line(
9197 (hex->face(0)->refinement_case() ==
9201 hex->face(1)->child(0)->line(
9202 (hex->face(1)->refinement_case() ==
9206 hex->face(2)->child(0)->line(
9207 (hex->face(2)->refinement_case() ==
9211 hex->face(3)->child(0)->line(
9212 (hex->face(3)->refinement_case() ==
9218 unsigned int line_indices[4];
9219 for (
unsigned int i = 0; i < 4; ++i)
9220 line_indices[i] = lines[i]->
index();
9233 const unsigned int middle_vertices[2] = {
9234 middle_vertex_index<dim, spacedim>(hex->line(8)),
9235 middle_vertex_index<dim, spacedim>(hex->line(11))};
9237 for (
unsigned int i = 0; i < 4; ++i)
9238 if (lines[i]->vertex_index(i % 2) ==
9239 middle_vertices[i % 2])
9240 line_orientation[i] =
9245 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9246 middle_vertices[i % 2],
9248 line_orientation[i] =
9254 new_quads[0]->set_bounding_object_indices(
9260 new_quads[0]->set_line_orientation(
9261 0, line_orientation[0]);
9262 new_quads[0]->set_line_orientation(
9263 1, line_orientation[1]);
9264 new_quads[0]->set_line_orientation(
9265 2, line_orientation[2]);
9266 new_quads[0]->set_line_orientation(
9267 3, line_orientation[3]);
9301 const int quad_indices[11] = {
9302 new_quads[0]->index(),
9304 hex->face(0)->child_index(
9305 child_at_origin[hex->face(0)->refinement_case() -
9306 1][f_fl[0]][f_ro[0]]),
9307 hex->face(0)->child_index(
9309 child_at_origin[hex->face(0)->refinement_case() -
9310 1][f_fl[0]][f_ro[0]]),
9312 hex->face(1)->child_index(
9313 child_at_origin[hex->face(1)->refinement_case() -
9314 1][f_fl[1]][f_ro[1]]),
9315 hex->face(1)->child_index(
9317 child_at_origin[hex->face(1)->refinement_case() -
9318 1][f_fl[1]][f_ro[1]]),
9320 hex->face(2)->child_index(
9321 child_at_origin[hex->face(2)->refinement_case() -
9322 1][f_fl[2]][f_ro[2]]),
9323 hex->face(2)->child_index(
9325 child_at_origin[hex->face(2)->refinement_case() -
9326 1][f_fl[2]][f_ro[2]]),
9328 hex->face(3)->child_index(
9329 child_at_origin[hex->face(3)->refinement_case() -
9330 1][f_fl[3]][f_ro[3]]),
9331 hex->face(3)->child_index(
9333 child_at_origin[hex->face(3)->refinement_case() -
9334 1][f_fl[3]][f_ro[3]]),
9336 hex->face(4)->index(),
9338 hex->face(5)->index()
9341 new_hexes[0]->set_bounding_object_indices(
9348 new_hexes[1]->set_bounding_object_indices(
9380 new_lines[0]->set_bounding_object_indices(
9381 {middle_vertex_index<dim, spacedim>(hex->face(4)),
9382 middle_vertex_index<dim, spacedim>(hex->face(5))});
9450 spacedim>::raw_line_iterator lines[13] = {
9451 hex->face(0)->child(0)->line(
9452 (hex->face(0)->refinement_case() ==
9456 hex->face(1)->child(0)->line(
9457 (hex->face(1)->refinement_case() ==
9461 hex->face(2)->child(0)->line(
9462 (hex->face(2)->refinement_case() ==
9466 hex->face(3)->child(0)->line(
9467 (hex->face(3)->refinement_case() ==
9475 0, f_or[4], f_fl[4], f_ro[4]))
9478 1, f_or[4], f_fl[4], f_ro[4])),
9482 3, f_or[4], f_fl[4], f_ro[4]))
9485 0, f_or[4], f_fl[4], f_ro[4])),
9489 0, f_or[4], f_fl[4], f_ro[4]))
9492 3, f_or[4], f_fl[4], f_ro[4])),
9496 3, f_or[4], f_fl[4], f_ro[4]))
9499 2, f_or[4], f_fl[4], f_ro[4])),
9504 0, f_or[5], f_fl[5], f_ro[5]))
9507 1, f_or[5], f_fl[5], f_ro[5])),
9511 3, f_or[5], f_fl[5], f_ro[5]))
9514 0, f_or[5], f_fl[5], f_ro[5])),
9518 0, f_or[5], f_fl[5], f_ro[5]))
9521 3, f_or[5], f_fl[5], f_ro[5])),
9525 3, f_or[5], f_fl[5], f_ro[5]))
9528 2, f_or[5], f_fl[5], f_ro[5])),
9533 unsigned int line_indices[13];
9534 for (
unsigned int i = 0; i < 13; ++i)
9535 line_indices[i] = lines[i]->
index();
9546 const unsigned int middle_vertices[4] = {
9547 hex->line(0)->child(0)->vertex_index(1),
9548 hex->line(1)->child(0)->vertex_index(1),
9549 hex->line(2)->child(0)->vertex_index(1),
9550 hex->line(3)->child(0)->vertex_index(1),
9556 for (
unsigned int i = 0; i < 4; ++i)
9557 if (lines[i]->vertex_index(0) == middle_vertices[i])
9558 line_orientation[i] =
9563 Assert(lines[i]->vertex_index(1) ==
9566 line_orientation[i] =
9576 for (
unsigned int i = 4; i < 12; ++i)
9577 if (lines[i]->vertex_index((i + 1) % 2) ==
9578 middle_vertex_index<dim, spacedim>(
9579 hex->face(3 + i / 4)))
9580 line_orientation[i] =
9585 Assert(lines[i]->vertex_index(i % 2) ==
9586 (middle_vertex_index<dim, spacedim>(
9587 hex->face(3 + i / 4))),
9589 line_orientation[i] =
9595 line_orientation[12] =
9621 new_quads[0]->set_bounding_object_indices(
9626 new_quads[1]->set_bounding_object_indices(
9631 new_quads[2]->set_bounding_object_indices(
9636 new_quads[3]->set_bounding_object_indices(
9642 new_quads[0]->set_line_orientation(
9643 0, line_orientation[2]);
9644 new_quads[0]->set_line_orientation(
9645 2, line_orientation[4]);
9646 new_quads[0]->set_line_orientation(
9647 3, line_orientation[8]);
9649 new_quads[1]->set_line_orientation(
9650 1, line_orientation[3]);
9651 new_quads[1]->set_line_orientation(
9652 2, line_orientation[5]);
9653 new_quads[1]->set_line_orientation(
9654 3, line_orientation[9]);
9656 new_quads[2]->set_line_orientation(
9657 0, line_orientation[6]);
9658 new_quads[2]->set_line_orientation(
9659 1, line_orientation[10]);
9660 new_quads[2]->set_line_orientation(
9661 2, line_orientation[0]);
9663 new_quads[3]->set_line_orientation(
9664 0, line_orientation[7]);
9665 new_quads[3]->set_line_orientation(
9666 1, line_orientation[11]);
9667 new_quads[3]->set_line_orientation(
9668 3, line_orientation[1]);
9701 const int quad_indices[20] = {
9702 new_quads[0]->index(),
9703 new_quads[1]->index(),
9704 new_quads[2]->index(),
9705 new_quads[3]->index(),
9707 hex->face(0)->child_index(
9708 child_at_origin[hex->face(0)->refinement_case() -
9709 1][f_fl[0]][f_ro[0]]),
9710 hex->face(0)->child_index(
9712 child_at_origin[hex->face(0)->refinement_case() -
9713 1][f_fl[0]][f_ro[0]]),
9715 hex->face(1)->child_index(
9716 child_at_origin[hex->face(1)->refinement_case() -
9717 1][f_fl[1]][f_ro[1]]),
9718 hex->face(1)->child_index(
9720 child_at_origin[hex->face(1)->refinement_case() -
9721 1][f_fl[1]][f_ro[1]]),
9723 hex->face(2)->child_index(
9724 child_at_origin[hex->face(2)->refinement_case() -
9725 1][f_fl[2]][f_ro[2]]),
9726 hex->face(2)->child_index(
9728 child_at_origin[hex->face(2)->refinement_case() -
9729 1][f_fl[2]][f_ro[2]]),
9731 hex->face(3)->child_index(
9732 child_at_origin[hex->face(3)->refinement_case() -
9733 1][f_fl[3]][f_ro[3]]),
9734 hex->face(3)->child_index(
9736 child_at_origin[hex->face(3)->refinement_case() -
9737 1][f_fl[3]][f_ro[3]]),
9739 hex->face(4)->isotropic_child_index(
9741 0, f_or[4], f_fl[4], f_ro[4])),
9742 hex->face(4)->isotropic_child_index(
9744 1, f_or[4], f_fl[4], f_ro[4])),
9745 hex->face(4)->isotropic_child_index(
9747 2, f_or[4], f_fl[4], f_ro[4])),
9748 hex->face(4)->isotropic_child_index(
9750 3, f_or[4], f_fl[4], f_ro[4])),
9752 hex->face(5)->isotropic_child_index(
9754 0, f_or[5], f_fl[5], f_ro[5])),
9755 hex->face(5)->isotropic_child_index(
9757 1, f_or[5], f_fl[5], f_ro[5])),
9758 hex->face(5)->isotropic_child_index(
9760 2, f_or[5], f_fl[5], f_ro[5])),
9761 hex->face(5)->isotropic_child_index(
9763 3, f_or[5], f_fl[5], f_ro[5]))};
9765 new_hexes[0]->set_bounding_object_indices(
9772 new_hexes[1]->set_bounding_object_indices(
9779 new_hexes[2]->set_bounding_object_indices(
9786 new_hexes[3]->set_bounding_object_indices(
9818 new_lines[0]->set_bounding_object_indices(
9819 {middle_vertex_index<dim, spacedim>(hex->face(2)),
9820 middle_vertex_index<dim, spacedim>(hex->face(3))});
9888 spacedim>::raw_line_iterator lines[13] = {
9889 hex->face(0)->child(0)->line(
9890 (hex->face(0)->refinement_case() ==
9894 hex->face(1)->child(0)->line(
9895 (hex->face(1)->refinement_case() ==
9899 hex->face(4)->child(0)->line(
9900 (hex->face(4)->refinement_case() ==
9904 hex->face(5)->child(0)->line(
9905 (hex->face(5)->refinement_case() ==
9913 0, f_or[2], f_fl[2], f_ro[2]))
9916 3, f_or[2], f_fl[2], f_ro[2])),
9920 3, f_or[2], f_fl[2], f_ro[2]))
9923 2, f_or[2], f_fl[2], f_ro[2])),
9927 0, f_or[2], f_fl[2], f_ro[2]))
9930 1, f_or[2], f_fl[2], f_ro[2])),
9934 3, f_or[2], f_fl[2], f_ro[2]))
9937 0, f_or[2], f_fl[2], f_ro[2])),
9942 0, f_or[3], f_fl[3], f_ro[3]))
9945 3, f_or[3], f_fl[3], f_ro[3])),
9949 3, f_or[3], f_fl[3], f_ro[3]))
9952 2, f_or[3], f_fl[3], f_ro[3])),
9956 0, f_or[3], f_fl[3], f_ro[3]))
9959 1, f_or[3], f_fl[3], f_ro[3])),
9963 3, f_or[3], f_fl[3], f_ro[3]))
9966 0, f_or[3], f_fl[3], f_ro[3])),
9971 unsigned int line_indices[13];
9972 for (
unsigned int i = 0; i < 13; ++i)
9973 line_indices[i] = lines[i]->
index();
9984 const unsigned int middle_vertices[4] = {
9985 hex->line(8)->child(0)->vertex_index(1),
9986 hex->line(9)->child(0)->vertex_index(1),
9987 hex->line(2)->child(0)->vertex_index(1),
9988 hex->line(6)->child(0)->vertex_index(1),
9993 for (
unsigned int i = 0; i < 4; ++i)
9994 if (lines[i]->vertex_index(0) == middle_vertices[i])
9995 line_orientation[i] =
10000 Assert(lines[i]->vertex_index(1) ==
10001 middle_vertices[i],
10003 line_orientation[i] =
10013 for (
unsigned int i = 4; i < 12; ++i)
10014 if (lines[i]->vertex_index((i + 1) % 2) ==
10015 middle_vertex_index<dim, spacedim>(
10016 hex->face(1 + i / 4)))
10017 line_orientation[i] =
10023 Assert(lines[i]->vertex_index(i % 2) ==
10024 (middle_vertex_index<dim, spacedim>(
10025 hex->face(1 + i / 4))),
10027 line_orientation[i] =
10033 line_orientation[12] =
10060 new_quads[0]->set_bounding_object_indices(
10064 line_indices[10]});
10065 new_quads[1]->set_bounding_object_indices(
10069 line_indices[11]});
10070 new_quads[2]->set_bounding_object_indices(
10074 line_indices[12]});
10075 new_quads[3]->set_bounding_object_indices(
10081 new_quads[0]->set_line_orientation(
10082 0, line_orientation[0]);
10083 new_quads[0]->set_line_orientation(
10084 2, line_orientation[6]);
10085 new_quads[0]->set_line_orientation(
10086 3, line_orientation[10]);
10088 new_quads[1]->set_line_orientation(
10089 1, line_orientation[1]);
10090 new_quads[1]->set_line_orientation(
10091 2, line_orientation[7]);
10092 new_quads[1]->set_line_orientation(
10093 3, line_orientation[11]);
10095 new_quads[2]->set_line_orientation(
10096 0, line_orientation[4]);
10097 new_quads[2]->set_line_orientation(
10098 1, line_orientation[8]);
10099 new_quads[2]->set_line_orientation(
10100 2, line_orientation[2]);
10102 new_quads[3]->set_line_orientation(
10103 0, line_orientation[5]);
10104 new_quads[3]->set_line_orientation(
10105 1, line_orientation[9]);
10106 new_quads[3]->set_line_orientation(
10107 3, line_orientation[3]);
10141 const int quad_indices[20] = {
10142 new_quads[0]->index(),
10143 new_quads[1]->index(),
10144 new_quads[2]->index(),
10145 new_quads[3]->index(),
10147 hex->face(0)->child_index(
10148 child_at_origin[hex->face(0)->refinement_case() -
10149 1][f_fl[0]][f_ro[0]]),
10150 hex->face(0)->child_index(
10152 child_at_origin[hex->face(0)->refinement_case() -
10153 1][f_fl[0]][f_ro[0]]),
10155 hex->face(1)->child_index(
10156 child_at_origin[hex->face(1)->refinement_case() -
10157 1][f_fl[1]][f_ro[1]]),
10158 hex->face(1)->child_index(
10160 child_at_origin[hex->face(1)->refinement_case() -
10161 1][f_fl[1]][f_ro[1]]),
10163 hex->face(2)->isotropic_child_index(
10165 0, f_or[2], f_fl[2], f_ro[2])),
10166 hex->face(2)->isotropic_child_index(
10168 1, f_or[2], f_fl[2], f_ro[2])),
10169 hex->face(2)->isotropic_child_index(
10171 2, f_or[2], f_fl[2], f_ro[2])),
10172 hex->face(2)->isotropic_child_index(
10174 3, f_or[2], f_fl[2], f_ro[2])),
10176 hex->face(3)->isotropic_child_index(
10178 0, f_or[3], f_fl[3], f_ro[3])),
10179 hex->face(3)->isotropic_child_index(
10181 1, f_or[3], f_fl[3], f_ro[3])),
10182 hex->face(3)->isotropic_child_index(
10184 2, f_or[3], f_fl[3], f_ro[3])),
10185 hex->face(3)->isotropic_child_index(
10187 3, f_or[3], f_fl[3], f_ro[3])),
10189 hex->face(4)->child_index(
10190 child_at_origin[hex->face(4)->refinement_case() -
10191 1][f_fl[4]][f_ro[4]]),
10192 hex->face(4)->child_index(
10194 child_at_origin[hex->face(4)->refinement_case() -
10195 1][f_fl[4]][f_ro[4]]),
10197 hex->face(5)->child_index(
10198 child_at_origin[hex->face(5)->refinement_case() -
10199 1][f_fl[5]][f_ro[5]]),
10200 hex->face(5)->child_index(
10202 child_at_origin[hex->face(5)->refinement_case() -
10203 1][f_fl[5]][f_ro[5]])};
10214 new_hexes[0]->set_bounding_object_indices(
10221 new_hexes[1]->set_bounding_object_indices(
10227 quad_indices[18]});
10228 new_hexes[2]->set_bounding_object_indices(
10235 new_hexes[3]->set_bounding_object_indices(
10241 quad_indices[19]});
10268 new_lines[0]->set_bounding_object_indices(
10270 {middle_vertex_index<dim, spacedim>(hex->face(0)),
10271 middle_vertex_index<dim, spacedim>(hex->face(1))});
10340 spacedim>::raw_line_iterator lines[13] = {
10341 hex->face(2)->child(0)->line(
10342 (hex->face(2)->refinement_case() ==
10346 hex->face(3)->child(0)->line(
10347 (hex->face(3)->refinement_case() ==
10351 hex->face(4)->child(0)->line(
10352 (hex->face(4)->refinement_case() ==
10356 hex->face(5)->child(0)->line(
10357 (hex->face(5)->refinement_case() ==
10365 0, f_or[0], f_fl[0], f_ro[0]))
10368 1, f_or[0], f_fl[0], f_ro[0])),
10372 3, f_or[0], f_fl[0], f_ro[0]))
10375 0, f_or[0], f_fl[0], f_ro[0])),
10379 0, f_or[0], f_fl[0], f_ro[0]))
10382 3, f_or[0], f_fl[0], f_ro[0])),
10386 3, f_or[0], f_fl[0], f_ro[0]))
10389 2, f_or[0], f_fl[0], f_ro[0])),
10394 0, f_or[1], f_fl[1], f_ro[1]))
10397 1, f_or[1], f_fl[1], f_ro[1])),
10401 3, f_or[1], f_fl[1], f_ro[1]))
10404 0, f_or[1], f_fl[1], f_ro[1])),
10408 0, f_or[1], f_fl[1], f_ro[1]))
10411 3, f_or[1], f_fl[1], f_ro[1])),
10415 3, f_or[1], f_fl[1], f_ro[1]))
10418 2, f_or[1], f_fl[1], f_ro[1])),
10423 unsigned int line_indices[13];
10425 for (
unsigned int i = 0; i < 13; ++i)
10426 line_indices[i] = lines[i]->
index();
10437 const unsigned int middle_vertices[4] = {
10438 hex->line(8)->child(0)->vertex_index(1),
10439 hex->line(10)->child(0)->vertex_index(1),
10440 hex->line(0)->child(0)->vertex_index(1),
10441 hex->line(4)->child(0)->vertex_index(1),
10446 for (
unsigned int i = 0; i < 4; ++i)
10447 if (lines[i]->vertex_index(0) == middle_vertices[i])
10448 line_orientation[i] =
10453 Assert(lines[i]->vertex_index(1) ==
10454 middle_vertices[i],
10456 line_orientation[i] =
10466 for (
unsigned int i = 4; i < 12; ++i)
10467 if (lines[i]->vertex_index((i + 1) % 2) ==
10468 middle_vertex_index<dim, spacedim>(
10469 hex->face(i / 4 - 1)))
10470 line_orientation[i] =
10475 Assert(lines[i]->vertex_index(i % 2) ==
10476 (middle_vertex_index<dim, spacedim>(
10477 hex->face(i / 4 - 1))),
10479 line_orientation[i] =
10484 line_orientation[12] =
10505 new_quads[0]->set_bounding_object_indices(
10509 line_indices[12]});
10510 new_quads[1]->set_bounding_object_indices(
10515 new_quads[2]->set_bounding_object_indices(
10520 new_quads[3]->set_bounding_object_indices(
10526 new_quads[0]->set_line_orientation(
10527 0, line_orientation[6]);
10528 new_quads[0]->set_line_orientation(
10529 1, line_orientation[10]);
10530 new_quads[0]->set_line_orientation(
10531 2, line_orientation[0]);
10533 new_quads[1]->set_line_orientation(
10534 0, line_orientation[7]);
10535 new_quads[1]->set_line_orientation(
10536 1, line_orientation[11]);
10537 new_quads[1]->set_line_orientation(
10538 3, line_orientation[1]);
10540 new_quads[2]->set_line_orientation(
10541 0, line_orientation[2]);
10542 new_quads[2]->set_line_orientation(
10543 2, line_orientation[4]);
10544 new_quads[2]->set_line_orientation(
10545 3, line_orientation[8]);
10547 new_quads[3]->set_line_orientation(
10548 1, line_orientation[3]);
10549 new_quads[3]->set_line_orientation(
10550 2, line_orientation[5]);
10551 new_quads[3]->set_line_orientation(
10552 3, line_orientation[9]);
10586 const int quad_indices[20] = {
10587 new_quads[0]->index(),
10588 new_quads[1]->index(),
10589 new_quads[2]->index(),
10590 new_quads[3]->index(),
10592 hex->face(0)->isotropic_child_index(
10594 0, f_or[0], f_fl[0], f_ro[0])),
10595 hex->face(0)->isotropic_child_index(
10597 1, f_or[0], f_fl[0], f_ro[0])),
10598 hex->face(0)->isotropic_child_index(
10600 2, f_or[0], f_fl[0], f_ro[0])),
10601 hex->face(0)->isotropic_child_index(
10603 3, f_or[0], f_fl[0], f_ro[0])),
10605 hex->face(1)->isotropic_child_index(
10607 0, f_or[1], f_fl[1], f_ro[1])),
10608 hex->face(1)->isotropic_child_index(
10610 1, f_or[1], f_fl[1], f_ro[1])),
10611 hex->face(1)->isotropic_child_index(
10613 2, f_or[1], f_fl[1], f_ro[1])),
10614 hex->face(1)->isotropic_child_index(
10616 3, f_or[1], f_fl[1], f_ro[1])),
10618 hex->face(2)->child_index(
10619 child_at_origin[hex->face(2)->refinement_case() -
10620 1][f_fl[2]][f_ro[2]]),
10621 hex->face(2)->child_index(
10623 child_at_origin[hex->face(2)->refinement_case() -
10624 1][f_fl[2]][f_ro[2]]),
10626 hex->face(3)->child_index(
10627 child_at_origin[hex->face(3)->refinement_case() -
10628 1][f_fl[3]][f_ro[3]]),
10629 hex->face(3)->child_index(
10631 child_at_origin[hex->face(3)->refinement_case() -
10632 1][f_fl[3]][f_ro[3]]),
10634 hex->face(4)->child_index(
10635 child_at_origin[hex->face(4)->refinement_case() -
10636 1][f_fl[4]][f_ro[4]]),
10637 hex->face(4)->child_index(
10639 child_at_origin[hex->face(4)->refinement_case() -
10640 1][f_fl[4]][f_ro[4]]),
10642 hex->face(5)->child_index(
10643 child_at_origin[hex->face(5)->refinement_case() -
10644 1][f_fl[5]][f_ro[5]]),
10645 hex->face(5)->child_index(
10647 child_at_origin[hex->face(5)->refinement_case() -
10648 1][f_fl[5]][f_ro[5]])};
10650 new_hexes[0]->set_bounding_object_indices(
10657 new_hexes[1]->set_bounding_object_indices(
10664 new_hexes[2]->set_bounding_object_indices(
10670 quad_indices[18]});
10671 new_hexes[3]->set_bounding_object_indices(
10677 quad_indices[19]});
10709 ++next_unused_vertex;
10713 "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."));
10724 hex->center(
true,
true);
10746 middle_vertex_index<dim, spacedim>(hex->face(0)),
10747 middle_vertex_index<dim, spacedim>(hex->face(1)),
10748 middle_vertex_index<dim, spacedim>(hex->face(2)),
10749 middle_vertex_index<dim, spacedim>(hex->face(3)),
10750 middle_vertex_index<dim, spacedim>(hex->face(4)),
10751 middle_vertex_index<dim, spacedim>(hex->face(5)),
10752 next_unused_vertex};
10754 new_lines[0]->set_bounding_object_indices(
10756 new_lines[1]->set_bounding_object_indices(
10758 new_lines[2]->set_bounding_object_indices(
10760 new_lines[3]->set_bounding_object_indices(
10762 new_lines[4]->set_bounding_object_indices(
10764 new_lines[5]->set_bounding_object_indices(
10834 spacedim>::raw_line_iterator lines[30] = {
10838 0, f_or[0], f_fl[0], f_ro[0]))
10841 1, f_or[0], f_fl[0], f_ro[0])),
10845 3, f_or[0], f_fl[0], f_ro[0]))
10848 0, f_or[0], f_fl[0], f_ro[0])),
10852 0, f_or[0], f_fl[0], f_ro[0]))
10855 3, f_or[0], f_fl[0], f_ro[0])),
10859 3, f_or[0], f_fl[0], f_ro[0]))
10862 2, f_or[0], f_fl[0], f_ro[0])),
10867 0, f_or[1], f_fl[1], f_ro[1]))
10870 1, f_or[1], f_fl[1], f_ro[1])),
10874 3, f_or[1], f_fl[1], f_ro[1]))
10877 0, f_or[1], f_fl[1], f_ro[1])),
10881 0, f_or[1], f_fl[1], f_ro[1]))
10884 3, f_or[1], f_fl[1], f_ro[1])),
10888 3, f_or[1], f_fl[1], f_ro[1]))
10891 2, f_or[1], f_fl[1], f_ro[1])),
10896 0, f_or[2], f_fl[2], f_ro[2]))
10899 1, f_or[2], f_fl[2], f_ro[2])),
10903 3, f_or[2], f_fl[2], f_ro[2]))
10906 0, f_or[2], f_fl[2], f_ro[2])),
10910 0, f_or[2], f_fl[2], f_ro[2]))
10913 3, f_or[2], f_fl[2], f_ro[2])),
10917 3, f_or[2], f_fl[2], f_ro[2]))
10920 2, f_or[2], f_fl[2], f_ro[2])),
10925 0, f_or[3], f_fl[3], f_ro[3]))
10928 1, f_or[3], f_fl[3], f_ro[3])),
10932 3, f_or[3], f_fl[3], f_ro[3]))
10935 0, f_or[3], f_fl[3], f_ro[3])),
10939 0, f_or[3], f_fl[3], f_ro[3]))
10942 3, f_or[3], f_fl[3], f_ro[3])),
10946 3, f_or[3], f_fl[3], f_ro[3]))
10949 2, f_or[3], f_fl[3], f_ro[3])),
10954 0, f_or[4], f_fl[4], f_ro[4]))
10957 1, f_or[4], f_fl[4], f_ro[4])),
10961 3, f_or[4], f_fl[4], f_ro[4]))
10964 0, f_or[4], f_fl[4], f_ro[4])),
10968 0, f_or[4], f_fl[4], f_ro[4]))
10971 3, f_or[4], f_fl[4], f_ro[4])),
10975 3, f_or[4], f_fl[4], f_ro[4]))
10978 2, f_or[4], f_fl[4], f_ro[4])),
10983 0, f_or[5], f_fl[5], f_ro[5]))
10986 1, f_or[5], f_fl[5], f_ro[5])),
10990 3, f_or[5], f_fl[5], f_ro[5]))
10993 0, f_or[5], f_fl[5], f_ro[5])),
10997 0, f_or[5], f_fl[5], f_ro[5]))
11000 3, f_or[5], f_fl[5], f_ro[5])),
11004 3, f_or[5], f_fl[5], f_ro[5]))
11007 2, f_or[5], f_fl[5], f_ro[5])),
11017 unsigned int line_indices[30];
11018 for (
unsigned int i = 0; i < 30; ++i)
11019 line_indices[i] = lines[i]->
index();
11034 for (
unsigned int i = 0; i < 24; ++i)
11035 if (lines[i]->vertex_index((i + 1) % 2) ==
11037 line_orientation[i] =
11043 Assert(lines[i]->vertex_index(i % 2) ==
11046 line_orientation[i] =
11052 for (
unsigned int i = 24; i < 30; ++i)
11053 line_orientation[i] =
11086 new_quads[0]->set_bounding_object_indices(
11090 line_indices[24]});
11091 new_quads[1]->set_bounding_object_indices(
11095 line_indices[25]});
11096 new_quads[2]->set_bounding_object_indices(
11100 line_indices[20]});
11101 new_quads[3]->set_bounding_object_indices(
11105 line_indices[21]});
11106 new_quads[4]->set_bounding_object_indices(
11110 line_indices[28]});
11111 new_quads[5]->set_bounding_object_indices(
11115 line_indices[29]});
11116 new_quads[6]->set_bounding_object_indices(
11121 new_quads[7]->set_bounding_object_indices(
11126 new_quads[8]->set_bounding_object_indices(
11130 line_indices[26]});
11131 new_quads[9]->set_bounding_object_indices(
11135 line_indices[27]});
11136 new_quads[10]->set_bounding_object_indices(
11140 line_indices[12]});
11141 new_quads[11]->set_bounding_object_indices(
11145 line_indices[13]});
11150 new_quads[0]->set_line_orientation(
11151 0, line_orientation[10]);
11152 new_quads[0]->set_line_orientation(
11153 2, line_orientation[16]);
11155 new_quads[1]->set_line_orientation(
11156 1, line_orientation[14]);
11157 new_quads[1]->set_line_orientation(
11158 2, line_orientation[17]);
11160 new_quads[2]->set_line_orientation(
11161 0, line_orientation[11]);
11162 new_quads[2]->set_line_orientation(
11163 3, line_orientation[20]);
11165 new_quads[3]->set_line_orientation(
11166 1, line_orientation[15]);
11167 new_quads[3]->set_line_orientation(
11168 3, line_orientation[21]);
11170 new_quads[4]->set_line_orientation(
11171 0, line_orientation[18]);
11172 new_quads[4]->set_line_orientation(
11173 2, line_orientation[0]);
11175 new_quads[5]->set_line_orientation(
11176 1, line_orientation[22]);
11177 new_quads[5]->set_line_orientation(
11178 2, line_orientation[1]);
11180 new_quads[6]->set_line_orientation(
11181 0, line_orientation[19]);
11182 new_quads[6]->set_line_orientation(
11183 3, line_orientation[4]);
11185 new_quads[7]->set_line_orientation(
11186 1, line_orientation[23]);
11187 new_quads[7]->set_line_orientation(
11188 3, line_orientation[5]);
11190 new_quads[8]->set_line_orientation(
11191 0, line_orientation[2]);
11192 new_quads[8]->set_line_orientation(
11193 2, line_orientation[8]);
11195 new_quads[9]->set_line_orientation(
11196 1, line_orientation[6]);
11197 new_quads[9]->set_line_orientation(
11198 2, line_orientation[9]);
11200 new_quads[10]->set_line_orientation(
11201 0, line_orientation[3]);
11202 new_quads[10]->set_line_orientation(
11203 3, line_orientation[12]);
11205 new_quads[11]->set_line_orientation(
11206 1, line_orientation[7]);
11207 new_quads[11]->set_line_orientation(
11208 3, line_orientation[13]);
11249 const int quad_indices[36] = {
11250 new_quads[0]->index(),
11251 new_quads[1]->index(),
11252 new_quads[2]->index(),
11253 new_quads[3]->index(),
11254 new_quads[4]->index(),
11255 new_quads[5]->index(),
11256 new_quads[6]->index(),
11257 new_quads[7]->index(),
11258 new_quads[8]->index(),
11259 new_quads[9]->index(),
11260 new_quads[10]->index(),
11261 new_quads[11]->index(),
11263 hex->face(0)->isotropic_child_index(
11265 0, f_or[0], f_fl[0], f_ro[0])),
11266 hex->face(0)->isotropic_child_index(
11268 1, f_or[0], f_fl[0], f_ro[0])),
11269 hex->face(0)->isotropic_child_index(
11271 2, f_or[0], f_fl[0], f_ro[0])),
11272 hex->face(0)->isotropic_child_index(
11274 3, f_or[0], f_fl[0], f_ro[0])),
11276 hex->face(1)->isotropic_child_index(
11278 0, f_or[1], f_fl[1], f_ro[1])),
11279 hex->face(1)->isotropic_child_index(
11281 1, f_or[1], f_fl[1], f_ro[1])),
11282 hex->face(1)->isotropic_child_index(
11284 2, f_or[1], f_fl[1], f_ro[1])),
11285 hex->face(1)->isotropic_child_index(
11287 3, f_or[1], f_fl[1], f_ro[1])),
11289 hex->face(2)->isotropic_child_index(
11291 0, f_or[2], f_fl[2], f_ro[2])),
11292 hex->face(2)->isotropic_child_index(
11294 1, f_or[2], f_fl[2], f_ro[2])),
11295 hex->face(2)->isotropic_child_index(
11297 2, f_or[2], f_fl[2], f_ro[2])),
11298 hex->face(2)->isotropic_child_index(
11300 3, f_or[2], f_fl[2], f_ro[2])),
11302 hex->face(3)->isotropic_child_index(
11304 0, f_or[3], f_fl[3], f_ro[3])),
11305 hex->face(3)->isotropic_child_index(
11307 1, f_or[3], f_fl[3], f_ro[3])),
11308 hex->face(3)->isotropic_child_index(
11310 2, f_or[3], f_fl[3], f_ro[3])),
11311 hex->face(3)->isotropic_child_index(
11313 3, f_or[3], f_fl[3], f_ro[3])),
11315 hex->face(4)->isotropic_child_index(
11317 0, f_or[4], f_fl[4], f_ro[4])),
11318 hex->face(4)->isotropic_child_index(
11320 1, f_or[4], f_fl[4], f_ro[4])),
11321 hex->face(4)->isotropic_child_index(
11323 2, f_or[4], f_fl[4], f_ro[4])),
11324 hex->face(4)->isotropic_child_index(
11326 3, f_or[4], f_fl[4], f_ro[4])),
11328 hex->face(5)->isotropic_child_index(
11330 0, f_or[5], f_fl[5], f_ro[5])),
11331 hex->face(5)->isotropic_child_index(
11333 1, f_or[5], f_fl[5], f_ro[5])),
11334 hex->face(5)->isotropic_child_index(
11336 2, f_or[5], f_fl[5], f_ro[5])),
11337 hex->face(5)->isotropic_child_index(
11339 3, f_or[5], f_fl[5], f_ro[5]))};
11342 new_hexes[0]->set_bounding_object_indices(
11349 new_hexes[1]->set_bounding_object_indices(
11356 new_hexes[2]->set_bounding_object_indices(
11362 quad_indices[10]});
11363 new_hexes[3]->set_bounding_object_indices(
11369 quad_indices[11]});
11372 new_hexes[4]->set_bounding_object_indices(
11378 quad_indices[32]});
11379 new_hexes[5]->set_bounding_object_indices(
11385 quad_indices[33]});
11386 new_hexes[6]->set_bounding_object_indices(
11392 quad_indices[34]});
11393 new_hexes[7]->set_bounding_object_indices(
11399 quad_indices[35]});
11433 for (
unsigned int s = 0;
11440 const unsigned int current_child =
11449 ref_case, f, f_or[f], f_fl[f], f_ro[f]));
11450 new_hexes[current_child]->set_combined_face_orientation(
11456 if (check_for_distorted_cells &&
11457 has_distorted_children<dim, spacedim>(hex))
11477 return cells_with_distorted_children;