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 (; face != endf; ++face)
6239 if (face->user_flag_set() ==
false)
6242 const auto reference_face_type = face->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 : face->line_indices())
6280 std::array<raw_quad_iterator, 4> new_faces;
6281 for (
unsigned int f = 0; f < 2; ++f)
6283 auto next_unused_quad =
6287 new_faces[2 * f] = next_unused_quad;
6288 new_faces[2 * f + 1] = ++next_unused_quad;
6290 face->set_children(2 * f, new_faces[2 * f]->
index());
6296 for (
const auto &quad : new_faces)
6306 for (
const auto i : face->vertex_indices())
6309 for (
const auto i : face->line_indices())
6315 get_next_unused_vertex(current_vertex,
6320 face->center(
true,
true);
6324 std::array<raw_line_iterator, 12> lines;
6325 unsigned int n_lines = 0;
6326 for (
unsigned int l = 0; l < face->n_lines(); ++l)
6327 for (
unsigned int c = 0; c < 2; ++c)
6328 lines[n_lines++] = face->line(l)->child(
6329 child_line_index(c, face->line_orientation(l)));
6331 for (
unsigned int l = 0; l < face->n_lines(); ++l)
6332 lines[n_lines++] = new_lines[l];
6334 std::array<int, 12> line_indices;
6335 for (
unsigned int i = 0; i < n_lines; ++i)
6336 line_indices[i] = lines[i]->
index();
6338 static constexpr ::ndarray<unsigned int, 12, 2>
6339 line_vertices_quad{{{{0, 4}},
6352 static constexpr ::ndarray<unsigned int, 4, 4>
6353 quad_lines_quad{{{{0, 8, 4, 10}},
6358 static constexpr ::ndarray<unsigned int, 12, 2>
6359 line_vertices_tri{{{{0, 3}},
6372 static constexpr ::ndarray<unsigned int, 4, 4>
6373 tri_lines_tri{{{{0, 8, 5, X}},
6378 static constexpr ::ndarray<unsigned int, 4, 4, 2>
6379 tri_line_vertices_tri{
6380 {{{{{0, 3}}, {{3, 5}}, {{5, 0}}, {{X, X}}}},
6381 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
6382 {{{{5, 4}}, {{4, 2}}, {{2, 5}}, {{X, X}}}},
6383 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}}}};
6385 const auto &line_vertices =
6387 line_vertices_quad :
6389 const auto &face_lines =
6394 for (
unsigned int i = 0, j = 2 * face->n_lines();
6395 i < face->n_lines();
6398 auto &new_line = new_lines[i];
6399 new_line->set_bounding_object_indices(
6402 new_line->set_used_flag();
6403 new_line->clear_user_flag();
6404 new_line->clear_user_data();
6405 new_line->clear_children();
6406 new_line->set_boundary_id_internal(face->boundary_id());
6407 new_line->set_manifold_id(face->manifold_id());
6411 for (
unsigned int i = 0; i < new_faces.size(); ++i)
6413 auto &new_face = new_faces[i];
6418 reference_face_type);
6421 new_face->set_bounding_object_indices(
6422 {line_indices[face_lines[i][0]],
6423 line_indices[face_lines[i][1]],
6424 line_indices[face_lines[i][2]]});
6426 new_face->set_bounding_object_indices(
6427 {line_indices[face_lines[i][0]],
6428 line_indices[face_lines[i][1]],
6429 line_indices[face_lines[i][2]],
6430 line_indices[face_lines[i][3]]});
6434 new_face->set_used_flag();
6435 new_face->clear_user_flag();
6436 new_face->clear_user_data();
6437 new_face->clear_children();
6438 new_face->set_boundary_id_internal(face->boundary_id());
6439 new_face->set_manifold_id(face->manifold_id());
6441 [[maybe_unused]] std::set<unsigned int> s;
6448 for (
const auto f : new_face->line_indices())
6450 const std::array<unsigned int, 2> vertices_0 = {
6451 {lines[face_lines[i][f]]->vertex_index(0),
6452 lines[face_lines[i][f]]->vertex_index(1)}};
6454 const std::array<unsigned int, 2> vertices_1 = {
6458 const auto orientation =
6466 for (
const auto i : vertices_0)
6468 for (
const auto i : vertices_1)
6472 new_face->set_line_orientation(f, orientation);
6486 static constexpr ::ndarray<unsigned int, 4, 2>
6487 quad_child_boundary_lines{
6488 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
6490 for (
unsigned int i = 0; i < 4; ++i)
6491 for (
unsigned int j = 0; j < 2; ++j)
6492 new_faces[quad_child_boundary_lines[i][j]]
6493 ->set_line_orientation(i, face->line_orientation(i));
6496 face->clear_user_flag();
6501 cells_with_distorted_children;
6511 cell->level() >=
static_cast<int>(
level),
6515 cell->level() ==
static_cast<int>(
level);
6518 if (cell->refine_flag_set() ==
6523 cell->clear_refine_flag();
6524 cell->set_refinement_case(ref_case);
6526 unsigned int n_new_lines = 0;
6527 unsigned int n_new_faces = 0;
6528 unsigned int n_new_cells = 0;
6530 const auto &reference_cell_type = cell->reference_cell();
6546 std::array<raw_line_iterator, 6> new_lines;
6547 for (
unsigned int i = 0; i < n_new_lines; ++i)
6554 new_lines[i]->set_used_flag();
6555 new_lines[i]->clear_user_flag();
6556 new_lines[i]->clear_user_data();
6557 new_lines[i]->clear_children();
6558 new_lines[i]->set_boundary_id_internal(
6560 new_lines[i]->set_manifold_id(cell->manifold_id());
6563 std::array<raw_quad_iterator, 12> new_faces;
6564 for (
unsigned int i = 0; i < n_new_faces; ++i)
6570 auto &new_face = new_faces[i];
6576 reference_cell_type.face_reference_cell(0));
6579 new_face->set_used_flag();
6580 new_face->clear_user_flag();
6581 new_face->clear_user_data();
6582 new_face->clear_children();
6583 new_face->set_boundary_id_internal(
6585 new_face->set_manifold_id(cell->manifold_id());
6586 for (
const auto j : new_faces[i]->line_indices())
6587 new_face->set_line_orientation(
6598 for (
unsigned int i = 0; i < n_new_cells; ++i)
6607 new_cells[i] = next_unused_cell;
6609 auto &new_cell = new_cells[i];
6613 ->reference_cell[new_cell->index()] =
6614 reference_cell_type;
6617 new_cell->set_used_flag();
6618 new_cell->clear_user_flag();
6619 new_cell->clear_user_data();
6620 new_cell->clear_children();
6621 new_cell->set_material_id(cell->material_id());
6622 new_cell->set_manifold_id(cell->manifold_id());
6623 new_cell->set_subdomain_id(cell->subdomain_id());
6626 new_cell->set_parent(cell->index());
6631 for (
const auto f : new_cell->face_indices())
6632 new_cell->set_combined_face_orientation(
6635 for (
unsigned int i = 0; i < n_new_cells / 2; ++i)
6636 cell->set_children(2 * i, new_cells[2 * i]->index());
6648 const unsigned int n_vertices =
6650 for (
unsigned int i = 0; i < n_vertices; ++i)
6653 const std::array<unsigned int, 12> line_indices =
6654 TriaAccessorImplementation::Implementation::
6655 get_line_indices_of_cell(*cell);
6666 const unsigned int n_lines =
std::min(cell->n_lines(), 12u);
6667 for (
unsigned int l = 0; l < n_lines; ++l)
6677 for (
const unsigned int i : cell->face_indices())
6679 cell->face(i)->child(0)->vertex_index(3);
6683 get_next_unused_vertex(current_vertex,
6688 cell->center(
true,
true);
6692 unsigned int chosen_line_tetrahedron = 0;
6696 static constexpr ::ndarray<unsigned int, 6, 2>
6697 new_line_vertices = {{{{22, 26}},
6703 for (
unsigned int i = 0; i < n_new_lines; ++i)
6704 new_lines[i]->set_bounding_object_indices(
6714 static constexpr ::ndarray<unsigned int, 3, 2>
6715 new_line_vertices = {{{{6, 8}}, {{5, 7}}, {{4, 9}}}};
6719 std::uint8_t refinement_choice = cell->refine_choice();
6720 if (refinement_choice ==
6725 double min_distance =
6726 std::numeric_limits<double>::infinity();
6727 for (
unsigned int i = 0; i < new_line_vertices.size();
6730 const double current_distance =
6735 [new_line_vertices[i][1]]]);
6736 if (current_distance < min_distance)
6738 chosen_line_tetrahedron = i;
6739 min_distance = current_distance;
6743 else if (refinement_choice ==
6746 chosen_line_tetrahedron = 0;
6747 else if (refinement_choice ==
6750 chosen_line_tetrahedron = 1;
6751 else if (refinement_choice ==
6754 chosen_line_tetrahedron = 2;
6758 cell->set_refinement_case(
6761 new_lines[0]->set_bounding_object_indices(
6763 [new_line_vertices[chosen_line_tetrahedron][0]],
6765 [new_line_vertices[chosen_line_tetrahedron][1]]});
6770 boost::container::small_vector<raw_line_iterator, 30>
6775 relevant_lines.resize(30);
6776 for (
unsigned int f = 0, k = 0; f < 6; ++f)
6777 for (
unsigned int c = 0; c < 4; ++c, ++k)
6780 ndarray<unsigned int, 4, 2>
6782 {{{0, 1}}, {{3, 0}}, {{0, 3}}, {{3, 2}}}};
6788 standard_to_real_face_vertex(
6790 cell->face_orientation(f),
6792 cell->face_rotation(f)))
6794 standard_to_real_face_line(
6796 cell->face_orientation(f),
6798 cell->face_rotation(f)));
6801 for (
unsigned int i = 0, k = 24; i < 6; ++i, ++k)
6802 relevant_lines[k] = new_lines[i];
6817 relevant_lines.resize(13);
6820 for (
unsigned int f = 0; f < 4; ++f)
6821 for (
unsigned int l = 0; l < 3; ++l, ++k)
6825 array<std::array<unsigned int, 3>, 6>
6826 table = {{{{0, 1, 2}},
6833 const auto combined_orientation =
6834 cell->combined_face_orientation(f);
6838 ->line(table[combined_orientation][l]);
6841 relevant_lines[k++] = new_lines[0];
6847 boost::container::small_vector<unsigned int, 30>
6848 relevant_line_indices(relevant_lines.size());
6849 for (
unsigned int i = 0; i < relevant_line_indices.size();
6851 relevant_line_indices[i] = relevant_lines[i]->
index();
6860 const auto &new_face_lines =
6861 cell->reference_cell().new_isotropic_child_face_lines(
6862 chosen_line_tetrahedron);
6875 cell->reference_cell()
6876 .new_isotropic_child_face_line_vertices(
6877 chosen_line_tetrahedron);
6879 static constexpr ::ndarray<unsigned int, 4, 2>
6880 representative_lines{
6881 {{{0, 2}}, {{2, 0}}, {{3, 3}}, {{1, 1}}}};
6883 for (
unsigned int q = 0; q < n_new_faces; ++q)
6885 auto &new_face = new_faces[q];
6887 if (new_face->n_lines() == 3)
6888 new_face->set_bounding_object_indices(
6889 {relevant_line_indices[new_face_lines[q][0]],
6890 relevant_line_indices[new_face_lines[q][1]],
6891 relevant_line_indices[new_face_lines[q][2]]});
6892 else if (new_face->n_lines() == 4)
6893 new_face->set_bounding_object_indices(
6894 {relevant_line_indices[new_face_lines[q][0]],
6895 relevant_line_indices[new_face_lines[q][1]],
6896 relevant_line_indices[new_face_lines[q][2]],
6897 relevant_line_indices[new_face_lines[q][3]]});
6905 const unsigned int n_compute_lines =
6909 for (
unsigned int line = 0; line < n_compute_lines;
6912 const unsigned int l =
6913 (reference_cell_type ==
6915 representative_lines[q % 4][0] :
6918 const std::array<unsigned int, 2> vertices_0 = {
6919 {relevant_lines[new_face_lines[q][l]]
6921 relevant_lines[new_face_lines[q][l]]
6922 ->vertex_index(1)}};
6924 const std::array<unsigned int, 2> vertices_1 = {
6928 const auto orientation =
6933 new_face->set_line_orientation(l, orientation);
6938 if (reference_cell_type ==
6940 new_faces[representative_lines[q % 4][1] + q -
6942 ->set_line_orientation(l, orientation);
6949 std::array<int, 36> face_indices;
6953 for (
unsigned int i = 0; i < n_new_faces; ++i)
6954 face_indices[i] = new_faces[i]->
index();
6956 for (
unsigned int f = 0, k = n_new_faces; f < 6; ++f)
6957 for (
unsigned int c = 0; c < 4; ++c, ++k)
6959 cell->face(f)->isotropic_child_index(
6962 cell->face_orientation(f),
6964 cell->face_rotation(f)));
6974 for (
unsigned int i = 0; i < n_new_faces; ++i)
6975 face_indices[i] = new_faces[i]->
index();
6977 for (
unsigned int f = 0, k = n_new_faces; f < 4; ++f)
6978 for (
unsigned int c = 0; c < 4; ++c, ++k)
6980 const auto combined_orientation =
6981 cell->combined_face_orientation(f);
6982 face_indices[k] = cell->face(f)->child_index(
6985 .standard_to_real_face_vertex(
6986 c, f, combined_orientation));
7002 const auto cell_faces =
7003 cell->reference_cell().new_isotropic_child_cell_faces(
7004 chosen_line_tetrahedron);
7006 for (
unsigned int c = 0;
7007 c < GeometryInfo<dim>::max_children_per_cell;
7010 auto &new_cell = new_cells[c];
7011 const auto reference_cell = new_cell->reference_cell();
7015 new_cell->set_bounding_object_indices(
7016 {face_indices[cell_faces[c][0]],
7017 face_indices[cell_faces[c][1]],
7018 face_indices[cell_faces[c][2]],
7019 face_indices[cell_faces[c][3]]});
7024 for (
const auto f : new_cell->face_indices())
7026 const auto &face = new_cell->face(f);
7028 Assert(face->n_vertices() == 3,
7031 const std::array<unsigned int, 3> vertices_0 = {
7032 {face->vertex_index(0),
7033 face->vertex_index(1),
7034 face->vertex_index(2)}};
7043 const auto new_cell_vertices =
7044 cell->reference_cell()
7045 .new_isotropic_child_cell_vertices(
7046 chosen_line_tetrahedron)[c];
7050 std::array<unsigned int, 3> vertices_1;
7051 for (
unsigned int face_vertex_no :
7052 face->vertex_indices())
7054 const auto cell_vertex_no =
7055 reference_cell.face_to_cell_vertices(
7060 [new_cell_vertices[cell_vertex_no]];
7063 new_cell->set_combined_face_orientation(
7065 face->reference_cell()
7066 .get_combined_orientation(
7071 else if (new_cell->n_faces() == 6)
7072 new_cell->set_bounding_object_indices(
7073 {face_indices[cell_faces[c][0]],
7074 face_indices[cell_faces[c][1]],
7075 face_indices[cell_faces[c][2]],
7076 face_indices[cell_faces[c][3]],
7077 face_indices[cell_faces[c][4]],
7078 face_indices[cell_faces[c][5]]});
7087 static constexpr ::ndarray<unsigned int, 6, 4>
7088 face_to_child_indices_hex{{{{0, 2, 4, 6}},
7094 if (cell->n_faces() == 6)
7095 for (
const auto f : cell->face_indices())
7097 const auto combined_orientation =
7098 cell->combined_face_orientation(f);
7099 for (
unsigned int c = 0; c < 4; ++c)
7100 new_cells[face_to_child_indices_hex[f][c]]
7101 ->set_combined_face_orientation(
7102 f, combined_orientation);
7107 if (check_for_distorted_cells &&
7108 has_distorted_children<dim, spacedim>(cell))
7117 return cells_with_distorted_children;
7127 const bool check_for_distorted_cells)
7129 const unsigned int dim = 3;
7132 bool flag_isotropic_mesh =
true;
7136 for (; cell != endc; ++cell)
7146 flag_isotropic_mesh =
false;
7150 if (flag_isotropic_mesh)
7152 check_for_distorted_cells);
7163 for (
const auto &cell :
triangulation.active_cell_iterators_on_level(
7165 if (cell->refine_flag_set())
7182 line->clear_user_flag();
7187 quad->clear_user_flag();
7210 unsigned int needed_vertices = 0;
7211 unsigned int needed_lines_single = 0;
7212 unsigned int needed_quads_single = 0;
7213 unsigned int needed_lines_pair = 0;
7214 unsigned int needed_quads_pair = 0;
7219 unsigned int new_cells = 0;
7221 for (
const auto &acell :
7223 if (acell->refine_flag_set())
7233 ++needed_quads_single;
7241 ++needed_lines_single;
7242 needed_quads_single += 4;
7249 needed_lines_single += 6;
7250 needed_quads_single += 12;
7264 for (
const unsigned int face :
7268 aface = acell->face(face);
7275 acell->face_orientation(face),
7276 acell->face_flip(face),
7277 acell->face_rotation(face));
7282 if (face_ref_case ==
7285 if (aface->n_active_descendants() < 4)
7288 aface->set_user_flag();
7290 else if (aface->refinement_case() != face_ref_case)
7301 Assert(aface->refinement_case() ==
7304 aface->refinement_case() ==
7307 aface->set_user_index(face_ref_case);
7313 for (
unsigned int line = 0;
7314 line < GeometryInfo<dim>::lines_per_cell;
7318 !acell->line(line)->has_children())
7319 acell->line(line)->set_user_flag();
7325 const unsigned int used_cells =
7335 used_cells + new_cells,
7348 if (quad->user_flag_set())
7354 needed_quads_pair += 4;
7355 needed_lines_pair += 4;
7356 needed_vertices += 1;
7358 if (quad->user_index())
7362 needed_quads_pair += 2;
7363 needed_lines_single += 1;
7376 if (quad->has_children())
7378 Assert(quad->refinement_case() ==
7381 if ((face_refinement_cases[quad->user_index()] ==
7383 (quad->child(0)->line_index(1) + 1 !=
7384 quad->child(2)->line_index(1))) ||
7385 (face_refinement_cases[quad->user_index()] ==
7387 (quad->child(0)->line_index(3) + 1 !=
7388 quad->child(1)->line_index(3))))
7389 needed_lines_pair += 2;
7398 if (line->user_flag_set())
7400 needed_lines_pair += 2;
7401 needed_vertices += 1;
7407 needed_lines_single);
7411 needed_quads_single);
7414 needed_quads_single);
7418 needed_vertices += std::count(
triangulation.vertices_used.begin(),
7443 for (
const auto &cell :
triangulation.active_cell_iterators())
7444 if (!cell->refine_flag_set())
7445 for (
unsigned int line = 0;
7446 line < GeometryInfo<dim>::lines_per_cell;
7448 if (cell->line(line)->has_children())
7449 for (
unsigned int c = 0; c < 2; ++c)
7450 Assert(cell->line(line)->child(c)->user_flag_set() ==
7463 unsigned int next_unused_vertex = 0;
7474 for (; line != endl; ++line)
7475 if (line->user_flag_set())
7481 while (
triangulation.vertices_used[next_unused_vertex] ==
true)
7482 ++next_unused_vertex;
7486 "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."));
7489 triangulation.vertices[next_unused_vertex] = line->center(
true);
7503 line->set_children(0, next_unused_line->index());
7507 children[2] = {next_unused_line, ++next_unused_line};
7514 children[0]->set_bounding_object_indices(
7515 {line->vertex_index(0), next_unused_vertex});
7516 children[1]->set_bounding_object_indices(
7517 {next_unused_vertex, line->vertex_index(1)});
7519 children[0]->set_used_flag();
7520 children[1]->set_used_flag();
7521 children[0]->clear_children();
7522 children[1]->clear_children();
7525 children[0]->clear_user_flag();
7526 children[1]->clear_user_flag();
7528 children[0]->set_boundary_id_internal(line->boundary_id());
7529 children[1]->set_boundary_id_internal(line->boundary_id());
7531 children[0]->set_manifold_id(line->manifold_id());
7532 children[1]->set_manifold_id(line->manifold_id());
7537 line->clear_user_flag();
7567 for (
unsigned int loop = 0; loop < 2; ++loop)
7580 for (; quad != endq; ++quad)
7582 if (quad->user_index())
7585 face_refinement_cases[quad->user_index()];
7594 if (aniso_quad_ref_case == quad->refinement_case())
7597 Assert(quad->refinement_case() ==
7599 quad->refinement_case() ==
7604 Assert(quad->user_index() ==
7606 quad->user_index() ==
7636 quad->line(2)->child(0)->vertex_index(1);
7638 quad->line(3)->child(0)->vertex_index(1);
7643 quad->line(0)->child(0)->vertex_index(1);
7645 quad->line(1)->child(0)->vertex_index(1);
7648 new_line->set_bounding_object_indices(
7650 new_line->set_used_flag();
7651 new_line->clear_user_flag();
7653 new_line->clear_children();
7654 new_line->set_boundary_id_internal(quad->boundary_id());
7655 new_line->set_manifold_id(quad->manifold_id());
7665 new_quads[0] = next_unused_quad;
7669 new_quads[1] = next_unused_quad;
7674 new_quads[0]->set_bounding_object_indices(
7675 {
static_cast<int>(quad->line_index(0)),
7679 child_line_index(0, quad->line_orientation(2)))
7683 child_line_index(0, quad->line_orientation(3)))
7685 new_quads[1]->set_bounding_object_indices(
7687 static_cast<int>(quad->line_index(1)),
7690 child_line_index(1, quad->line_orientation(2)))
7694 child_line_index(1, quad->line_orientation(3)))
7699 new_quads[0]->set_bounding_object_indices(
7702 child_line_index(0, quad->line_orientation(0)))
7706 child_line_index(0, quad->line_orientation(1)))
7708 static_cast<int>(quad->line_index(2)),
7709 new_line->index()});
7710 new_quads[1]->set_bounding_object_indices(
7713 child_line_index(1, quad->line_orientation(0)))
7717 child_line_index(1, quad->line_orientation(1)))
7720 static_cast<int>(quad->line_index(3))});
7723 for (
const auto &new_quad : new_quads)
7725 new_quad->set_used_flag();
7726 new_quad->clear_user_flag();
7728 new_quad->clear_children();
7729 new_quad->set_boundary_id_internal(quad->boundary_id());
7730 new_quad->set_manifold_id(quad->manifold_id());
7734 for (
unsigned int j = 0;
7735 j < GeometryInfo<dim>::lines_per_face;
7737 new_quad->set_line_orientation(
7744 new_quads[0]->set_line_orientation(
7745 0, quad->line_orientation(0));
7746 new_quads[0]->set_line_orientation(
7747 2, quad->line_orientation(2));
7748 new_quads[1]->set_line_orientation(
7749 1, quad->line_orientation(1));
7750 new_quads[1]->set_line_orientation(
7751 3, quad->line_orientation(3));
7754 new_quads[0]->set_line_orientation(
7755 3, quad->line_orientation(3));
7756 new_quads[1]->set_line_orientation(
7757 2, quad->line_orientation(2));
7761 new_quads[0]->set_line_orientation(
7762 1, quad->line_orientation(1));
7763 new_quads[1]->set_line_orientation(
7764 0, quad->line_orientation(0));
7770 if (quad->refinement_case() ==
7793 if (aniso_quad_ref_case ==
7796 old_child[0] = quad->child(0)->line(1);
7797 old_child[1] = quad->child(2)->line(1);
7801 Assert(aniso_quad_ref_case ==
7805 old_child[0] = quad->child(0)->line(3);
7806 old_child[1] = quad->child(1)->line(3);
7809 if (old_child[0]->
index() + 1 != old_child[1]->
index())
7815 spacedim>::raw_line_iterator
7818 new_child[0] = new_child[1] =
7820 .template next_free_pair_object<1>(
7824 new_child[0]->set_used_flag();
7825 new_child[1]->set_used_flag();
7827 const int old_index_0 = old_child[0]->index(),
7828 old_index_1 = old_child[1]->index(),
7829 new_index_0 = new_child[0]->index(),
7830 new_index_1 = new_child[1]->index();
7834 for (
unsigned int q = 0;
7837 for (
unsigned int l = 0;
7838 l < GeometryInfo<dim>::lines_per_face;
7841 const int this_index =
7843 .get_bounding_object_indices(q)[l];
7844 if (this_index == old_index_0)
7846 .get_bounding_object_indices(q)[l] =
7848 else if (this_index == old_index_1)
7850 .get_bounding_object_indices(q)[l] =
7855 for (
unsigned int i = 0; i < 2; ++i)
7857 Assert(!old_child[i]->has_children(),
7860 new_child[i]->set_bounding_object_indices(
7861 {old_child[i]->vertex_index(0),
7862 old_child[i]->vertex_index(1)});
7863 new_child[i]->set_boundary_id_internal(
7864 old_child[i]->boundary_id());
7865 new_child[i]->set_manifold_id(
7866 old_child[i]->manifold_id());
7867 new_child[i]->set_user_index(
7868 old_child[i]->user_index());
7869 if (old_child[i]->user_flag_set())
7870 new_child[i]->set_user_flag();
7872 new_child[i]->clear_user_flag();
7874 new_child[i]->clear_children();
7876 old_child[i]->clear_user_flag();
7877 old_child[i]->clear_user_index();
7878 old_child[i]->clear_used_flag();
7884 if (aniso_quad_ref_case ==
7887 new_line->set_children(
7888 0, quad->child(0)->line_index(1));
7889 Assert(new_line->child(1) ==
7890 quad->child(2)->line(1),
7927 quad_iterator switch_1 = quad->child(1),
7928 switch_2 = quad->child(2);
7929 const int switch_1_index = switch_1->index();
7930 const int switch_2_index = switch_2->index();
7931 for (
unsigned int l = 0;
7934 for (
unsigned int h = 0;
7938 for (
const unsigned int q :
7941 const int face_index =
7943 ->cells.get_bounding_object_indices(
7945 if (face_index == switch_1_index)
7947 ->cells.get_bounding_object_indices(
7948 h)[q] = switch_2_index;
7949 else if (face_index == switch_2_index)
7951 ->cells.get_bounding_object_indices(
7952 h)[q] = switch_1_index;
7956 const unsigned int switch_1_lines[4] = {
7957 switch_1->line_index(0),
7958 switch_1->line_index(1),
7959 switch_1->line_index(2),
7960 switch_1->line_index(3)};
7962 switch_1_line_orientations[4] = {
7963 switch_1->line_orientation(0),
7964 switch_1->line_orientation(1),
7965 switch_1->line_orientation(2),
7966 switch_1->line_orientation(3)};
7968 switch_1->boundary_id();
7969 const unsigned int switch_1_user_index =
7970 switch_1->user_index();
7971 const bool switch_1_user_flag =
7972 switch_1->user_flag_set();
7974 switch_1_refinement_case =
7975 switch_1->refinement_case();
7976 const int switch_1_first_child_pair =
7977 (switch_1_refinement_case ?
7978 switch_1->child_index(0) :
7980 const int switch_1_second_child_pair =
7981 (switch_1_refinement_case ==
7983 switch_1->child_index(2) :
7986 switch_1->set_bounding_object_indices(
7987 {switch_2->line_index(0),
7988 switch_2->line_index(1),
7989 switch_2->line_index(2),
7990 switch_2->line_index(3)});
7991 switch_1->set_line_orientation(
7992 0, switch_2->line_orientation(0));
7993 switch_1->set_line_orientation(
7994 1, switch_2->line_orientation(1));
7995 switch_1->set_line_orientation(
7996 2, switch_2->line_orientation(2));
7997 switch_1->set_line_orientation(
7998 3, switch_2->line_orientation(3));
7999 switch_1->set_boundary_id_internal(
8000 switch_2->boundary_id());
8001 switch_1->set_manifold_id(switch_2->manifold_id());
8002 switch_1->set_user_index(switch_2->user_index());
8003 if (switch_2->user_flag_set())
8004 switch_1->set_user_flag();
8006 switch_1->clear_user_flag();
8007 switch_1->clear_refinement_case();
8008 switch_1->set_refinement_case(
8009 switch_2->refinement_case());
8010 switch_1->clear_children();
8011 if (switch_2->refinement_case())
8012 switch_1->set_children(0,
8013 switch_2->child_index(0));
8014 if (switch_2->refinement_case() ==
8016 switch_1->set_children(2,
8017 switch_2->child_index(2));
8019 switch_2->set_bounding_object_indices(
8023 switch_1_lines[3]});
8024 switch_2->set_line_orientation(
8025 0, switch_1_line_orientations[0]);
8026 switch_2->set_line_orientation(
8027 1, switch_1_line_orientations[1]);
8028 switch_2->set_line_orientation(
8029 2, switch_1_line_orientations[2]);
8030 switch_2->set_line_orientation(
8031 3, switch_1_line_orientations[3]);
8032 switch_2->set_boundary_id_internal(
8033 switch_1_boundary_id);
8034 switch_2->set_manifold_id(switch_1->manifold_id());
8035 switch_2->set_user_index(switch_1_user_index);
8036 if (switch_1_user_flag)
8037 switch_2->set_user_flag();
8039 switch_2->clear_user_flag();
8040 switch_2->clear_refinement_case();
8041 switch_2->set_refinement_case(
8042 switch_1_refinement_case);
8043 switch_2->clear_children();
8044 switch_2->set_children(0,
8045 switch_1_first_child_pair);
8046 switch_2->set_children(2,
8047 switch_1_second_child_pair);
8049 new_quads[0]->set_refinement_case(
8051 new_quads[0]->set_children(0, quad->child_index(0));
8052 new_quads[1]->set_refinement_case(
8054 new_quads[1]->set_children(0, quad->child_index(2));
8058 new_quads[0]->set_refinement_case(
8060 new_quads[0]->set_children(0, quad->child_index(0));
8061 new_quads[1]->set_refinement_case(
8063 new_quads[1]->set_children(0, quad->child_index(2));
8064 new_line->set_children(
8065 0, quad->child(0)->line_index(3));
8066 Assert(new_line->child(1) ==
8067 quad->child(1)->line(3),
8070 quad->clear_children();
8074 quad->set_children(0, new_quads[0]->
index());
8076 quad->set_refinement_case(aniso_quad_ref_case);
8083 if (quad->user_flag_set())
8095 ++next_unused_vertex;
8099 "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."));
8107 quad->refinement_case();
8113 quad->child(0)->set_user_index(
8115 quad->child(1)->set_user_index(
8121 middle_line = quad->child(0)->line(1);
8123 middle_line = quad->child(0)->line(3);
8130 if (!middle_line->has_children())
8138 middle_line->center(
true);
8146 .template next_free_pair_object<1>(
8151 middle_line->set_children(
8152 0, next_unused_line->index());
8156 raw_line_iterator children[2] = {
8157 next_unused_line, ++next_unused_line};
8165 children[0]->set_bounding_object_indices(
8166 {middle_line->vertex_index(0),
8167 next_unused_vertex});
8168 children[1]->set_bounding_object_indices(
8169 {next_unused_vertex,
8170 middle_line->vertex_index(1)});
8172 children[0]->set_used_flag();
8173 children[1]->set_used_flag();
8174 children[0]->clear_children();
8175 children[1]->clear_children();
8178 children[0]->clear_user_flag();
8179 children[1]->clear_user_flag();
8181 children[0]->set_boundary_id_internal(
8182 middle_line->boundary_id());
8183 children[1]->set_boundary_id_internal(
8184 middle_line->boundary_id());
8186 children[0]->set_manifold_id(
8187 middle_line->manifold_id());
8188 children[1]->set_manifold_id(
8189 middle_line->manifold_id());
8195 quad->clear_user_flag();
8225 quad->center(
true,
true);
8234 for (
unsigned int i = 0; i < 4; ++i)
8247 new_lines[i] = next_unused_line;
8271 quad->line(0)->child(0)->vertex_index(1),
8272 quad->line(1)->child(0)->vertex_index(1),
8273 quad->line(2)->child(0)->vertex_index(1),
8274 quad->line(3)->child(0)->vertex_index(1),
8275 next_unused_vertex};
8277 new_lines[0]->set_bounding_object_indices(
8279 new_lines[1]->set_bounding_object_indices(
8281 new_lines[2]->set_bounding_object_indices(
8283 new_lines[3]->set_bounding_object_indices(
8286 for (
const auto &new_line : new_lines)
8288 new_line->set_used_flag();
8289 new_line->clear_user_flag();
8291 new_line->clear_children();
8292 new_line->set_boundary_id_internal(quad->boundary_id());
8293 new_line->set_manifold_id(quad->manifold_id());
8306 const int line_indices[12] = {
8308 ->child(child_line_index(0, quad->line_orientation(0)))
8311 ->child(child_line_index(1, quad->line_orientation(0)))
8314 ->child(child_line_index(0, quad->line_orientation(1)))
8317 ->child(child_line_index(1, quad->line_orientation(1)))
8320 ->child(child_line_index(0, quad->line_orientation(2)))
8323 ->child(child_line_index(1, quad->line_orientation(2)))
8326 ->child(child_line_index(0, quad->line_orientation(3)))
8329 ->child(child_line_index(1, quad->line_orientation(3)))
8331 new_lines[0]->index(),
8332 new_lines[1]->index(),
8333 new_lines[2]->index(),
8334 new_lines[3]->index()};
8346 new_quads[0] = next_unused_quad;
8350 new_quads[1] = next_unused_quad;
8356 new_quads[2] = next_unused_quad;
8360 new_quads[3] = next_unused_quad;
8364 quad->set_children(0, new_quads[0]->
index());
8365 quad->set_children(2, new_quads[2]->
index());
8368 new_quads[0]->set_bounding_object_indices(
8373 new_quads[1]->set_bounding_object_indices(
8378 new_quads[2]->set_bounding_object_indices(
8383 new_quads[3]->set_bounding_object_indices(
8388 for (
const auto &new_quad : new_quads)
8390 new_quad->set_used_flag();
8391 new_quad->clear_user_flag();
8393 new_quad->clear_children();
8394 new_quad->set_boundary_id_internal(quad->boundary_id());
8395 new_quad->set_manifold_id(quad->manifold_id());
8399 for (
unsigned int j = 0;
8400 j < GeometryInfo<dim>::lines_per_face;
8402 new_quad->set_line_orientation(
8409 new_quads[0]->set_line_orientation(
8410 0, quad->line_orientation(0));
8411 new_quads[0]->set_line_orientation(
8412 2, quad->line_orientation(2));
8413 new_quads[1]->set_line_orientation(
8414 1, quad->line_orientation(1));
8415 new_quads[1]->set_line_orientation(
8416 2, quad->line_orientation(2));
8417 new_quads[2]->set_line_orientation(
8418 0, quad->line_orientation(0));
8419 new_quads[2]->set_line_orientation(
8420 3, quad->line_orientation(3));
8421 new_quads[3]->set_line_orientation(
8422 1, quad->line_orientation(1));
8423 new_quads[3]->set_line_orientation(
8424 3, quad->line_orientation(3));
8428 quad->clear_user_flag();
8439 cells_with_distorted_children;
8453 for (; hex != endh; ++hex)
8454 if (hex->refine_flag_set())
8462 hex->clear_refine_flag();
8463 hex->set_refinement_case(ref_case);
8474 unsigned int n_new_lines = 0;
8475 unsigned int n_new_quads = 0;
8476 unsigned int n_new_hexes = 0;
8507 new_lines(n_new_lines);
8508 for (
unsigned int i = 0; i < n_new_lines; ++i)
8515 new_lines[i]->set_used_flag();
8516 new_lines[i]->clear_user_flag();
8517 new_lines[i]->clear_user_data();
8518 new_lines[i]->clear_children();
8520 new_lines[i]->set_boundary_id_internal(
8524 new_lines[i]->set_manifold_id(hex->manifold_id());
8531 new_quads(n_new_quads);
8532 for (
unsigned int i = 0; i < n_new_quads; ++i)
8539 new_quads[i]->set_used_flag();
8540 new_quads[i]->clear_user_flag();
8541 new_quads[i]->clear_user_data();
8542 new_quads[i]->clear_children();
8544 new_quads[i]->set_boundary_id_internal(
8548 new_quads[i]->set_manifold_id(hex->manifold_id());
8551 for (
unsigned int j = 0;
8552 j < GeometryInfo<dim>::lines_per_face;
8554 new_quads[i]->set_line_orientation(
8564 new_hexes(n_new_hexes);
8565 for (
unsigned int i = 0; i < n_new_hexes; ++i)
8574 new_hexes[i] = next_unused_hex;
8577 new_hexes[i]->set_used_flag();
8578 new_hexes[i]->clear_user_flag();
8579 new_hexes[i]->clear_user_data();
8580 new_hexes[i]->clear_children();
8583 new_hexes[i]->set_material_id(hex->material_id());
8584 new_hexes[i]->set_manifold_id(hex->manifold_id());
8585 new_hexes[i]->set_subdomain_id(subdomainid);
8588 new_hexes[i]->set_parent(hex->index());
8600 for (
const unsigned int f :
8602 new_hexes[i]->set_combined_face_orientation(
8606 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
8607 hex->set_children(2 * i, new_hexes[2 * i]->index());
8614 const bool f_or[6] = {hex->face_orientation(0),
8615 hex->face_orientation(1),
8616 hex->face_orientation(2),
8617 hex->face_orientation(3),
8618 hex->face_orientation(4),
8619 hex->face_orientation(5)};
8622 const bool f_fl[6] = {hex->face_flip(0),
8630 const bool f_ro[6] = {hex->face_rotation(0),
8631 hex->face_rotation(1),
8632 hex->face_rotation(2),
8633 hex->face_rotation(3),
8634 hex->face_rotation(4),
8635 hex->face_rotation(5)};
8639 hex->combined_face_orientation(0),
8640 hex->combined_face_orientation(1),
8641 hex->combined_face_orientation(2),
8642 hex->combined_face_orientation(3),
8643 hex->combined_face_orientation(4),
8644 hex->combined_face_orientation(5)};
8654 const unsigned int child_at_origin[2][2][2] = {
8741 raw_line_iterator lines[4] = {
8742 hex->face(2)->child(0)->line(
8743 (hex->face(2)->refinement_case() ==
8747 hex->face(3)->child(0)->line(
8748 (hex->face(3)->refinement_case() ==
8752 hex->face(4)->child(0)->line(
8753 (hex->face(4)->refinement_case() ==
8757 hex->face(5)->child(0)->line(
8758 (hex->face(5)->refinement_case() ==
8764 unsigned int line_indices[4];
8765 for (
unsigned int i = 0; i < 4; ++i)
8766 line_indices[i] = lines[i]->
index();
8779 const unsigned int middle_vertices[2] = {
8780 hex->line(2)->child(0)->vertex_index(1),
8781 hex->line(7)->child(0)->vertex_index(1)};
8783 for (
unsigned int i = 0; i < 4; ++i)
8784 if (lines[i]->vertex_index(i % 2) ==
8785 middle_vertices[i % 2])
8786 line_orientation[i] =
8791 Assert(lines[i]->vertex_index((i + 1) % 2) ==
8792 middle_vertices[i % 2],
8794 line_orientation[i] =
8800 new_quads[0]->set_bounding_object_indices(
8806 new_quads[0]->set_line_orientation(
8807 0, line_orientation[0]);
8808 new_quads[0]->set_line_orientation(
8809 1, line_orientation[1]);
8810 new_quads[0]->set_line_orientation(
8811 2, line_orientation[2]);
8812 new_quads[0]->set_line_orientation(
8813 3, line_orientation[3]);
8846 const int quad_indices[11] = {
8847 new_quads[0]->index(),
8849 hex->face(0)->index(),
8851 hex->face(1)->index(),
8853 hex->face(2)->child_index(
8854 child_at_origin[hex->face(2)->refinement_case() -
8855 1][f_fl[2]][f_ro[2]]),
8856 hex->face(2)->child_index(
8858 child_at_origin[hex->face(2)->refinement_case() -
8859 1][f_fl[2]][f_ro[2]]),
8861 hex->face(3)->child_index(
8862 child_at_origin[hex->face(3)->refinement_case() -
8863 1][f_fl[3]][f_ro[3]]),
8864 hex->face(3)->child_index(
8866 child_at_origin[hex->face(3)->refinement_case() -
8867 1][f_fl[3]][f_ro[3]]),
8869 hex->face(4)->child_index(
8870 child_at_origin[hex->face(4)->refinement_case() -
8871 1][f_fl[4]][f_ro[4]]),
8872 hex->face(4)->child_index(
8874 child_at_origin[hex->face(4)->refinement_case() -
8875 1][f_fl[4]][f_ro[4]]),
8877 hex->face(5)->child_index(
8878 child_at_origin[hex->face(5)->refinement_case() -
8879 1][f_fl[5]][f_ro[5]]),
8880 hex->face(5)->child_index(
8882 child_at_origin[hex->face(5)->refinement_case() -
8883 1][f_fl[5]][f_ro[5]])
8887 new_hexes[0]->set_bounding_object_indices(
8894 new_hexes[1]->set_bounding_object_indices(
8969 raw_line_iterator lines[4] = {
8970 hex->face(0)->child(0)->line(
8971 (hex->face(0)->refinement_case() ==
8975 hex->face(1)->child(0)->line(
8976 (hex->face(1)->refinement_case() ==
8980 hex->face(4)->child(0)->line(
8981 (hex->face(4)->refinement_case() ==
8985 hex->face(5)->child(0)->line(
8986 (hex->face(5)->refinement_case() ==
8992 unsigned int line_indices[4];
8993 for (
unsigned int i = 0; i < 4; ++i)
8994 line_indices[i] = lines[i]->
index();
9007 const unsigned int middle_vertices[2] = {
9008 hex->line(0)->child(0)->vertex_index(1),
9009 hex->line(5)->child(0)->vertex_index(1)};
9011 for (
unsigned int i = 0; i < 4; ++i)
9012 if (lines[i]->vertex_index(i % 2) ==
9013 middle_vertices[i % 2])
9014 line_orientation[i] =
9019 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9020 middle_vertices[i % 2],
9022 line_orientation[i] =
9028 new_quads[0]->set_bounding_object_indices(
9034 new_quads[0]->set_line_orientation(
9035 0, line_orientation[2]);
9036 new_quads[0]->set_line_orientation(
9037 1, line_orientation[3]);
9038 new_quads[0]->set_line_orientation(
9039 2, line_orientation[0]);
9040 new_quads[0]->set_line_orientation(
9041 3, line_orientation[1]);
9074 const int quad_indices[11] = {
9075 new_quads[0]->index(),
9077 hex->face(0)->child_index(
9078 child_at_origin[hex->face(0)->refinement_case() -
9079 1][f_fl[0]][f_ro[0]]),
9080 hex->face(0)->child_index(
9082 child_at_origin[hex->face(0)->refinement_case() -
9083 1][f_fl[0]][f_ro[0]]),
9085 hex->face(1)->child_index(
9086 child_at_origin[hex->face(1)->refinement_case() -
9087 1][f_fl[1]][f_ro[1]]),
9088 hex->face(1)->child_index(
9090 child_at_origin[hex->face(1)->refinement_case() -
9091 1][f_fl[1]][f_ro[1]]),
9093 hex->face(2)->index(),
9095 hex->face(3)->index(),
9097 hex->face(4)->child_index(
9098 child_at_origin[hex->face(4)->refinement_case() -
9099 1][f_fl[4]][f_ro[4]]),
9100 hex->face(4)->child_index(
9102 child_at_origin[hex->face(4)->refinement_case() -
9103 1][f_fl[4]][f_ro[4]]),
9105 hex->face(5)->child_index(
9106 child_at_origin[hex->face(5)->refinement_case() -
9107 1][f_fl[5]][f_ro[5]]),
9108 hex->face(5)->child_index(
9110 child_at_origin[hex->face(5)->refinement_case() -
9111 1][f_fl[5]][f_ro[5]])
9115 new_hexes[0]->set_bounding_object_indices(
9122 new_hexes[1]->set_bounding_object_indices(
9199 raw_line_iterator lines[4] = {
9200 hex->face(0)->child(0)->line(
9201 (hex->face(0)->refinement_case() ==
9205 hex->face(1)->child(0)->line(
9206 (hex->face(1)->refinement_case() ==
9210 hex->face(2)->child(0)->line(
9211 (hex->face(2)->refinement_case() ==
9215 hex->face(3)->child(0)->line(
9216 (hex->face(3)->refinement_case() ==
9222 unsigned int line_indices[4];
9223 for (
unsigned int i = 0; i < 4; ++i)
9224 line_indices[i] = lines[i]->
index();
9237 const unsigned int middle_vertices[2] = {
9238 middle_vertex_index<dim, spacedim>(hex->line(8)),
9239 middle_vertex_index<dim, spacedim>(hex->line(11))};
9241 for (
unsigned int i = 0; i < 4; ++i)
9242 if (lines[i]->vertex_index(i % 2) ==
9243 middle_vertices[i % 2])
9244 line_orientation[i] =
9249 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9250 middle_vertices[i % 2],
9252 line_orientation[i] =
9258 new_quads[0]->set_bounding_object_indices(
9264 new_quads[0]->set_line_orientation(
9265 0, line_orientation[0]);
9266 new_quads[0]->set_line_orientation(
9267 1, line_orientation[1]);
9268 new_quads[0]->set_line_orientation(
9269 2, line_orientation[2]);
9270 new_quads[0]->set_line_orientation(
9271 3, line_orientation[3]);
9305 const int quad_indices[11] = {
9306 new_quads[0]->index(),
9308 hex->face(0)->child_index(
9309 child_at_origin[hex->face(0)->refinement_case() -
9310 1][f_fl[0]][f_ro[0]]),
9311 hex->face(0)->child_index(
9313 child_at_origin[hex->face(0)->refinement_case() -
9314 1][f_fl[0]][f_ro[0]]),
9316 hex->face(1)->child_index(
9317 child_at_origin[hex->face(1)->refinement_case() -
9318 1][f_fl[1]][f_ro[1]]),
9319 hex->face(1)->child_index(
9321 child_at_origin[hex->face(1)->refinement_case() -
9322 1][f_fl[1]][f_ro[1]]),
9324 hex->face(2)->child_index(
9325 child_at_origin[hex->face(2)->refinement_case() -
9326 1][f_fl[2]][f_ro[2]]),
9327 hex->face(2)->child_index(
9329 child_at_origin[hex->face(2)->refinement_case() -
9330 1][f_fl[2]][f_ro[2]]),
9332 hex->face(3)->child_index(
9333 child_at_origin[hex->face(3)->refinement_case() -
9334 1][f_fl[3]][f_ro[3]]),
9335 hex->face(3)->child_index(
9337 child_at_origin[hex->face(3)->refinement_case() -
9338 1][f_fl[3]][f_ro[3]]),
9340 hex->face(4)->index(),
9342 hex->face(5)->index()
9345 new_hexes[0]->set_bounding_object_indices(
9352 new_hexes[1]->set_bounding_object_indices(
9384 new_lines[0]->set_bounding_object_indices(
9385 {middle_vertex_index<dim, spacedim>(hex->face(4)),
9386 middle_vertex_index<dim, spacedim>(hex->face(5))});
9454 spacedim>::raw_line_iterator lines[13] = {
9455 hex->face(0)->child(0)->line(
9456 (hex->face(0)->refinement_case() ==
9460 hex->face(1)->child(0)->line(
9461 (hex->face(1)->refinement_case() ==
9465 hex->face(2)->child(0)->line(
9466 (hex->face(2)->refinement_case() ==
9470 hex->face(3)->child(0)->line(
9471 (hex->face(3)->refinement_case() ==
9479 0, f_or[4], f_fl[4], f_ro[4]))
9482 1, f_or[4], f_fl[4], f_ro[4])),
9486 3, f_or[4], f_fl[4], f_ro[4]))
9489 0, f_or[4], f_fl[4], f_ro[4])),
9493 0, f_or[4], f_fl[4], f_ro[4]))
9496 3, f_or[4], f_fl[4], f_ro[4])),
9500 3, f_or[4], f_fl[4], f_ro[4]))
9503 2, f_or[4], f_fl[4], f_ro[4])),
9508 0, f_or[5], f_fl[5], f_ro[5]))
9511 1, f_or[5], f_fl[5], f_ro[5])),
9515 3, f_or[5], f_fl[5], f_ro[5]))
9518 0, f_or[5], f_fl[5], f_ro[5])),
9522 0, f_or[5], f_fl[5], f_ro[5]))
9525 3, f_or[5], f_fl[5], f_ro[5])),
9529 3, f_or[5], f_fl[5], f_ro[5]))
9532 2, f_or[5], f_fl[5], f_ro[5])),
9537 unsigned int line_indices[13];
9538 for (
unsigned int i = 0; i < 13; ++i)
9539 line_indices[i] = lines[i]->
index();
9550 const unsigned int middle_vertices[4] = {
9551 hex->line(0)->child(0)->vertex_index(1),
9552 hex->line(1)->child(0)->vertex_index(1),
9553 hex->line(2)->child(0)->vertex_index(1),
9554 hex->line(3)->child(0)->vertex_index(1),
9560 for (
unsigned int i = 0; i < 4; ++i)
9561 if (lines[i]->vertex_index(0) == middle_vertices[i])
9562 line_orientation[i] =
9567 Assert(lines[i]->vertex_index(1) ==
9570 line_orientation[i] =
9580 for (
unsigned int i = 4; i < 12; ++i)
9581 if (lines[i]->vertex_index((i + 1) % 2) ==
9582 middle_vertex_index<dim, spacedim>(
9583 hex->face(3 + i / 4)))
9584 line_orientation[i] =
9589 Assert(lines[i]->vertex_index(i % 2) ==
9590 (middle_vertex_index<dim, spacedim>(
9591 hex->face(3 + i / 4))),
9593 line_orientation[i] =
9599 line_orientation[12] =
9625 new_quads[0]->set_bounding_object_indices(
9630 new_quads[1]->set_bounding_object_indices(
9635 new_quads[2]->set_bounding_object_indices(
9640 new_quads[3]->set_bounding_object_indices(
9646 new_quads[0]->set_line_orientation(
9647 0, line_orientation[2]);
9648 new_quads[0]->set_line_orientation(
9649 2, line_orientation[4]);
9650 new_quads[0]->set_line_orientation(
9651 3, line_orientation[8]);
9653 new_quads[1]->set_line_orientation(
9654 1, line_orientation[3]);
9655 new_quads[1]->set_line_orientation(
9656 2, line_orientation[5]);
9657 new_quads[1]->set_line_orientation(
9658 3, line_orientation[9]);
9660 new_quads[2]->set_line_orientation(
9661 0, line_orientation[6]);
9662 new_quads[2]->set_line_orientation(
9663 1, line_orientation[10]);
9664 new_quads[2]->set_line_orientation(
9665 2, line_orientation[0]);
9667 new_quads[3]->set_line_orientation(
9668 0, line_orientation[7]);
9669 new_quads[3]->set_line_orientation(
9670 1, line_orientation[11]);
9671 new_quads[3]->set_line_orientation(
9672 3, line_orientation[1]);
9705 const int quad_indices[20] = {
9706 new_quads[0]->index(),
9707 new_quads[1]->index(),
9708 new_quads[2]->index(),
9709 new_quads[3]->index(),
9711 hex->face(0)->child_index(
9712 child_at_origin[hex->face(0)->refinement_case() -
9713 1][f_fl[0]][f_ro[0]]),
9714 hex->face(0)->child_index(
9716 child_at_origin[hex->face(0)->refinement_case() -
9717 1][f_fl[0]][f_ro[0]]),
9719 hex->face(1)->child_index(
9720 child_at_origin[hex->face(1)->refinement_case() -
9721 1][f_fl[1]][f_ro[1]]),
9722 hex->face(1)->child_index(
9724 child_at_origin[hex->face(1)->refinement_case() -
9725 1][f_fl[1]][f_ro[1]]),
9727 hex->face(2)->child_index(
9728 child_at_origin[hex->face(2)->refinement_case() -
9729 1][f_fl[2]][f_ro[2]]),
9730 hex->face(2)->child_index(
9732 child_at_origin[hex->face(2)->refinement_case() -
9733 1][f_fl[2]][f_ro[2]]),
9735 hex->face(3)->child_index(
9736 child_at_origin[hex->face(3)->refinement_case() -
9737 1][f_fl[3]][f_ro[3]]),
9738 hex->face(3)->child_index(
9740 child_at_origin[hex->face(3)->refinement_case() -
9741 1][f_fl[3]][f_ro[3]]),
9743 hex->face(4)->isotropic_child_index(
9745 0, f_or[4], f_fl[4], f_ro[4])),
9746 hex->face(4)->isotropic_child_index(
9748 1, f_or[4], f_fl[4], f_ro[4])),
9749 hex->face(4)->isotropic_child_index(
9751 2, f_or[4], f_fl[4], f_ro[4])),
9752 hex->face(4)->isotropic_child_index(
9754 3, f_or[4], f_fl[4], f_ro[4])),
9756 hex->face(5)->isotropic_child_index(
9758 0, f_or[5], f_fl[5], f_ro[5])),
9759 hex->face(5)->isotropic_child_index(
9761 1, f_or[5], f_fl[5], f_ro[5])),
9762 hex->face(5)->isotropic_child_index(
9764 2, f_or[5], f_fl[5], f_ro[5])),
9765 hex->face(5)->isotropic_child_index(
9767 3, f_or[5], f_fl[5], f_ro[5]))};
9769 new_hexes[0]->set_bounding_object_indices(
9776 new_hexes[1]->set_bounding_object_indices(
9783 new_hexes[2]->set_bounding_object_indices(
9790 new_hexes[3]->set_bounding_object_indices(
9822 new_lines[0]->set_bounding_object_indices(
9823 {middle_vertex_index<dim, spacedim>(hex->face(2)),
9824 middle_vertex_index<dim, spacedim>(hex->face(3))});
9892 spacedim>::raw_line_iterator lines[13] = {
9893 hex->face(0)->child(0)->line(
9894 (hex->face(0)->refinement_case() ==
9898 hex->face(1)->child(0)->line(
9899 (hex->face(1)->refinement_case() ==
9903 hex->face(4)->child(0)->line(
9904 (hex->face(4)->refinement_case() ==
9908 hex->face(5)->child(0)->line(
9909 (hex->face(5)->refinement_case() ==
9917 0, f_or[2], f_fl[2], f_ro[2]))
9920 3, f_or[2], f_fl[2], f_ro[2])),
9924 3, f_or[2], f_fl[2], f_ro[2]))
9927 2, f_or[2], f_fl[2], f_ro[2])),
9931 0, f_or[2], f_fl[2], f_ro[2]))
9934 1, f_or[2], f_fl[2], f_ro[2])),
9938 3, f_or[2], f_fl[2], f_ro[2]))
9941 0, f_or[2], f_fl[2], f_ro[2])),
9946 0, f_or[3], f_fl[3], f_ro[3]))
9949 3, f_or[3], f_fl[3], f_ro[3])),
9953 3, f_or[3], f_fl[3], f_ro[3]))
9956 2, f_or[3], f_fl[3], f_ro[3])),
9960 0, f_or[3], f_fl[3], f_ro[3]))
9963 1, f_or[3], f_fl[3], f_ro[3])),
9967 3, f_or[3], f_fl[3], f_ro[3]))
9970 0, f_or[3], f_fl[3], f_ro[3])),
9975 unsigned int line_indices[13];
9976 for (
unsigned int i = 0; i < 13; ++i)
9977 line_indices[i] = lines[i]->
index();
9988 const unsigned int middle_vertices[4] = {
9989 hex->line(8)->child(0)->vertex_index(1),
9990 hex->line(9)->child(0)->vertex_index(1),
9991 hex->line(2)->child(0)->vertex_index(1),
9992 hex->line(6)->child(0)->vertex_index(1),
9997 for (
unsigned int i = 0; i < 4; ++i)
9998 if (lines[i]->vertex_index(0) == middle_vertices[i])
9999 line_orientation[i] =
10004 Assert(lines[i]->vertex_index(1) ==
10005 middle_vertices[i],
10007 line_orientation[i] =
10017 for (
unsigned int i = 4; i < 12; ++i)
10018 if (lines[i]->vertex_index((i + 1) % 2) ==
10019 middle_vertex_index<dim, spacedim>(
10020 hex->face(1 + i / 4)))
10021 line_orientation[i] =
10027 Assert(lines[i]->vertex_index(i % 2) ==
10028 (middle_vertex_index<dim, spacedim>(
10029 hex->face(1 + i / 4))),
10031 line_orientation[i] =
10037 line_orientation[12] =
10064 new_quads[0]->set_bounding_object_indices(
10068 line_indices[10]});
10069 new_quads[1]->set_bounding_object_indices(
10073 line_indices[11]});
10074 new_quads[2]->set_bounding_object_indices(
10078 line_indices[12]});
10079 new_quads[3]->set_bounding_object_indices(
10085 new_quads[0]->set_line_orientation(
10086 0, line_orientation[0]);
10087 new_quads[0]->set_line_orientation(
10088 2, line_orientation[6]);
10089 new_quads[0]->set_line_orientation(
10090 3, line_orientation[10]);
10092 new_quads[1]->set_line_orientation(
10093 1, line_orientation[1]);
10094 new_quads[1]->set_line_orientation(
10095 2, line_orientation[7]);
10096 new_quads[1]->set_line_orientation(
10097 3, line_orientation[11]);
10099 new_quads[2]->set_line_orientation(
10100 0, line_orientation[4]);
10101 new_quads[2]->set_line_orientation(
10102 1, line_orientation[8]);
10103 new_quads[2]->set_line_orientation(
10104 2, line_orientation[2]);
10106 new_quads[3]->set_line_orientation(
10107 0, line_orientation[5]);
10108 new_quads[3]->set_line_orientation(
10109 1, line_orientation[9]);
10110 new_quads[3]->set_line_orientation(
10111 3, line_orientation[3]);
10145 const int quad_indices[20] = {
10146 new_quads[0]->index(),
10147 new_quads[1]->index(),
10148 new_quads[2]->index(),
10149 new_quads[3]->index(),
10151 hex->face(0)->child_index(
10152 child_at_origin[hex->face(0)->refinement_case() -
10153 1][f_fl[0]][f_ro[0]]),
10154 hex->face(0)->child_index(
10156 child_at_origin[hex->face(0)->refinement_case() -
10157 1][f_fl[0]][f_ro[0]]),
10159 hex->face(1)->child_index(
10160 child_at_origin[hex->face(1)->refinement_case() -
10161 1][f_fl[1]][f_ro[1]]),
10162 hex->face(1)->child_index(
10164 child_at_origin[hex->face(1)->refinement_case() -
10165 1][f_fl[1]][f_ro[1]]),
10167 hex->face(2)->isotropic_child_index(
10169 0, f_or[2], f_fl[2], f_ro[2])),
10170 hex->face(2)->isotropic_child_index(
10172 1, f_or[2], f_fl[2], f_ro[2])),
10173 hex->face(2)->isotropic_child_index(
10175 2, f_or[2], f_fl[2], f_ro[2])),
10176 hex->face(2)->isotropic_child_index(
10178 3, f_or[2], f_fl[2], f_ro[2])),
10180 hex->face(3)->isotropic_child_index(
10182 0, f_or[3], f_fl[3], f_ro[3])),
10183 hex->face(3)->isotropic_child_index(
10185 1, f_or[3], f_fl[3], f_ro[3])),
10186 hex->face(3)->isotropic_child_index(
10188 2, f_or[3], f_fl[3], f_ro[3])),
10189 hex->face(3)->isotropic_child_index(
10191 3, f_or[3], f_fl[3], f_ro[3])),
10193 hex->face(4)->child_index(
10194 child_at_origin[hex->face(4)->refinement_case() -
10195 1][f_fl[4]][f_ro[4]]),
10196 hex->face(4)->child_index(
10198 child_at_origin[hex->face(4)->refinement_case() -
10199 1][f_fl[4]][f_ro[4]]),
10201 hex->face(5)->child_index(
10202 child_at_origin[hex->face(5)->refinement_case() -
10203 1][f_fl[5]][f_ro[5]]),
10204 hex->face(5)->child_index(
10206 child_at_origin[hex->face(5)->refinement_case() -
10207 1][f_fl[5]][f_ro[5]])};
10218 new_hexes[0]->set_bounding_object_indices(
10225 new_hexes[1]->set_bounding_object_indices(
10231 quad_indices[18]});
10232 new_hexes[2]->set_bounding_object_indices(
10239 new_hexes[3]->set_bounding_object_indices(
10245 quad_indices[19]});
10272 new_lines[0]->set_bounding_object_indices(
10274 {middle_vertex_index<dim, spacedim>(hex->face(0)),
10275 middle_vertex_index<dim, spacedim>(hex->face(1))});
10344 spacedim>::raw_line_iterator lines[13] = {
10345 hex->face(2)->child(0)->line(
10346 (hex->face(2)->refinement_case() ==
10350 hex->face(3)->child(0)->line(
10351 (hex->face(3)->refinement_case() ==
10355 hex->face(4)->child(0)->line(
10356 (hex->face(4)->refinement_case() ==
10360 hex->face(5)->child(0)->line(
10361 (hex->face(5)->refinement_case() ==
10369 0, f_or[0], f_fl[0], f_ro[0]))
10372 1, f_or[0], f_fl[0], f_ro[0])),
10376 3, f_or[0], f_fl[0], f_ro[0]))
10379 0, f_or[0], f_fl[0], f_ro[0])),
10383 0, f_or[0], f_fl[0], f_ro[0]))
10386 3, f_or[0], f_fl[0], f_ro[0])),
10390 3, f_or[0], f_fl[0], f_ro[0]))
10393 2, f_or[0], f_fl[0], f_ro[0])),
10398 0, f_or[1], f_fl[1], f_ro[1]))
10401 1, f_or[1], f_fl[1], f_ro[1])),
10405 3, f_or[1], f_fl[1], f_ro[1]))
10408 0, f_or[1], f_fl[1], f_ro[1])),
10412 0, f_or[1], f_fl[1], f_ro[1]))
10415 3, f_or[1], f_fl[1], f_ro[1])),
10419 3, f_or[1], f_fl[1], f_ro[1]))
10422 2, f_or[1], f_fl[1], f_ro[1])),
10427 unsigned int line_indices[13];
10429 for (
unsigned int i = 0; i < 13; ++i)
10430 line_indices[i] = lines[i]->
index();
10441 const unsigned int middle_vertices[4] = {
10442 hex->line(8)->child(0)->vertex_index(1),
10443 hex->line(10)->child(0)->vertex_index(1),
10444 hex->line(0)->child(0)->vertex_index(1),
10445 hex->line(4)->child(0)->vertex_index(1),
10450 for (
unsigned int i = 0; i < 4; ++i)
10451 if (lines[i]->vertex_index(0) == middle_vertices[i])
10452 line_orientation[i] =
10457 Assert(lines[i]->vertex_index(1) ==
10458 middle_vertices[i],
10460 line_orientation[i] =
10470 for (
unsigned int i = 4; i < 12; ++i)
10471 if (lines[i]->vertex_index((i + 1) % 2) ==
10472 middle_vertex_index<dim, spacedim>(
10473 hex->face(i / 4 - 1)))
10474 line_orientation[i] =
10479 Assert(lines[i]->vertex_index(i % 2) ==
10480 (middle_vertex_index<dim, spacedim>(
10481 hex->face(i / 4 - 1))),
10483 line_orientation[i] =
10488 line_orientation[12] =
10509 new_quads[0]->set_bounding_object_indices(
10513 line_indices[12]});
10514 new_quads[1]->set_bounding_object_indices(
10519 new_quads[2]->set_bounding_object_indices(
10524 new_quads[3]->set_bounding_object_indices(
10530 new_quads[0]->set_line_orientation(
10531 0, line_orientation[6]);
10532 new_quads[0]->set_line_orientation(
10533 1, line_orientation[10]);
10534 new_quads[0]->set_line_orientation(
10535 2, line_orientation[0]);
10537 new_quads[1]->set_line_orientation(
10538 0, line_orientation[7]);
10539 new_quads[1]->set_line_orientation(
10540 1, line_orientation[11]);
10541 new_quads[1]->set_line_orientation(
10542 3, line_orientation[1]);
10544 new_quads[2]->set_line_orientation(
10545 0, line_orientation[2]);
10546 new_quads[2]->set_line_orientation(
10547 2, line_orientation[4]);
10548 new_quads[2]->set_line_orientation(
10549 3, line_orientation[8]);
10551 new_quads[3]->set_line_orientation(
10552 1, line_orientation[3]);
10553 new_quads[3]->set_line_orientation(
10554 2, line_orientation[5]);
10555 new_quads[3]->set_line_orientation(
10556 3, line_orientation[9]);
10590 const int quad_indices[20] = {
10591 new_quads[0]->index(),
10592 new_quads[1]->index(),
10593 new_quads[2]->index(),
10594 new_quads[3]->index(),
10596 hex->face(0)->isotropic_child_index(
10598 0, f_or[0], f_fl[0], f_ro[0])),
10599 hex->face(0)->isotropic_child_index(
10601 1, f_or[0], f_fl[0], f_ro[0])),
10602 hex->face(0)->isotropic_child_index(
10604 2, f_or[0], f_fl[0], f_ro[0])),
10605 hex->face(0)->isotropic_child_index(
10607 3, f_or[0], f_fl[0], f_ro[0])),
10609 hex->face(1)->isotropic_child_index(
10611 0, f_or[1], f_fl[1], f_ro[1])),
10612 hex->face(1)->isotropic_child_index(
10614 1, f_or[1], f_fl[1], f_ro[1])),
10615 hex->face(1)->isotropic_child_index(
10617 2, f_or[1], f_fl[1], f_ro[1])),
10618 hex->face(1)->isotropic_child_index(
10620 3, f_or[1], f_fl[1], f_ro[1])),
10622 hex->face(2)->child_index(
10623 child_at_origin[hex->face(2)->refinement_case() -
10624 1][f_fl[2]][f_ro[2]]),
10625 hex->face(2)->child_index(
10627 child_at_origin[hex->face(2)->refinement_case() -
10628 1][f_fl[2]][f_ro[2]]),
10630 hex->face(3)->child_index(
10631 child_at_origin[hex->face(3)->refinement_case() -
10632 1][f_fl[3]][f_ro[3]]),
10633 hex->face(3)->child_index(
10635 child_at_origin[hex->face(3)->refinement_case() -
10636 1][f_fl[3]][f_ro[3]]),
10638 hex->face(4)->child_index(
10639 child_at_origin[hex->face(4)->refinement_case() -
10640 1][f_fl[4]][f_ro[4]]),
10641 hex->face(4)->child_index(
10643 child_at_origin[hex->face(4)->refinement_case() -
10644 1][f_fl[4]][f_ro[4]]),
10646 hex->face(5)->child_index(
10647 child_at_origin[hex->face(5)->refinement_case() -
10648 1][f_fl[5]][f_ro[5]]),
10649 hex->face(5)->child_index(
10651 child_at_origin[hex->face(5)->refinement_case() -
10652 1][f_fl[5]][f_ro[5]])};
10654 new_hexes[0]->set_bounding_object_indices(
10661 new_hexes[1]->set_bounding_object_indices(
10668 new_hexes[2]->set_bounding_object_indices(
10674 quad_indices[18]});
10675 new_hexes[3]->set_bounding_object_indices(
10681 quad_indices[19]});
10713 ++next_unused_vertex;
10717 "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."));
10728 hex->center(
true,
true);
10750 middle_vertex_index<dim, spacedim>(hex->face(0)),
10751 middle_vertex_index<dim, spacedim>(hex->face(1)),
10752 middle_vertex_index<dim, spacedim>(hex->face(2)),
10753 middle_vertex_index<dim, spacedim>(hex->face(3)),
10754 middle_vertex_index<dim, spacedim>(hex->face(4)),
10755 middle_vertex_index<dim, spacedim>(hex->face(5)),
10756 next_unused_vertex};
10758 new_lines[0]->set_bounding_object_indices(
10760 new_lines[1]->set_bounding_object_indices(
10762 new_lines[2]->set_bounding_object_indices(
10764 new_lines[3]->set_bounding_object_indices(
10766 new_lines[4]->set_bounding_object_indices(
10768 new_lines[5]->set_bounding_object_indices(
10838 spacedim>::raw_line_iterator lines[30] = {
10842 0, f_or[0], f_fl[0], f_ro[0]))
10845 1, f_or[0], f_fl[0], f_ro[0])),
10849 3, f_or[0], f_fl[0], f_ro[0]))
10852 0, f_or[0], f_fl[0], f_ro[0])),
10856 0, f_or[0], f_fl[0], f_ro[0]))
10859 3, f_or[0], f_fl[0], f_ro[0])),
10863 3, f_or[0], f_fl[0], f_ro[0]))
10866 2, f_or[0], f_fl[0], f_ro[0])),
10871 0, f_or[1], f_fl[1], f_ro[1]))
10874 1, f_or[1], f_fl[1], f_ro[1])),
10878 3, f_or[1], f_fl[1], f_ro[1]))
10881 0, f_or[1], f_fl[1], f_ro[1])),
10885 0, f_or[1], f_fl[1], f_ro[1]))
10888 3, f_or[1], f_fl[1], f_ro[1])),
10892 3, f_or[1], f_fl[1], f_ro[1]))
10895 2, f_or[1], f_fl[1], f_ro[1])),
10900 0, f_or[2], f_fl[2], f_ro[2]))
10903 1, f_or[2], f_fl[2], f_ro[2])),
10907 3, f_or[2], f_fl[2], f_ro[2]))
10910 0, f_or[2], f_fl[2], f_ro[2])),
10914 0, f_or[2], f_fl[2], f_ro[2]))
10917 3, f_or[2], f_fl[2], f_ro[2])),
10921 3, f_or[2], f_fl[2], f_ro[2]))
10924 2, f_or[2], f_fl[2], f_ro[2])),
10929 0, f_or[3], f_fl[3], f_ro[3]))
10932 1, f_or[3], f_fl[3], f_ro[3])),
10936 3, f_or[3], f_fl[3], f_ro[3]))
10939 0, f_or[3], f_fl[3], f_ro[3])),
10943 0, f_or[3], f_fl[3], f_ro[3]))
10946 3, f_or[3], f_fl[3], f_ro[3])),
10950 3, f_or[3], f_fl[3], f_ro[3]))
10953 2, f_or[3], f_fl[3], f_ro[3])),
10958 0, f_or[4], f_fl[4], f_ro[4]))
10961 1, f_or[4], f_fl[4], f_ro[4])),
10965 3, f_or[4], f_fl[4], f_ro[4]))
10968 0, f_or[4], f_fl[4], f_ro[4])),
10972 0, f_or[4], f_fl[4], f_ro[4]))
10975 3, f_or[4], f_fl[4], f_ro[4])),
10979 3, f_or[4], f_fl[4], f_ro[4]))
10982 2, f_or[4], f_fl[4], f_ro[4])),
10987 0, f_or[5], f_fl[5], f_ro[5]))
10990 1, f_or[5], f_fl[5], f_ro[5])),
10994 3, f_or[5], f_fl[5], f_ro[5]))
10997 0, f_or[5], f_fl[5], f_ro[5])),
11001 0, f_or[5], f_fl[5], f_ro[5]))
11004 3, f_or[5], f_fl[5], f_ro[5])),
11008 3, f_or[5], f_fl[5], f_ro[5]))
11011 2, f_or[5], f_fl[5], f_ro[5])),
11021 unsigned int line_indices[30];
11022 for (
unsigned int i = 0; i < 30; ++i)
11023 line_indices[i] = lines[i]->
index();
11038 for (
unsigned int i = 0; i < 24; ++i)
11039 if (lines[i]->vertex_index((i + 1) % 2) ==
11041 line_orientation[i] =
11047 Assert(lines[i]->vertex_index(i % 2) ==
11050 line_orientation[i] =
11056 for (
unsigned int i = 24; i < 30; ++i)
11057 line_orientation[i] =
11090 new_quads[0]->set_bounding_object_indices(
11094 line_indices[24]});
11095 new_quads[1]->set_bounding_object_indices(
11099 line_indices[25]});
11100 new_quads[2]->set_bounding_object_indices(
11104 line_indices[20]});
11105 new_quads[3]->set_bounding_object_indices(
11109 line_indices[21]});
11110 new_quads[4]->set_bounding_object_indices(
11114 line_indices[28]});
11115 new_quads[5]->set_bounding_object_indices(
11119 line_indices[29]});
11120 new_quads[6]->set_bounding_object_indices(
11125 new_quads[7]->set_bounding_object_indices(
11130 new_quads[8]->set_bounding_object_indices(
11134 line_indices[26]});
11135 new_quads[9]->set_bounding_object_indices(
11139 line_indices[27]});
11140 new_quads[10]->set_bounding_object_indices(
11144 line_indices[12]});
11145 new_quads[11]->set_bounding_object_indices(
11149 line_indices[13]});
11154 new_quads[0]->set_line_orientation(
11155 0, line_orientation[10]);
11156 new_quads[0]->set_line_orientation(
11157 2, line_orientation[16]);
11159 new_quads[1]->set_line_orientation(
11160 1, line_orientation[14]);
11161 new_quads[1]->set_line_orientation(
11162 2, line_orientation[17]);
11164 new_quads[2]->set_line_orientation(
11165 0, line_orientation[11]);
11166 new_quads[2]->set_line_orientation(
11167 3, line_orientation[20]);
11169 new_quads[3]->set_line_orientation(
11170 1, line_orientation[15]);
11171 new_quads[3]->set_line_orientation(
11172 3, line_orientation[21]);
11174 new_quads[4]->set_line_orientation(
11175 0, line_orientation[18]);
11176 new_quads[4]->set_line_orientation(
11177 2, line_orientation[0]);
11179 new_quads[5]->set_line_orientation(
11180 1, line_orientation[22]);
11181 new_quads[5]->set_line_orientation(
11182 2, line_orientation[1]);
11184 new_quads[6]->set_line_orientation(
11185 0, line_orientation[19]);
11186 new_quads[6]->set_line_orientation(
11187 3, line_orientation[4]);
11189 new_quads[7]->set_line_orientation(
11190 1, line_orientation[23]);
11191 new_quads[7]->set_line_orientation(
11192 3, line_orientation[5]);
11194 new_quads[8]->set_line_orientation(
11195 0, line_orientation[2]);
11196 new_quads[8]->set_line_orientation(
11197 2, line_orientation[8]);
11199 new_quads[9]->set_line_orientation(
11200 1, line_orientation[6]);
11201 new_quads[9]->set_line_orientation(
11202 2, line_orientation[9]);
11204 new_quads[10]->set_line_orientation(
11205 0, line_orientation[3]);
11206 new_quads[10]->set_line_orientation(
11207 3, line_orientation[12]);
11209 new_quads[11]->set_line_orientation(
11210 1, line_orientation[7]);
11211 new_quads[11]->set_line_orientation(
11212 3, line_orientation[13]);
11253 const int quad_indices[36] = {
11254 new_quads[0]->index(),
11255 new_quads[1]->index(),
11256 new_quads[2]->index(),
11257 new_quads[3]->index(),
11258 new_quads[4]->index(),
11259 new_quads[5]->index(),
11260 new_quads[6]->index(),
11261 new_quads[7]->index(),
11262 new_quads[8]->index(),
11263 new_quads[9]->index(),
11264 new_quads[10]->index(),
11265 new_quads[11]->index(),
11267 hex->face(0)->isotropic_child_index(
11269 0, f_or[0], f_fl[0], f_ro[0])),
11270 hex->face(0)->isotropic_child_index(
11272 1, f_or[0], f_fl[0], f_ro[0])),
11273 hex->face(0)->isotropic_child_index(
11275 2, f_or[0], f_fl[0], f_ro[0])),
11276 hex->face(0)->isotropic_child_index(
11278 3, f_or[0], f_fl[0], f_ro[0])),
11280 hex->face(1)->isotropic_child_index(
11282 0, f_or[1], f_fl[1], f_ro[1])),
11283 hex->face(1)->isotropic_child_index(
11285 1, f_or[1], f_fl[1], f_ro[1])),
11286 hex->face(1)->isotropic_child_index(
11288 2, f_or[1], f_fl[1], f_ro[1])),
11289 hex->face(1)->isotropic_child_index(
11291 3, f_or[1], f_fl[1], f_ro[1])),
11293 hex->face(2)->isotropic_child_index(
11295 0, f_or[2], f_fl[2], f_ro[2])),
11296 hex->face(2)->isotropic_child_index(
11298 1, f_or[2], f_fl[2], f_ro[2])),
11299 hex->face(2)->isotropic_child_index(
11301 2, f_or[2], f_fl[2], f_ro[2])),
11302 hex->face(2)->isotropic_child_index(
11304 3, f_or[2], f_fl[2], f_ro[2])),
11306 hex->face(3)->isotropic_child_index(
11308 0, f_or[3], f_fl[3], f_ro[3])),
11309 hex->face(3)->isotropic_child_index(
11311 1, f_or[3], f_fl[3], f_ro[3])),
11312 hex->face(3)->isotropic_child_index(
11314 2, f_or[3], f_fl[3], f_ro[3])),
11315 hex->face(3)->isotropic_child_index(
11317 3, f_or[3], f_fl[3], f_ro[3])),
11319 hex->face(4)->isotropic_child_index(
11321 0, f_or[4], f_fl[4], f_ro[4])),
11322 hex->face(4)->isotropic_child_index(
11324 1, f_or[4], f_fl[4], f_ro[4])),
11325 hex->face(4)->isotropic_child_index(
11327 2, f_or[4], f_fl[4], f_ro[4])),
11328 hex->face(4)->isotropic_child_index(
11330 3, f_or[4], f_fl[4], f_ro[4])),
11332 hex->face(5)->isotropic_child_index(
11334 0, f_or[5], f_fl[5], f_ro[5])),
11335 hex->face(5)->isotropic_child_index(
11337 1, f_or[5], f_fl[5], f_ro[5])),
11338 hex->face(5)->isotropic_child_index(
11340 2, f_or[5], f_fl[5], f_ro[5])),
11341 hex->face(5)->isotropic_child_index(
11343 3, f_or[5], f_fl[5], f_ro[5]))};
11346 new_hexes[0]->set_bounding_object_indices(
11353 new_hexes[1]->set_bounding_object_indices(
11360 new_hexes[2]->set_bounding_object_indices(
11366 quad_indices[10]});
11367 new_hexes[3]->set_bounding_object_indices(
11373 quad_indices[11]});
11376 new_hexes[4]->set_bounding_object_indices(
11382 quad_indices[32]});
11383 new_hexes[5]->set_bounding_object_indices(
11389 quad_indices[33]});
11390 new_hexes[6]->set_bounding_object_indices(
11396 quad_indices[34]});
11397 new_hexes[7]->set_bounding_object_indices(
11403 quad_indices[35]});
11437 for (
unsigned int s = 0;
11444 const unsigned int current_child =
11453 ref_case, f, f_or[f], f_fl[f], f_ro[f]));
11454 new_hexes[current_child]->set_combined_face_orientation(
11460 if (check_for_distorted_cells &&
11461 has_distorted_children<dim, spacedim>(hex))
11481 return cells_with_distorted_children;