6391 const bool check_for_distorted_cells)
6393 constexpr int dim = 3;
6395 using raw_line_iterator =
6397 using raw_quad_iterator =
6409 triangulation.
levels.size() - 1))
6410 if (cell->refine_flag_set())
6415 triangulation.
levels.push_back(
6418 triangulation.
strides.max_children_per_cell,
6419 triangulation.
strides.max_faces_per_cell,
6420 triangulation.
strides.max_vertices_per_cell));
6426 triangulation.
faces->quads.clear_user_data();
6427 triangulation.
faces->lines.clear_user_flags();
6428 triangulation.
faces->quads.clear_user_flags();
6443 unsigned int needed_vertices = 0;
6444 unsigned int needed_lines_single = 0;
6445 unsigned int needed_faces_single = 0;
6446 unsigned int needed_lines_pair = 0;
6447 unsigned int needed_faces_pair = 0;
6448 for (
int level_no = triangulation.
levels.size() - 2; level_no >= 0;
6451 std::size_t needed_cells = 0;
6453 for (
const auto &cell :
6455 if (cell->refine_flag_set())
6458 Assert(cell->refine_flag_set() ==
6463 const auto cell_reference_cell = cell->reference_cell();
6467 needed_cells += cell_reference_cell.n_isotropic_children();
6469 switch (cell_reference_cell)
6472 needed_lines_single += 1;
6473 needed_faces_single += 8;
6481 needed_lines_single += 4;
6482 needed_faces_single += 13;
6495 needed_lines_single += 3;
6496 needed_faces_single += 10;
6502 needed_lines_single += 6;
6503 needed_faces_single += 12;
6516 for (
const auto face : cell->face_indices())
6517 if (cell->face(face)->n_children() == 0)
6518 cell->face(face)->set_user_flag();
6521 Assert(cell->face(face)->n_children() ==
6522 cell_reference_cell.face_reference_cell(face)
6523 .n_isotropic_children(),
6527 for (
const auto line : cell->line_indices())
6528 if (cell->line(line)->has_children() ==
false)
6529 cell->line(line)->set_user_flag();
6531 Assert(cell->line(line)->n_children() == 2,
6535 auto &next_level = *triangulation.
levels[level_no + 1];
6536 const auto used_cells = std::count(next_level.cells.used.begin(),
6537 next_level.cells.used.end(),
6539 if (used_cells + needed_cells > next_level.size())
6540 next_level.allocate_end(
6541 (used_cells + needed_cells) - next_level.size(),
6551 next_level.cells.allocate_end(needed_cells, 0);
6561 if (quad->user_flag_set() ==
false)
6566 needed_faces_pair += 4;
6567 needed_lines_pair += 4;
6568 needed_vertices += 1;
6572 needed_faces_pair += 4;
6573 needed_lines_single += 3;
6586 if (line->user_flag_set() ==
false)
6589 needed_lines_pair += 2;
6590 needed_vertices += 1;
6593 triangulation.
faces->allocate_end(needed_faces_pair,
6594 needed_faces_single);
6595 triangulation.
faces->lines.allocate_end(needed_lines_pair,
6596 needed_lines_single);
6599 needed_vertices += std::count(triangulation.
vertices_used.begin(),
6603 if (needed_vertices > triangulation.
vertices.size())
6623 if (!cell->refine_flag_set())
6624 for (
unsigned int line_n = 0; line_n < cell->n_lines();
6626 if (cell->line(line_n)->has_children())
6627 for (
unsigned int c = 0; c < 2; ++c)
6628 Assert(cell->line(line_n)->child(c)->user_flag_set() ==
6633 unsigned int current_vertex = 0;
6637 auto get_next_unused_vertex = [](
const unsigned int current_vertex,
6638 std::vector<bool> &vertices_used) {
6639 unsigned int next_vertex = current_vertex;
6640 while (next_vertex < vertices_used.size() &&
6641 vertices_used[next_vertex] ==
true)
6644 vertices_used[next_vertex] =
true;
6654 raw_line_iterator next_unused_line = triangulation.
begin_raw_line();
6656 for (; line != endl; ++line)
6658 if (line->user_flag_set() ==
false)
6662 triangulation.
faces->lines.template next_free_pair_object<1>(
6670 line->set_children(0, next_unused_line->index());
6672 const std::array<raw_line_iterator, 2> children{
6673 {next_unused_line, ++next_unused_line}};
6679 get_next_unused_vertex(current_vertex,
6681 triangulation.
vertices[current_vertex] = line->center(
true);
6683 children[0]->set_bounding_object_indices(
6684 {line->vertex_index(0), current_vertex});
6685 children[1]->set_bounding_object_indices(
6686 {current_vertex, line->vertex_index(1)});
6688 const auto manifold_id = line->manifold_id();
6689 const auto boundary_id = line->boundary_id();
6690 for (
const auto &child : children)
6692 child->set_used_flag();
6693 child->clear_children();
6695 child->clear_user_flag();
6696 child->set_boundary_id_internal(boundary_id);
6697 child->set_manifold_id(manifold_id);
6700 line->clear_user_flag();
6710 for (; face != endf; ++face)
6712 if (face->user_flag_set() ==
false)
6715 const auto reference_face_type = face->reference_cell();
6716 const auto n_lines_per_face = reference_face_type.n_lines();
6720 std::array<raw_line_iterator, 4> new_lines;
6721 switch (reference_face_type)
6724 for (
unsigned int l = 0; l < 3; ++l)
6726 triangulation.
faces->lines
6727 .template next_free_single_object<1>(triangulation);
6731 for (
unsigned int l = 0; l < 2; ++l)
6733 auto next_unused_line =
6734 triangulation.
faces->lines
6735 .template next_free_pair_object<1>(triangulation);
6736 new_lines[2 * l] = next_unused_line;
6737 new_lines[2 * l + 1] = ++next_unused_line;
6747 for (
const unsigned int line : face->line_indices())
6756 std::array<raw_quad_iterator, 4> new_faces;
6757 for (
unsigned int f = 0; f < 2; ++f)
6759 auto next_unused_quad =
6760 triangulation.
faces->quads
6761 .template next_free_pair_object<2>(triangulation);
6763 new_faces[2 * f] = next_unused_quad;
6764 new_faces[2 * f + 1] = ++next_unused_quad;
6766 face->set_children(2 * f, new_faces[2 * f]->
index());
6773 for (
const auto &quad : new_faces)
6788 for (
const auto i : face->vertex_indices())
6791 for (
unsigned int l = 0; l < n_lines_per_face; ++l)
6797 get_next_unused_vertex(current_vertex,
6801 triangulation.
vertices[current_vertex] =
6802 face->center(
true,
true);
6808 std::array<raw_line_iterator, 12> lines;
6809 unsigned int n_lines = 0;
6810 for (
unsigned int l = 0; l < n_lines_per_face; ++l)
6811 for (
unsigned int c = 0; c < 2; ++c)
6812 lines[n_lines++] = face->line(l)->child(
6813 child_line_index(c, face->line_orientation(l)));
6815 for (
unsigned int l = 0; l < n_lines_per_face; ++l)
6816 lines[n_lines++] = new_lines[l];
6818 std::array<int, 12> line_indices;
6819 for (
unsigned int i = 0; i < n_lines; ++i)
6820 line_indices[i] = lines[i]->
index();
6827 constexpr ::ndarray<unsigned int, 12, 2> line_vertices_quad{
6841 constexpr ::ndarray<unsigned int, 4, 4> quad_lines_quad{
6856 constexpr ::ndarray<unsigned int, 12, 2> line_vertices_tri{
6870 constexpr ::ndarray<unsigned int, 4, 4> tri_lines_tri{
6880 constexpr ::ndarray<unsigned int, 4, 4, 2>
6881 tri_line_vertices_tri{
6882 {{{{{0, 3}}, {{3, 5}}, {{5, 0}}, {{X, X}}}},
6883 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
6884 {{{{5, 4}}, {{4, 2}}, {{2, 5}}, {{X, X}}}},
6885 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}}}};
6888 const auto &line_vertices =
6890 line_vertices_quad :
6892 const auto &face_lines =
6900 for (
unsigned int i = 0, j = 2 * n_lines_per_face;
6901 i < n_lines_per_face;
6904 auto &new_line = new_lines[i];
6905 new_line->set_bounding_object_indices(
6908 new_line->set_used_flag();
6909 new_line->clear_user_flag();
6910 new_line->clear_user_data();
6911 new_line->clear_children();
6912 new_line->set_boundary_id_internal(face->boundary_id());
6913 new_line->set_manifold_id(face->manifold_id());
6917 for (
unsigned int i = 0; i < new_faces.size(); ++i)
6920 auto &new_face = new_faces[i];
6924 triangulation.
faces->set_quad_type(new_face->index(),
6925 reference_face_type);
6927 switch (reference_face_type)
6930 new_face->set_bounding_object_indices(
6931 {line_indices[face_lines[i][0]],
6932 line_indices[face_lines[i][1]],
6933 line_indices[face_lines[i][2]]});
6937 new_face->set_bounding_object_indices(
6938 {line_indices[face_lines[i][0]],
6939 line_indices[face_lines[i][1]],
6940 line_indices[face_lines[i][2]],
6941 line_indices[face_lines[i][3]]});
6948 new_face->set_used_flag();
6949 new_face->clear_user_flag();
6950 new_face->clear_user_data();
6951 new_face->clear_children();
6952 new_face->set_boundary_id_internal(face->boundary_id());
6953 new_face->set_manifold_id(face->manifold_id());
6955 [[maybe_unused]] std::set<unsigned int> s;
6963 for (
const auto f : new_face->line_indices())
6965 const std::array<unsigned int, 2> vertices_0 = {
6966 {lines[face_lines[i][f]]->vertex_index(0),
6967 lines[face_lines[i][f]]->vertex_index(1)}};
6969 const std::array<unsigned int, 2> vertices_1 = {
6973 const auto orientation =
6981 for (
const auto i : vertices_0)
6983 for (
const auto i : vertices_1)
6987 new_face->set_line_orientation(f, orientation);
7001 constexpr ::ndarray<unsigned int, 4, 2>
7002 quad_child_line_vertices{{{{0, 2}},
7007 for (
unsigned int i = 0; i < 4; ++i)
7008 for (
unsigned int j = 0; j < 2; ++j)
7009 new_faces[quad_child_line_vertices[i][j]]
7010 ->set_line_orientation(i, face->line_orientation(i));
7013 face->clear_user_flag();
7019 cells_with_distorted_children;
7029 cell->level() >=
static_cast<int>(
level),
7033 for (; cell != triangulation.
end() &&
7034 cell->level() ==
static_cast<int>(
level);
7037 if (cell->refine_flag_set() ==
7044 cell->clear_refine_flag();
7045 cell->set_refinement_case(ref_case);
7047 const auto cell_reference_cell = cell->reference_cell();
7049 unsigned int n_new_lines = 0;
7050 unsigned int n_new_faces = 0;
7051 const unsigned int n_new_cells =
7052 cell_reference_cell.n_isotropic_children();
7056 switch (cell_reference_cell)
7084 constexpr unsigned int max_n_new_lines = 6;
7085 constexpr unsigned int max_n_new_faces = 13;
7086 constexpr unsigned int max_n_new_children = 10;
7087 constexpr unsigned int max_relevant_vertices = 27;
7088 constexpr unsigned int max_relevant_lines = 30;
7089 constexpr unsigned int max_face_indices = 36;
7091 std::array<raw_line_iterator, max_n_new_lines> new_lines;
7092 for (
unsigned int i = 0; i < n_new_lines; ++i)
7095 triangulation.
faces->lines
7096 .template next_free_single_object<1>(triangulation);
7099 new_lines[i]->set_used_flag();
7100 new_lines[i]->clear_user_flag();
7101 new_lines[i]->clear_user_data();
7102 new_lines[i]->clear_children();
7103 new_lines[i]->set_boundary_id_internal(
7105 new_lines[i]->set_manifold_id(cell->manifold_id());
7108 std::array<raw_quad_iterator, max_n_new_faces> new_faces;
7109 for (
unsigned int i = 0; i < n_new_faces; ++i)
7112 triangulation.
faces->quads
7113 .template next_free_single_object<2>(triangulation);
7115 auto &new_face = new_faces[i];
7118 new_face->set_used_flag();
7119 new_face->clear_user_flag();
7120 new_face->clear_user_data();
7121 new_face->clear_children();
7122 new_face->set_boundary_id_internal(
7124 new_face->set_manifold_id(cell->manifold_id());
7129 for (
unsigned int j = 0;
7130 j < triangulation.
faces->lines_per_quad;
7132 new_face->set_line_orientation(
7185 std::array<unsigned int, max_relevant_vertices>
7194 const unsigned int n_vertices =
7198 for (
unsigned int i = 0; i < n_vertices; ++i)
7205 const unsigned int n_lines =
std::min(cell->n_lines(), 12u);
7207 const std::array<unsigned int, 12> line_indices =
7208 TriaAccessorImplementation::Implementation::
7209 get_line_indices_of_cell(*cell);
7211 for (
unsigned int l = 0; l < n_lines; ++l)
7213 raw_line_iterator line(&triangulation,
7221 for (
auto quad_face_index :
7222 cell_reference_cell.face_indices_by_type(
7235 get_next_unused_vertex(current_vertex,
7239 triangulation.
vertices[current_vertex] =
7240 cell->center(
true,
true);
7245 unsigned int chosen_line_tetrahedron = 0;
7248 switch (cell_reference_cell)
7256 constexpr ::ndarray<unsigned int, 3, 2>
7257 new_line_vertices = {{{{6, 8}},
7263 std::uint8_t refinement_choice =
7264 cell->refine_choice();
7265 if (refinement_choice ==
7269 const auto &vertices =
7271 double min_distance =
7272 std::numeric_limits<double>::infinity();
7273 for (
unsigned int i = 0;
7274 i < new_line_vertices.size();
7277 const double current_distance =
7279 [new_line_vertices[i][0]]]
7282 [new_line_vertices[i][1]]]);
7283 if (current_distance < min_distance)
7285 chosen_line_tetrahedron = i;
7286 min_distance = current_distance;
7290 else if (refinement_choice ==
7293 chosen_line_tetrahedron = 0;
7294 else if (refinement_choice ==
7297 chosen_line_tetrahedron = 1;
7298 else if (refinement_choice ==
7301 chosen_line_tetrahedron = 2;
7305 cell->set_refinement_case(
7308 new_lines[0]->set_bounding_object_indices(
7310 [new_line_vertices[chosen_line_tetrahedron][0]],
7312 [chosen_line_tetrahedron][1]]});
7321 static constexpr ::ndarray<unsigned int, 4, 2>
7322 new_line_vertices = {{{{13, 9}},
7327 for (
unsigned int i = 0; i < n_new_lines; ++i)
7328 new_lines[i]->set_bounding_object_indices(
7338 constexpr ::ndarray<unsigned int, 3, 2>
7339 new_line_vertices = {{{{15, 16}},
7343 for (
unsigned int i = 0; i < n_new_lines; ++i)
7344 new_lines[i]->set_bounding_object_indices(
7352 constexpr ::ndarray<unsigned int, 6, 2>
7353 new_line_vertices = {{{{22, 26}},
7359 for (
unsigned int i = 0; i < n_new_lines; ++i)
7360 new_lines[i]->set_bounding_object_indices(
7373 auto standard_to_real_quad_child_index =
7374 [](
const unsigned int child,
7385 switch (face_ref_cell_type)
7443 std::array<raw_line_iterator, max_relevant_lines>
7445 std::array<int, max_relevant_lines> relevant_line_indices;
7446 unsigned int relevant_lines_counter = 0;
7448 for (
auto f : cell_reference_cell.face_indices_by_type(
7468 constexpr ::ndarray<unsigned int, 4, 2>
7469 quad_relevant_children_and_lines = {{{{0, 1}},
7473 for (
unsigned int l = 0; l < 4;
7474 ++l, ++relevant_lines_counter)
7478 const unsigned int relevant_child =
7479 standard_to_real_quad_child_index(
7480 quad_relevant_children_and_lines[l][0],
7481 cell->combined_face_orientation(f),
7487 const unsigned int relevant_child_line =
7489 .standard_to_real_face_line(
7490 quad_relevant_children_and_lines[l][1],
7493 cell->combined_face_orientation(f));
7497 relevant_lines[relevant_lines_counter] =
7499 ->isotropic_child(relevant_child)
7500 ->line(relevant_child_line);
7505 for (
auto f : cell_reference_cell.face_indices_by_type(
7508 for (
unsigned int l = 0; l < 3;
7509 ++l, ++relevant_lines_counter)
7514 const std::array<std::array<unsigned int, 3>, 6>
7525 tri_line_perm = {{{{0, 1, 2}},
7532 const auto combined_orientation =
7533 cell->combined_face_orientation(f);
7534 relevant_lines[relevant_lines_counter] =
7537 ->line(tri_line_perm[combined_orientation][l]);
7542 for (
unsigned int i = 0; i < n_new_lines;
7543 ++i, ++relevant_lines_counter)
7544 relevant_lines[relevant_lines_counter] = new_lines[i];
7548 for (
unsigned int i = 0; i < relevant_lines_counter; ++i)
7549 relevant_line_indices[i] = relevant_lines[i]->
index();
7558 const auto &new_face_lines =
7559 cell_reference_cell.new_isotropic_child_face_lines(
7560 chosen_line_tetrahedron);
7568 const auto &new_face_lines_vert =
7570 .new_isotropic_child_face_line_vertices(
7571 chosen_line_tetrahedron);
7577 constexpr ::ndarray<unsigned int, 4, 2>
7578 representative_lines{{{{0, 2}},
7583 for (
unsigned int q = 0; q < n_new_faces; ++q)
7585 auto &new_face = new_faces[q];
7587 if (new_face_lines[q][3] == X)
7591 triangulation.
faces->set_quad_type(
7594 new_face->set_bounding_object_indices(
7595 {relevant_line_indices[new_face_lines[q][0]],
7596 relevant_line_indices[new_face_lines[q][1]],
7597 relevant_line_indices[new_face_lines[q][2]]});
7601 triangulation.
faces->set_quad_type(
7604 new_face->set_bounding_object_indices(
7605 {relevant_line_indices[new_face_lines[q][0]],
7606 relevant_line_indices[new_face_lines[q][1]],
7607 relevant_line_indices[new_face_lines[q][2]],
7608 relevant_line_indices[new_face_lines[q][3]]});
7615 const unsigned int n_compute_lines =
7618 new_face->n_lines();
7619 for (
unsigned int line = 0; line < n_compute_lines;
7622 const unsigned int l =
7623 (cell_reference_cell ==
7625 representative_lines[q % 4][0] :
7628 const std::array<unsigned int, 2> vertices_0 = {
7629 {relevant_lines[new_face_lines[q][l]]
7631 relevant_lines[new_face_lines[q][l]]
7632 ->vertex_index(1)}};
7634 const std::array<unsigned int, 2> vertices_1 = {
7638 const auto orientation =
7643 new_face->set_line_orientation(l, orientation);
7648 if (cell_reference_cell ==
7650 new_faces[representative_lines[q % 4][1] + q -
7652 ->set_line_orientation(l, orientation);
7674 std::array<int, max_face_indices> face_indices;
7676 unsigned int face_indices_counter = 0;
7679 for (; face_indices_counter < n_new_faces;
7680 ++face_indices_counter)
7681 face_indices[face_indices_counter] =
7682 new_faces[face_indices_counter]->
index();
7685 for (
auto f_q : cell_reference_cell.face_indices_by_type(
7688 for (
unsigned int c = 0; c < 4;
7689 ++c, ++face_indices_counter)
7691 const auto combined_orientation =
7692 cell->combined_face_orientation(f_q);
7695 face_indices[face_indices_counter] =
7696 cell->face(f_q)->isotropic_child_index(
7697 standard_to_real_quad_child_index(
7699 combined_orientation,
7705 for (
auto f_t : cell_reference_cell.face_indices_by_type(
7708 for (
unsigned int c = 0; c < 4;
7709 ++c, ++face_indices_counter)
7711 const auto combined_orientation =
7712 cell->combined_face_orientation(f_t);
7715 face_indices[face_indices_counter] =
7716 cell->face(f_t)->child_index(
7717 standard_to_real_quad_child_index(
7719 combined_orientation,
7728 const auto cell_faces =
7729 cell_reference_cell.new_isotropic_child_cell_faces(
7730 chosen_line_tetrahedron);
7736 const auto new_cells_vertices =
7737 cell_reference_cell.new_isotropic_child_cell_vertices(
7738 chosen_line_tetrahedron);
7743 const ::types::subdomain_id cell_subdomain_id =
7744 cell->subdomain_id();
7751 for (
unsigned int c = 0; c < n_new_cells; ++c)
7759 ->cells.next_free_hex(triangulation,
level + 1);
7763 new_cells[c] = next_unused_cell;
7765 auto &new_cell = new_cells[c];
7770 new_cell->set_used_flag();
7771 new_cell->clear_user_flag();
7772 new_cell->clear_user_data();
7773 new_cell->clear_children();
7774 new_cell->set_material_id(cell->material_id());
7775 new_cell->set_manifold_id(cell->manifold_id());
7776 new_cell->set_subdomain_id(cell_subdomain_id);
7782 new_cell->set_parent(cell->index());
7783 cell->set_children(c, new_cell->index());
7796 triangulation.
levels[new_cell->level()]
7797 ->reference_cell[new_cell->index()] =
7798 child_reference_cell;
7804 switch (child_reference_cell)
7807 new_cell->set_bounding_object_indices(
7808 {face_indices[cell_faces[c][0]],
7809 face_indices[cell_faces[c][1]],
7810 face_indices[cell_faces[c][2]],
7811 face_indices[cell_faces[c][3]]});
7817 new_cell->set_bounding_object_indices(
7818 {face_indices[cell_faces[c][0]],
7819 face_indices[cell_faces[c][1]],
7820 face_indices[cell_faces[c][2]],
7821 face_indices[cell_faces[c][3]],
7822 face_indices[cell_faces[c][4]]});
7826 new_cell->set_bounding_object_indices(
7827 {face_indices[cell_faces[c][0]],
7828 face_indices[cell_faces[c][1]],
7829 face_indices[cell_faces[c][2]],
7830 face_indices[cell_faces[c][3]],
7831 face_indices[cell_faces[c][4]],
7832 face_indices[cell_faces[c][5]]});
7851 for (
const auto f : new_cell->face_indices())
7852 new_cell->set_combined_face_orientation(
7857 for (
const auto f : new_cell->face_indices())
7859 const auto &face = new_cell->face(f);
7862 auto new_cell_vertices = new_cells_vertices[c];
7865 std::array<unsigned int, 4> vertices_0,
7870 for (
unsigned int face_vertex_no :
7871 face->vertex_indices())
7876 const auto cell_vertex_no =
7877 child_reference_cell
7882 default_geometric_orientation);
7896 [new_cell_vertices[cell_vertex_no]];
7900 for (
const auto i : face->vertex_indices())
7901 vertices_1[i] = face->vertex_index(i);
7906 new_cell->set_combined_face_orientation(
7908 face->reference_cell()
7909 .get_combined_orientation(
7911 vertices_0.cbegin() +
7912 face->n_vertices()),
7914 vertices_1.cbegin() +
7915 face->n_vertices())));
7924 constexpr ::ndarray<unsigned int, 6, 4>
7925 face_to_child_indices_hex{{{{0, 2, 4, 6}},
7932 for (
const auto f : cell->face_indices())
7934 const auto combined_orientation =
7935 cell->combined_face_orientation(f);
7936 for (
unsigned int c = 0; c < 4; ++c)
7937 new_cells[face_to_child_indices_hex[f][c]]
7938 ->set_combined_face_orientation(
7939 f, combined_orientation);
7945 if (check_for_distorted_cells &&
7946 has_distorted_children<dim, spacedim>(cell))
7953 triangulation.
faces->quads.clear_user_data();
7955 return cells_with_distorted_children;
7965 const bool check_for_distorted_cells)
7967 const unsigned int dim = 3;
7970 bool flag_isotropic_mesh =
true;
7972 cell = triangulation.
begin(),
7973 endc = triangulation.
end();
7974 for (; cell != endc; ++cell)
7984 flag_isotropic_mesh =
false;
7988 if (flag_isotropic_mesh)
7989 return execute_refinement_isotropic(triangulation,
7990 check_for_distorted_cells);
8002 triangulation.
levels.size() - 1))
8003 if (cell->refine_flag_set())
8008 triangulation.
levels.push_back(
8011 triangulation.
strides.max_children_per_cell,
8012 triangulation.
strides.max_faces_per_cell,
8013 triangulation.
strides.max_vertices_per_cell));
8020 triangulation.
faces->quads.clear_user_data();
8026 line->clear_user_flag();
8031 quad->clear_user_flag();
8054 unsigned int needed_vertices = 0;
8055 unsigned int needed_lines_single = 0;
8056 unsigned int needed_quads_single = 0;
8057 unsigned int needed_lines_pair = 0;
8058 unsigned int needed_quads_pair = 0;
8059 for (
int level_no = triangulation.
levels.size() - 2; level_no >= 0;
8064 std::size_t needed_cells = 0;
8066 for (
const auto &acell :
8068 if (acell->refine_flag_set())
8078 ++needed_quads_single;
8086 ++needed_lines_single;
8087 needed_quads_single += 4;
8094 needed_lines_single += 6;
8095 needed_quads_single += 12;
8109 for (
const unsigned int face :
8113 aface = acell->face(face);
8120 acell->face_orientation(face),
8121 acell->face_flip(face),
8122 acell->face_rotation(face));
8127 if (face_ref_case ==
8130 if (aface->n_active_descendants() < 4)
8133 aface->set_user_flag();
8135 else if (aface->refinement_case() != face_ref_case)
8146 Assert(aface->refinement_case() ==
8149 aface->refinement_case() ==
8152 aface->set_user_index(face_ref_case);
8158 for (
unsigned int line = 0;
8159 line < GeometryInfo<dim>::lines_per_cell;
8163 !acell->line(line)->has_children())
8164 acell->line(line)->set_user_flag();
8169 auto &next_level = *triangulation.
levels[level_no + 1];
8170 const auto used_cells = std::count(next_level.cells.used.begin(),
8171 next_level.cells.used.end(),
8173 if (used_cells + needed_cells > next_level.size())
8174 next_level.allocate_end(
8175 (used_cells + needed_cells) - next_level.size(),
8185 next_level.cells.allocate_end(needed_cells, 0);
8194 if (quad->user_flag_set())
8200 needed_quads_pair += 4;
8201 needed_lines_pair += 4;
8202 needed_vertices += 1;
8204 if (quad->user_index())
8208 needed_quads_pair += 2;
8209 needed_lines_single += 1;
8222 if (quad->has_children())
8224 Assert(quad->refinement_case() ==
8227 if ((face_refinement_cases[quad->user_index()] ==
8229 (quad->child(0)->line_index(1) + 1 !=
8230 quad->child(2)->line_index(1))) ||
8231 (face_refinement_cases[quad->user_index()] ==
8233 (quad->child(0)->line_index(3) + 1 !=
8234 quad->child(1)->line_index(3))))
8235 needed_lines_pair += 2;
8244 if (line->user_flag_set())
8246 needed_lines_pair += 2;
8247 needed_vertices += 1;
8251 triangulation.
faces->lines.allocate_end(needed_lines_pair,
8252 needed_lines_single);
8255 triangulation.
faces->allocate_end(needed_quads_pair,
8256 needed_quads_single);
8259 needed_vertices += std::count(triangulation.
vertices_used.begin(),
8265 if (needed_vertices > triangulation.
vertices.size())
8285 if (!cell->refine_flag_set())
8286 for (
unsigned int line = 0;
8287 line < GeometryInfo<dim>::lines_per_cell;
8289 if (cell->line(line)->has_children())
8290 for (
unsigned int c = 0; c < 2; ++c)
8291 Assert(cell->line(line)->child(c)->user_flag_set() ==
8304 unsigned int next_unused_vertex = 0;
8315 for (; line != endl; ++line)
8316 if (line->user_flag_set())
8322 while (triangulation.
vertices_used[next_unused_vertex] ==
true)
8323 ++next_unused_vertex;
8325 next_unused_vertex < triangulation.
vertices.size(),
8327 "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."));
8330 triangulation.
vertices[next_unused_vertex] = line->center(
true);
8336 triangulation.
faces->lines.template next_free_pair_object<1>(
8344 line->set_children(0, next_unused_line->index());
8348 children[2] = {next_unused_line, ++next_unused_line};
8355 children[0]->set_bounding_object_indices(
8356 {line->vertex_index(0), next_unused_vertex});
8357 children[1]->set_bounding_object_indices(
8358 {next_unused_vertex, line->vertex_index(1)});
8360 children[0]->set_used_flag();
8361 children[1]->set_used_flag();
8362 children[0]->clear_children();
8363 children[1]->clear_children();
8366 children[0]->clear_user_flag();
8367 children[1]->clear_user_flag();
8369 children[0]->set_boundary_id_internal(line->boundary_id());
8370 children[1]->set_boundary_id_internal(line->boundary_id());
8372 children[0]->set_manifold_id(line->manifold_id());
8373 children[1]->set_manifold_id(line->manifold_id());
8378 line->clear_user_flag();
8408 for (
unsigned int loop = 0; loop < 2; ++loop)
8421 for (; quad != endq; ++quad)
8423 if (quad->user_index())
8426 face_refinement_cases[quad->user_index()];
8435 if (aniso_quad_ref_case == quad->refinement_case())
8438 Assert(quad->refinement_case() ==
8440 quad->refinement_case() ==
8445 Assert(quad->user_index() ==
8447 quad->user_index() ==
8456 triangulation.
faces->lines
8457 .template next_free_single_object<1>(triangulation);
8477 quad->line(2)->child(0)->vertex_index(1);
8479 quad->line(3)->child(0)->vertex_index(1);
8484 quad->line(0)->child(0)->vertex_index(1);
8486 quad->line(1)->child(0)->vertex_index(1);
8489 new_line->set_bounding_object_indices(
8491 new_line->set_used_flag();
8492 new_line->clear_user_flag();
8494 new_line->clear_children();
8495 new_line->set_boundary_id_internal(quad->boundary_id());
8496 new_line->set_manifold_id(quad->manifold_id());
8504 triangulation.
faces->quads
8505 .template next_free_pair_object<2>(triangulation);
8506 new_quads[0] = next_unused_quad;
8510 new_quads[1] = next_unused_quad;
8515 new_quads[0]->set_bounding_object_indices(
8516 {
static_cast<int>(quad->line_index(0)),
8520 child_line_index(0, quad->line_orientation(2)))
8524 child_line_index(0, quad->line_orientation(3)))
8526 new_quads[1]->set_bounding_object_indices(
8528 static_cast<int>(quad->line_index(1)),
8531 child_line_index(1, quad->line_orientation(2)))
8535 child_line_index(1, quad->line_orientation(3)))
8540 new_quads[0]->set_bounding_object_indices(
8543 child_line_index(0, quad->line_orientation(0)))
8547 child_line_index(0, quad->line_orientation(1)))
8549 static_cast<int>(quad->line_index(2)),
8550 new_line->index()});
8551 new_quads[1]->set_bounding_object_indices(
8554 child_line_index(1, quad->line_orientation(0)))
8558 child_line_index(1, quad->line_orientation(1)))
8561 static_cast<int>(quad->line_index(3))});
8564 for (
const auto &new_quad : new_quads)
8566 new_quad->set_used_flag();
8567 new_quad->clear_user_flag();
8569 new_quad->clear_children();
8570 new_quad->set_boundary_id_internal(quad->boundary_id());
8571 new_quad->set_manifold_id(quad->manifold_id());
8575 for (
unsigned int j = 0;
8576 j < GeometryInfo<dim>::lines_per_face;
8578 new_quad->set_line_orientation(
8585 new_quads[0]->set_line_orientation(
8586 0, quad->line_orientation(0));
8587 new_quads[0]->set_line_orientation(
8588 2, quad->line_orientation(2));
8589 new_quads[1]->set_line_orientation(
8590 1, quad->line_orientation(1));
8591 new_quads[1]->set_line_orientation(
8592 3, quad->line_orientation(3));
8595 new_quads[0]->set_line_orientation(
8596 3, quad->line_orientation(3));
8597 new_quads[1]->set_line_orientation(
8598 2, quad->line_orientation(2));
8602 new_quads[0]->set_line_orientation(
8603 1, quad->line_orientation(1));
8604 new_quads[1]->set_line_orientation(
8605 0, quad->line_orientation(0));
8611 if (quad->refinement_case() ==
8634 if (aniso_quad_ref_case ==
8637 old_child[0] = quad->child(0)->line(1);
8638 old_child[1] = quad->child(2)->line(1);
8642 Assert(aniso_quad_ref_case ==
8646 old_child[0] = quad->child(0)->line(3);
8647 old_child[1] = quad->child(1)->line(3);
8650 if (old_child[0]->
index() + 1 != old_child[1]->
index())
8656 spacedim>::raw_line_iterator
8659 new_child[0] = new_child[1] =
8660 triangulation.
faces->lines
8661 .template next_free_pair_object<1>(
8665 new_child[0]->set_used_flag();
8666 new_child[1]->set_used_flag();
8668 const int old_index_0 = old_child[0]->index(),
8669 old_index_1 = old_child[1]->index(),
8670 new_index_0 = new_child[0]->index(),
8671 new_index_1 = new_child[1]->index();
8675 for (
unsigned int q = 0;
8676 q < triangulation.
faces->quads.n_objects();
8678 for (
unsigned int l = 0;
8679 l < GeometryInfo<dim>::lines_per_face;
8682 const int this_index =
8683 triangulation.
faces->quads
8684 .get_bounding_object_indices(q)[l];
8685 if (this_index == old_index_0)
8686 triangulation.
faces->quads
8687 .get_bounding_object_indices(q)[l] =
8689 else if (this_index == old_index_1)
8690 triangulation.
faces->quads
8691 .get_bounding_object_indices(q)[l] =
8696 for (
unsigned int i = 0; i < 2; ++i)
8698 Assert(!old_child[i]->has_children(),
8701 new_child[i]->set_bounding_object_indices(
8702 {old_child[i]->vertex_index(0),
8703 old_child[i]->vertex_index(1)});
8704 new_child[i]->set_boundary_id_internal(
8705 old_child[i]->boundary_id());
8706 new_child[i]->set_manifold_id(
8707 old_child[i]->manifold_id());
8708 new_child[i]->set_user_index(
8709 old_child[i]->user_index());
8710 if (old_child[i]->user_flag_set())
8711 new_child[i]->set_user_flag();
8713 new_child[i]->clear_user_flag();
8715 new_child[i]->clear_children();
8717 old_child[i]->clear_user_flag();
8718 old_child[i]->clear_user_index();
8719 old_child[i]->clear_used_flag();
8725 if (aniso_quad_ref_case ==
8728 new_line->set_children(
8729 0, quad->child(0)->line_index(1));
8730 Assert(new_line->child(1) ==
8731 quad->child(2)->line(1),
8768 quad_iterator switch_1 = quad->child(1),
8769 switch_2 = quad->child(2);
8770 const int switch_1_index = switch_1->index();
8771 const int switch_2_index = switch_2->index();
8772 for (
unsigned int l = 0;
8773 l < triangulation.
levels.size();
8775 for (
unsigned int h = 0;
8777 triangulation.
levels[l]->cells.n_objects();
8779 for (
const unsigned int q :
8782 const int face_index =
8784 ->cells.get_bounding_object_indices(
8786 if (face_index == switch_1_index)
8788 ->cells.get_bounding_object_indices(
8789 h)[q] = switch_2_index;
8790 else if (face_index == switch_2_index)
8792 ->cells.get_bounding_object_indices(
8793 h)[q] = switch_1_index;
8797 int switch_1_lines[4], switch_2_lines[4];
8798 for (
int i = 0; i < 4; ++i)
8800 switch_1_lines[i] = switch_1->line(i)->index();
8801 switch_2_lines[i] = switch_2->line(i)->index();
8804 switch_1_line_orientations[4] = {
8805 switch_1->line_orientation(0),
8806 switch_1->line_orientation(1),
8807 switch_1->line_orientation(2),
8808 switch_1->line_orientation(3)};
8810 switch_1->boundary_id();
8811 const unsigned int switch_1_user_index =
8812 switch_1->user_index();
8813 const bool switch_1_user_flag =
8814 switch_1->user_flag_set();
8816 switch_1_refinement_case =
8817 switch_1->refinement_case();
8818 const int switch_1_first_child_pair =
8819 (switch_1_refinement_case ?
8820 switch_1->child_index(0) :
8822 const int switch_1_second_child_pair =
8823 (switch_1_refinement_case ==
8825 switch_1->child_index(2) :
8828 switch_1->set_bounding_object_indices(
8832 switch_2_lines[3]});
8833 switch_1->set_line_orientation(
8834 0, switch_2->line_orientation(0));
8835 switch_1->set_line_orientation(
8836 1, switch_2->line_orientation(1));
8837 switch_1->set_line_orientation(
8838 2, switch_2->line_orientation(2));
8839 switch_1->set_line_orientation(
8840 3, switch_2->line_orientation(3));
8841 switch_1->set_boundary_id_internal(
8842 switch_2->boundary_id());
8843 switch_1->set_manifold_id(switch_2->manifold_id());
8844 switch_1->set_user_index(switch_2->user_index());
8845 if (switch_2->user_flag_set())
8846 switch_1->set_user_flag();
8848 switch_1->clear_user_flag();
8849 switch_1->clear_refinement_case();
8850 switch_1->set_refinement_case(
8851 switch_2->refinement_case());
8852 switch_1->clear_children();
8853 if (switch_2->refinement_case())
8854 switch_1->set_children(0,
8855 switch_2->child_index(0));
8856 if (switch_2->refinement_case() ==
8858 switch_1->set_children(2,
8859 switch_2->child_index(2));
8861 switch_2->set_bounding_object_indices(
8865 switch_1_lines[3]});
8866 switch_2->set_line_orientation(
8867 0, switch_1_line_orientations[0]);
8868 switch_2->set_line_orientation(
8869 1, switch_1_line_orientations[1]);
8870 switch_2->set_line_orientation(
8871 2, switch_1_line_orientations[2]);
8872 switch_2->set_line_orientation(
8873 3, switch_1_line_orientations[3]);
8874 switch_2->set_boundary_id_internal(
8875 switch_1_boundary_id);
8876 switch_2->set_manifold_id(switch_1->manifold_id());
8877 switch_2->set_user_index(switch_1_user_index);
8878 if (switch_1_user_flag)
8879 switch_2->set_user_flag();
8881 switch_2->clear_user_flag();
8882 switch_2->clear_refinement_case();
8883 switch_2->set_refinement_case(
8884 switch_1_refinement_case);
8885 switch_2->clear_children();
8886 switch_2->set_children(0,
8887 switch_1_first_child_pair);
8888 switch_2->set_children(2,
8889 switch_1_second_child_pair);
8891 new_quads[0]->set_refinement_case(
8893 new_quads[0]->set_children(0, quad->child_index(0));
8894 new_quads[1]->set_refinement_case(
8896 new_quads[1]->set_children(0, quad->child_index(2));
8900 new_quads[0]->set_refinement_case(
8902 new_quads[0]->set_children(0, quad->child_index(0));
8903 new_quads[1]->set_refinement_case(
8905 new_quads[1]->set_children(0, quad->child_index(2));
8906 new_line->set_children(
8907 0, quad->child(0)->line_index(3));
8908 Assert(new_line->child(1) ==
8909 quad->child(1)->line(3),
8912 quad->clear_children();
8916 quad->set_children(0, new_quads[0]->
index());
8918 quad->set_refinement_case(aniso_quad_ref_case);
8925 if (quad->user_flag_set())
8937 ++next_unused_vertex;
8939 next_unused_vertex < triangulation.
vertices.size(),
8941 "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."));
8949 quad->refinement_case();
8955 quad->child(0)->set_user_index(
8957 quad->child(1)->set_user_index(
8963 middle_line = quad->child(0)->line(1);
8965 middle_line = quad->child(0)->line(3);
8972 if (!middle_line->has_children())
8979 triangulation.
vertices[next_unused_vertex] =
8980 middle_line->center(
true);
8987 triangulation.
faces->lines
8988 .template next_free_pair_object<1>(
8993 middle_line->set_children(
8994 0, next_unused_line->index());
8998 raw_line_iterator children[2] = {
8999 next_unused_line, ++next_unused_line};
9007 children[0]->set_bounding_object_indices(
9008 {middle_line->vertex_index(0),
9009 next_unused_vertex});
9010 children[1]->set_bounding_object_indices(
9011 {next_unused_vertex,
9012 middle_line->vertex_index(1)});
9014 children[0]->set_used_flag();
9015 children[1]->set_used_flag();
9016 children[0]->clear_children();
9017 children[1]->clear_children();
9020 children[0]->clear_user_flag();
9021 children[1]->clear_user_flag();
9023 children[0]->set_boundary_id_internal(
9024 middle_line->boundary_id());
9025 children[1]->set_boundary_id_internal(
9026 middle_line->boundary_id());
9028 children[0]->set_manifold_id(
9029 middle_line->manifold_id());
9030 children[1]->set_manifold_id(
9031 middle_line->manifold_id());
9037 quad->clear_user_flag();
9066 triangulation.
vertices[next_unused_vertex] =
9067 quad->center(
true,
true);
9076 for (
unsigned int i = 0; i < 4; ++i)
9086 triangulation.
faces->lines
9087 .template next_free_pair_object<1>(triangulation);
9089 new_lines[i] = next_unused_line;
9113 quad->line(0)->child(0)->vertex_index(1),
9114 quad->line(1)->child(0)->vertex_index(1),
9115 quad->line(2)->child(0)->vertex_index(1),
9116 quad->line(3)->child(0)->vertex_index(1),
9117 next_unused_vertex};
9119 new_lines[0]->set_bounding_object_indices(
9121 new_lines[1]->set_bounding_object_indices(
9123 new_lines[2]->set_bounding_object_indices(
9125 new_lines[3]->set_bounding_object_indices(
9128 for (
const auto &new_line : new_lines)
9130 new_line->set_used_flag();
9131 new_line->clear_user_flag();
9133 new_line->clear_children();
9134 new_line->set_boundary_id_internal(quad->boundary_id());
9135 new_line->set_manifold_id(quad->manifold_id());
9148 const int line_indices[12] = {
9150 ->child(child_line_index(0, quad->line_orientation(0)))
9153 ->child(child_line_index(1, quad->line_orientation(0)))
9156 ->child(child_line_index(0, quad->line_orientation(1)))
9159 ->child(child_line_index(1, quad->line_orientation(1)))
9162 ->child(child_line_index(0, quad->line_orientation(2)))
9165 ->child(child_line_index(1, quad->line_orientation(2)))
9168 ->child(child_line_index(0, quad->line_orientation(3)))
9171 ->child(child_line_index(1, quad->line_orientation(3)))
9173 new_lines[0]->index(),
9174 new_lines[1]->index(),
9175 new_lines[2]->index(),
9176 new_lines[3]->index()};
9185 triangulation.
faces->quads
9186 .template next_free_pair_object<2>(triangulation);
9188 new_quads[0] = next_unused_quad;
9192 new_quads[1] = next_unused_quad;
9196 triangulation.
faces->quads
9197 .template next_free_pair_object<2>(triangulation);
9198 new_quads[2] = next_unused_quad;
9202 new_quads[3] = next_unused_quad;
9206 quad->set_children(0, new_quads[0]->
index());
9207 quad->set_children(2, new_quads[2]->
index());
9210 new_quads[0]->set_bounding_object_indices(
9215 new_quads[1]->set_bounding_object_indices(
9220 new_quads[2]->set_bounding_object_indices(
9225 new_quads[3]->set_bounding_object_indices(
9230 for (
const auto &new_quad : new_quads)
9232 new_quad->set_used_flag();
9233 new_quad->clear_user_flag();
9235 new_quad->clear_children();
9236 new_quad->set_boundary_id_internal(quad->boundary_id());
9237 new_quad->set_manifold_id(quad->manifold_id());
9241 for (
unsigned int j = 0;
9242 j < GeometryInfo<dim>::lines_per_face;
9244 new_quad->set_line_orientation(
9251 new_quads[0]->set_line_orientation(
9252 0, quad->line_orientation(0));
9253 new_quads[0]->set_line_orientation(
9254 2, quad->line_orientation(2));
9255 new_quads[1]->set_line_orientation(
9256 1, quad->line_orientation(1));
9257 new_quads[1]->set_line_orientation(
9258 2, quad->line_orientation(2));
9259 new_quads[2]->set_line_orientation(
9260 0, quad->line_orientation(0));
9261 new_quads[2]->set_line_orientation(
9262 3, quad->line_orientation(3));
9263 new_quads[3]->set_line_orientation(
9264 1, quad->line_orientation(1));
9265 new_quads[3]->set_line_orientation(
9266 3, quad->line_orientation(3));
9270 quad->clear_user_flag();
9281 cells_with_distorted_children;
9295 for (; hex != endh; ++hex)
9296 if (hex->refine_flag_set())
9304 hex->clear_refine_flag();
9305 hex->set_refinement_case(ref_case);
9316 unsigned int n_new_lines = 0;
9317 unsigned int n_new_quads = 0;
9318 unsigned int n_new_hexes = 0;
9349 new_lines(n_new_lines);
9350 for (
unsigned int i = 0; i < n_new_lines; ++i)
9353 triangulation.
faces->lines
9354 .template next_free_single_object<1>(triangulation);
9357 new_lines[i]->set_used_flag();
9358 new_lines[i]->clear_user_flag();
9359 new_lines[i]->clear_user_data();
9360 new_lines[i]->clear_children();
9362 new_lines[i]->set_boundary_id_internal(
9366 new_lines[i]->set_manifold_id(hex->manifold_id());
9373 new_quads(n_new_quads);
9374 for (
unsigned int i = 0; i < n_new_quads; ++i)
9377 triangulation.
faces->quads
9378 .template next_free_single_object<2>(triangulation);
9381 new_quads[i]->set_used_flag();
9382 new_quads[i]->clear_user_flag();
9383 new_quads[i]->clear_user_data();
9384 new_quads[i]->clear_children();
9386 new_quads[i]->set_boundary_id_internal(
9390 new_quads[i]->set_manifold_id(hex->manifold_id());
9393 for (
unsigned int j = 0;
9394 j < GeometryInfo<dim>::lines_per_face;
9396 new_quads[i]->set_line_orientation(
9406 new_hexes(n_new_hexes);
9407 for (
unsigned int i = 0; i < n_new_hexes; ++i)
9411 triangulation.
levels[
level + 1]->cells.next_free_hex(
9412 triangulation,
level + 1);
9416 new_hexes[i] = next_unused_hex;
9419 new_hexes[i]->set_used_flag();
9420 new_hexes[i]->clear_user_flag();
9421 new_hexes[i]->clear_user_data();
9422 new_hexes[i]->clear_children();
9425 new_hexes[i]->set_material_id(hex->material_id());
9426 new_hexes[i]->set_manifold_id(hex->manifold_id());
9427 new_hexes[i]->set_subdomain_id(subdomainid);
9434 new_hexes[i]->set_parent(hex->index());
9447 for (
const unsigned int f :
9449 new_hexes[i]->set_combined_face_orientation(
9453 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
9454 hex->set_children(2 * i, new_hexes[2 * i]->index());
9461 const bool f_or[6] = {hex->face_orientation(0),
9462 hex->face_orientation(1),
9463 hex->face_orientation(2),
9464 hex->face_orientation(3),
9465 hex->face_orientation(4),
9466 hex->face_orientation(5)};
9469 const bool f_fl[6] = {hex->face_flip(0),
9477 const bool f_ro[6] = {hex->face_rotation(0),
9478 hex->face_rotation(1),
9479 hex->face_rotation(2),
9480 hex->face_rotation(3),
9481 hex->face_rotation(4),
9482 hex->face_rotation(5)};
9486 hex->combined_face_orientation(0),
9487 hex->combined_face_orientation(1),
9488 hex->combined_face_orientation(2),
9489 hex->combined_face_orientation(3),
9490 hex->combined_face_orientation(4),
9491 hex->combined_face_orientation(5)};
9501 const unsigned int child_at_origin[2][2][2] = {
9588 raw_line_iterator lines[4] = {
9589 hex->face(2)->child(0)->line(
9590 (hex->face(2)->refinement_case() ==
9594 hex->face(3)->child(0)->line(
9595 (hex->face(3)->refinement_case() ==
9599 hex->face(4)->child(0)->line(
9600 (hex->face(4)->refinement_case() ==
9604 hex->face(5)->child(0)->line(
9605 (hex->face(5)->refinement_case() ==
9611 int line_indices[4];
9612 for (
unsigned int i = 0; i < 4; ++i)
9613 line_indices[i] = lines[i]->
index();
9626 const unsigned int middle_vertices[2] = {
9627 hex->line(2)->child(0)->vertex_index(1),
9628 hex->line(7)->child(0)->vertex_index(1)};
9630 for (
unsigned int i = 0; i < 4; ++i)
9631 if (lines[i]->vertex_index(i % 2) ==
9632 middle_vertices[i % 2])
9633 line_orientation[i] =
9638 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9639 middle_vertices[i % 2],
9641 line_orientation[i] =
9647 new_quads[0]->set_bounding_object_indices(
9653 new_quads[0]->set_line_orientation(
9654 0, line_orientation[0]);
9655 new_quads[0]->set_line_orientation(
9656 1, line_orientation[1]);
9657 new_quads[0]->set_line_orientation(
9658 2, line_orientation[2]);
9659 new_quads[0]->set_line_orientation(
9660 3, line_orientation[3]);
9693 const int quad_indices[11] = {
9694 new_quads[0]->index(),
9696 hex->face(0)->index(),
9698 hex->face(1)->index(),
9700 hex->face(2)->child_index(
9701 child_at_origin[hex->face(2)->refinement_case() -
9702 1][f_fl[2]][f_ro[2]]),
9703 hex->face(2)->child_index(
9705 child_at_origin[hex->face(2)->refinement_case() -
9706 1][f_fl[2]][f_ro[2]]),
9708 hex->face(3)->child_index(
9709 child_at_origin[hex->face(3)->refinement_case() -
9710 1][f_fl[3]][f_ro[3]]),
9711 hex->face(3)->child_index(
9713 child_at_origin[hex->face(3)->refinement_case() -
9714 1][f_fl[3]][f_ro[3]]),
9716 hex->face(4)->child_index(
9717 child_at_origin[hex->face(4)->refinement_case() -
9718 1][f_fl[4]][f_ro[4]]),
9719 hex->face(4)->child_index(
9721 child_at_origin[hex->face(4)->refinement_case() -
9722 1][f_fl[4]][f_ro[4]]),
9724 hex->face(5)->child_index(
9725 child_at_origin[hex->face(5)->refinement_case() -
9726 1][f_fl[5]][f_ro[5]]),
9727 hex->face(5)->child_index(
9729 child_at_origin[hex->face(5)->refinement_case() -
9730 1][f_fl[5]][f_ro[5]])
9734 new_hexes[0]->set_bounding_object_indices(
9741 new_hexes[1]->set_bounding_object_indices(
9816 raw_line_iterator lines[4] = {
9817 hex->face(0)->child(0)->line(
9818 (hex->face(0)->refinement_case() ==
9822 hex->face(1)->child(0)->line(
9823 (hex->face(1)->refinement_case() ==
9827 hex->face(4)->child(0)->line(
9828 (hex->face(4)->refinement_case() ==
9832 hex->face(5)->child(0)->line(
9833 (hex->face(5)->refinement_case() ==
9839 int line_indices[4];
9840 for (
unsigned int i = 0; i < 4; ++i)
9841 line_indices[i] = lines[i]->
index();
9854 const unsigned int middle_vertices[2] = {
9855 hex->line(0)->child(0)->vertex_index(1),
9856 hex->line(5)->child(0)->vertex_index(1)};
9858 for (
unsigned int i = 0; i < 4; ++i)
9859 if (lines[i]->vertex_index(i % 2) ==
9860 middle_vertices[i % 2])
9861 line_orientation[i] =
9866 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9867 middle_vertices[i % 2],
9869 line_orientation[i] =
9875 new_quads[0]->set_bounding_object_indices(
9881 new_quads[0]->set_line_orientation(
9882 0, line_orientation[2]);
9883 new_quads[0]->set_line_orientation(
9884 1, line_orientation[3]);
9885 new_quads[0]->set_line_orientation(
9886 2, line_orientation[0]);
9887 new_quads[0]->set_line_orientation(
9888 3, line_orientation[1]);
9921 const int quad_indices[11] = {
9922 new_quads[0]->index(),
9924 hex->face(0)->child_index(
9925 child_at_origin[hex->face(0)->refinement_case() -
9926 1][f_fl[0]][f_ro[0]]),
9927 hex->face(0)->child_index(
9929 child_at_origin[hex->face(0)->refinement_case() -
9930 1][f_fl[0]][f_ro[0]]),
9932 hex->face(1)->child_index(
9933 child_at_origin[hex->face(1)->refinement_case() -
9934 1][f_fl[1]][f_ro[1]]),
9935 hex->face(1)->child_index(
9937 child_at_origin[hex->face(1)->refinement_case() -
9938 1][f_fl[1]][f_ro[1]]),
9940 hex->face(2)->index(),
9942 hex->face(3)->index(),
9944 hex->face(4)->child_index(
9945 child_at_origin[hex->face(4)->refinement_case() -
9946 1][f_fl[4]][f_ro[4]]),
9947 hex->face(4)->child_index(
9949 child_at_origin[hex->face(4)->refinement_case() -
9950 1][f_fl[4]][f_ro[4]]),
9952 hex->face(5)->child_index(
9953 child_at_origin[hex->face(5)->refinement_case() -
9954 1][f_fl[5]][f_ro[5]]),
9955 hex->face(5)->child_index(
9957 child_at_origin[hex->face(5)->refinement_case() -
9958 1][f_fl[5]][f_ro[5]])
9962 new_hexes[0]->set_bounding_object_indices(
9969 new_hexes[1]->set_bounding_object_indices(
10046 raw_line_iterator lines[4] = {
10047 hex->face(0)->child(0)->line(
10048 (hex->face(0)->refinement_case() ==
10052 hex->face(1)->child(0)->line(
10053 (hex->face(1)->refinement_case() ==
10057 hex->face(2)->child(0)->line(
10058 (hex->face(2)->refinement_case() ==
10062 hex->face(3)->child(0)->line(
10063 (hex->face(3)->refinement_case() ==
10069 int line_indices[4];
10070 for (
unsigned int i = 0; i < 4; ++i)
10071 line_indices[i] = lines[i]->
index();
10084 const unsigned int middle_vertices[2] = {
10085 middle_vertex_index<dim, spacedim>(hex->line(8)),
10086 middle_vertex_index<dim, spacedim>(hex->line(11))};
10088 for (
unsigned int i = 0; i < 4; ++i)
10089 if (lines[i]->vertex_index(i % 2) ==
10090 middle_vertices[i % 2])
10091 line_orientation[i] =
10096 Assert(lines[i]->vertex_index((i + 1) % 2) ==
10097 middle_vertices[i % 2],
10099 line_orientation[i] =
10105 new_quads[0]->set_bounding_object_indices(
10111 new_quads[0]->set_line_orientation(
10112 0, line_orientation[0]);
10113 new_quads[0]->set_line_orientation(
10114 1, line_orientation[1]);
10115 new_quads[0]->set_line_orientation(
10116 2, line_orientation[2]);
10117 new_quads[0]->set_line_orientation(
10118 3, line_orientation[3]);
10152 const int quad_indices[11] = {
10153 new_quads[0]->index(),
10155 hex->face(0)->child_index(
10156 child_at_origin[hex->face(0)->refinement_case() -
10157 1][f_fl[0]][f_ro[0]]),
10158 hex->face(0)->child_index(
10160 child_at_origin[hex->face(0)->refinement_case() -
10161 1][f_fl[0]][f_ro[0]]),
10163 hex->face(1)->child_index(
10164 child_at_origin[hex->face(1)->refinement_case() -
10165 1][f_fl[1]][f_ro[1]]),
10166 hex->face(1)->child_index(
10168 child_at_origin[hex->face(1)->refinement_case() -
10169 1][f_fl[1]][f_ro[1]]),
10171 hex->face(2)->child_index(
10172 child_at_origin[hex->face(2)->refinement_case() -
10173 1][f_fl[2]][f_ro[2]]),
10174 hex->face(2)->child_index(
10176 child_at_origin[hex->face(2)->refinement_case() -
10177 1][f_fl[2]][f_ro[2]]),
10179 hex->face(3)->child_index(
10180 child_at_origin[hex->face(3)->refinement_case() -
10181 1][f_fl[3]][f_ro[3]]),
10182 hex->face(3)->child_index(
10184 child_at_origin[hex->face(3)->refinement_case() -
10185 1][f_fl[3]][f_ro[3]]),
10187 hex->face(4)->index(),
10189 hex->face(5)->index()
10192 new_hexes[0]->set_bounding_object_indices(
10199 new_hexes[1]->set_bounding_object_indices(
10205 quad_indices[10]});
10231 new_lines[0]->set_bounding_object_indices(
10232 {middle_vertex_index<dim, spacedim>(hex->face(4)),
10233 middle_vertex_index<dim, spacedim>(hex->face(5))});
10301 spacedim>::raw_line_iterator lines[13] = {
10302 hex->face(0)->child(0)->line(
10303 (hex->face(0)->refinement_case() ==
10307 hex->face(1)->child(0)->line(
10308 (hex->face(1)->refinement_case() ==
10312 hex->face(2)->child(0)->line(
10313 (hex->face(2)->refinement_case() ==
10317 hex->face(3)->child(0)->line(
10318 (hex->face(3)->refinement_case() ==
10326 0, f_or[4], f_fl[4], f_ro[4]))
10329 1, f_or[4], f_fl[4], f_ro[4])),
10333 3, f_or[4], f_fl[4], f_ro[4]))
10336 0, f_or[4], f_fl[4], f_ro[4])),
10340 0, f_or[4], f_fl[4], f_ro[4]))
10343 3, f_or[4], f_fl[4], f_ro[4])),
10347 3, f_or[4], f_fl[4], f_ro[4]))
10350 2, f_or[4], f_fl[4], f_ro[4])),
10355 0, f_or[5], f_fl[5], f_ro[5]))
10358 1, f_or[5], f_fl[5], f_ro[5])),
10362 3, f_or[5], f_fl[5], f_ro[5]))
10365 0, f_or[5], f_fl[5], f_ro[5])),
10369 0, f_or[5], f_fl[5], f_ro[5]))
10372 3, f_or[5], f_fl[5], f_ro[5])),
10376 3, f_or[5], f_fl[5], f_ro[5]))
10379 2, f_or[5], f_fl[5], f_ro[5])),
10384 int line_indices[13];
10385 for (
unsigned int i = 0; i < 13; ++i)
10386 line_indices[i] = lines[i]->
index();
10397 const unsigned int middle_vertices[4] = {
10398 hex->line(0)->child(0)->vertex_index(1),
10399 hex->line(1)->child(0)->vertex_index(1),
10400 hex->line(2)->child(0)->vertex_index(1),
10401 hex->line(3)->child(0)->vertex_index(1),
10407 for (
unsigned int i = 0; i < 4; ++i)
10408 if (lines[i]->vertex_index(0) == middle_vertices[i])
10409 line_orientation[i] =
10414 Assert(lines[i]->vertex_index(1) ==
10415 middle_vertices[i],
10417 line_orientation[i] =
10427 for (
unsigned int i = 4; i < 12; ++i)
10428 if (lines[i]->vertex_index((i + 1) % 2) ==
10429 middle_vertex_index<dim, spacedim>(
10430 hex->face(3 + i / 4)))
10431 line_orientation[i] =
10436 Assert(lines[i]->vertex_index(i % 2) ==
10437 (middle_vertex_index<dim, spacedim>(
10438 hex->face(3 + i / 4))),
10440 line_orientation[i] =
10446 line_orientation[12] =
10472 new_quads[0]->set_bounding_object_indices(
10477 new_quads[1]->set_bounding_object_indices(
10482 new_quads[2]->set_bounding_object_indices(
10486 line_indices[12]});
10487 new_quads[3]->set_bounding_object_indices(
10493 new_quads[0]->set_line_orientation(
10494 0, line_orientation[2]);
10495 new_quads[0]->set_line_orientation(
10496 2, line_orientation[4]);
10497 new_quads[0]->set_line_orientation(
10498 3, line_orientation[8]);
10500 new_quads[1]->set_line_orientation(
10501 1, line_orientation[3]);
10502 new_quads[1]->set_line_orientation(
10503 2, line_orientation[5]);
10504 new_quads[1]->set_line_orientation(
10505 3, line_orientation[9]);
10507 new_quads[2]->set_line_orientation(
10508 0, line_orientation[6]);
10509 new_quads[2]->set_line_orientation(
10510 1, line_orientation[10]);
10511 new_quads[2]->set_line_orientation(
10512 2, line_orientation[0]);
10514 new_quads[3]->set_line_orientation(
10515 0, line_orientation[7]);
10516 new_quads[3]->set_line_orientation(
10517 1, line_orientation[11]);
10518 new_quads[3]->set_line_orientation(
10519 3, line_orientation[1]);
10552 const int quad_indices[20] = {
10553 new_quads[0]->index(),
10554 new_quads[1]->index(),
10555 new_quads[2]->index(),
10556 new_quads[3]->index(),
10558 hex->face(0)->child_index(
10559 child_at_origin[hex->face(0)->refinement_case() -
10560 1][f_fl[0]][f_ro[0]]),
10561 hex->face(0)->child_index(
10563 child_at_origin[hex->face(0)->refinement_case() -
10564 1][f_fl[0]][f_ro[0]]),
10566 hex->face(1)->child_index(
10567 child_at_origin[hex->face(1)->refinement_case() -
10568 1][f_fl[1]][f_ro[1]]),
10569 hex->face(1)->child_index(
10571 child_at_origin[hex->face(1)->refinement_case() -
10572 1][f_fl[1]][f_ro[1]]),
10574 hex->face(2)->child_index(
10575 child_at_origin[hex->face(2)->refinement_case() -
10576 1][f_fl[2]][f_ro[2]]),
10577 hex->face(2)->child_index(
10579 child_at_origin[hex->face(2)->refinement_case() -
10580 1][f_fl[2]][f_ro[2]]),
10582 hex->face(3)->child_index(
10583 child_at_origin[hex->face(3)->refinement_case() -
10584 1][f_fl[3]][f_ro[3]]),
10585 hex->face(3)->child_index(
10587 child_at_origin[hex->face(3)->refinement_case() -
10588 1][f_fl[3]][f_ro[3]]),
10590 hex->face(4)->isotropic_child_index(
10592 0, f_or[4], f_fl[4], f_ro[4])),
10593 hex->face(4)->isotropic_child_index(
10595 1, f_or[4], f_fl[4], f_ro[4])),
10596 hex->face(4)->isotropic_child_index(
10598 2, f_or[4], f_fl[4], f_ro[4])),
10599 hex->face(4)->isotropic_child_index(
10601 3, f_or[4], f_fl[4], f_ro[4])),
10603 hex->face(5)->isotropic_child_index(
10605 0, f_or[5], f_fl[5], f_ro[5])),
10606 hex->face(5)->isotropic_child_index(
10608 1, f_or[5], f_fl[5], f_ro[5])),
10609 hex->face(5)->isotropic_child_index(
10611 2, f_or[5], f_fl[5], f_ro[5])),
10612 hex->face(5)->isotropic_child_index(
10614 3, f_or[5], f_fl[5], f_ro[5]))};
10616 new_hexes[0]->set_bounding_object_indices(
10622 quad_indices[16]});
10623 new_hexes[1]->set_bounding_object_indices(
10629 quad_indices[17]});
10630 new_hexes[2]->set_bounding_object_indices(
10636 quad_indices[18]});
10637 new_hexes[3]->set_bounding_object_indices(
10643 quad_indices[19]});
10669 new_lines[0]->set_bounding_object_indices(
10670 {middle_vertex_index<dim, spacedim>(hex->face(2)),
10671 middle_vertex_index<dim, spacedim>(hex->face(3))});
10739 spacedim>::raw_line_iterator lines[13] = {
10740 hex->face(0)->child(0)->line(
10741 (hex->face(0)->refinement_case() ==
10745 hex->face(1)->child(0)->line(
10746 (hex->face(1)->refinement_case() ==
10750 hex->face(4)->child(0)->line(
10751 (hex->face(4)->refinement_case() ==
10755 hex->face(5)->child(0)->line(
10756 (hex->face(5)->refinement_case() ==
10764 0, f_or[2], f_fl[2], f_ro[2]))
10767 3, f_or[2], f_fl[2], f_ro[2])),
10771 3, f_or[2], f_fl[2], f_ro[2]))
10774 2, f_or[2], f_fl[2], f_ro[2])),
10778 0, f_or[2], f_fl[2], f_ro[2]))
10781 1, f_or[2], f_fl[2], f_ro[2])),
10785 3, f_or[2], f_fl[2], f_ro[2]))
10788 0, f_or[2], f_fl[2], f_ro[2])),
10793 0, f_or[3], f_fl[3], f_ro[3]))
10796 3, f_or[3], f_fl[3], f_ro[3])),
10800 3, f_or[3], f_fl[3], f_ro[3]))
10803 2, f_or[3], f_fl[3], f_ro[3])),
10807 0, f_or[3], f_fl[3], f_ro[3]))
10810 1, f_or[3], f_fl[3], f_ro[3])),
10814 3, f_or[3], f_fl[3], f_ro[3]))
10817 0, f_or[3], f_fl[3], f_ro[3])),
10822 int line_indices[13];
10823 for (
unsigned int i = 0; i < 13; ++i)
10824 line_indices[i] = lines[i]->
index();
10835 const unsigned int middle_vertices[4] = {
10836 hex->line(8)->child(0)->vertex_index(1),
10837 hex->line(9)->child(0)->vertex_index(1),
10838 hex->line(2)->child(0)->vertex_index(1),
10839 hex->line(6)->child(0)->vertex_index(1),
10844 for (
unsigned int i = 0; i < 4; ++i)
10845 if (lines[i]->vertex_index(0) == middle_vertices[i])
10846 line_orientation[i] =
10851 Assert(lines[i]->vertex_index(1) ==
10852 middle_vertices[i],
10854 line_orientation[i] =
10864 for (
unsigned int i = 4; i < 12; ++i)
10865 if (lines[i]->vertex_index((i + 1) % 2) ==
10866 middle_vertex_index<dim, spacedim>(
10867 hex->face(1 + i / 4)))
10868 line_orientation[i] =
10874 Assert(lines[i]->vertex_index(i % 2) ==
10875 (middle_vertex_index<dim, spacedim>(
10876 hex->face(1 + i / 4))),
10878 line_orientation[i] =
10884 line_orientation[12] =
10911 new_quads[0]->set_bounding_object_indices(
10915 line_indices[10]});
10916 new_quads[1]->set_bounding_object_indices(
10920 line_indices[11]});
10921 new_quads[2]->set_bounding_object_indices(
10925 line_indices[12]});
10926 new_quads[3]->set_bounding_object_indices(
10932 new_quads[0]->set_line_orientation(
10933 0, line_orientation[0]);
10934 new_quads[0]->set_line_orientation(
10935 2, line_orientation[6]);
10936 new_quads[0]->set_line_orientation(
10937 3, line_orientation[10]);
10939 new_quads[1]->set_line_orientation(
10940 1, line_orientation[1]);
10941 new_quads[1]->set_line_orientation(
10942 2, line_orientation[7]);
10943 new_quads[1]->set_line_orientation(
10944 3, line_orientation[11]);
10946 new_quads[2]->set_line_orientation(
10947 0, line_orientation[4]);
10948 new_quads[2]->set_line_orientation(
10949 1, line_orientation[8]);
10950 new_quads[2]->set_line_orientation(
10951 2, line_orientation[2]);
10953 new_quads[3]->set_line_orientation(
10954 0, line_orientation[5]);
10955 new_quads[3]->set_line_orientation(
10956 1, line_orientation[9]);
10957 new_quads[3]->set_line_orientation(
10958 3, line_orientation[3]);
10992 const int quad_indices[20] = {
10993 new_quads[0]->index(),
10994 new_quads[1]->index(),
10995 new_quads[2]->index(),
10996 new_quads[3]->index(),
10998 hex->face(0)->child_index(
10999 child_at_origin[hex->face(0)->refinement_case() -
11000 1][f_fl[0]][f_ro[0]]),
11001 hex->face(0)->child_index(
11003 child_at_origin[hex->face(0)->refinement_case() -
11004 1][f_fl[0]][f_ro[0]]),
11006 hex->face(1)->child_index(
11007 child_at_origin[hex->face(1)->refinement_case() -
11008 1][f_fl[1]][f_ro[1]]),
11009 hex->face(1)->child_index(
11011 child_at_origin[hex->face(1)->refinement_case() -
11012 1][f_fl[1]][f_ro[1]]),
11014 hex->face(2)->isotropic_child_index(
11016 0, f_or[2], f_fl[2], f_ro[2])),
11017 hex->face(2)->isotropic_child_index(
11019 1, f_or[2], f_fl[2], f_ro[2])),
11020 hex->face(2)->isotropic_child_index(
11022 2, f_or[2], f_fl[2], f_ro[2])),
11023 hex->face(2)->isotropic_child_index(
11025 3, f_or[2], f_fl[2], f_ro[2])),
11027 hex->face(3)->isotropic_child_index(
11029 0, f_or[3], f_fl[3], f_ro[3])),
11030 hex->face(3)->isotropic_child_index(
11032 1, f_or[3], f_fl[3], f_ro[3])),
11033 hex->face(3)->isotropic_child_index(
11035 2, f_or[3], f_fl[3], f_ro[3])),
11036 hex->face(3)->isotropic_child_index(
11038 3, f_or[3], f_fl[3], f_ro[3])),
11040 hex->face(4)->child_index(
11041 child_at_origin[hex->face(4)->refinement_case() -
11042 1][f_fl[4]][f_ro[4]]),
11043 hex->face(4)->child_index(
11045 child_at_origin[hex->face(4)->refinement_case() -
11046 1][f_fl[4]][f_ro[4]]),
11048 hex->face(5)->child_index(
11049 child_at_origin[hex->face(5)->refinement_case() -
11050 1][f_fl[5]][f_ro[5]]),
11051 hex->face(5)->child_index(
11053 child_at_origin[hex->face(5)->refinement_case() -
11054 1][f_fl[5]][f_ro[5]])};
11065 new_hexes[0]->set_bounding_object_indices(
11072 new_hexes[1]->set_bounding_object_indices(
11078 quad_indices[18]});
11079 new_hexes[2]->set_bounding_object_indices(
11086 new_hexes[3]->set_bounding_object_indices(
11092 quad_indices[19]});
11119 new_lines[0]->set_bounding_object_indices(
11121 {middle_vertex_index<dim, spacedim>(hex->face(0)),
11122 middle_vertex_index<dim, spacedim>(hex->face(1))});
11191 spacedim>::raw_line_iterator lines[13] = {
11192 hex->face(2)->child(0)->line(
11193 (hex->face(2)->refinement_case() ==
11197 hex->face(3)->child(0)->line(
11198 (hex->face(3)->refinement_case() ==
11202 hex->face(4)->child(0)->line(
11203 (hex->face(4)->refinement_case() ==
11207 hex->face(5)->child(0)->line(
11208 (hex->face(5)->refinement_case() ==
11216 0, f_or[0], f_fl[0], f_ro[0]))
11219 1, f_or[0], f_fl[0], f_ro[0])),
11223 3, f_or[0], f_fl[0], f_ro[0]))
11226 0, f_or[0], f_fl[0], f_ro[0])),
11230 0, f_or[0], f_fl[0], f_ro[0]))
11233 3, f_or[0], f_fl[0], f_ro[0])),
11237 3, f_or[0], f_fl[0], f_ro[0]))
11240 2, f_or[0], f_fl[0], f_ro[0])),
11245 0, f_or[1], f_fl[1], f_ro[1]))
11248 1, f_or[1], f_fl[1], f_ro[1])),
11252 3, f_or[1], f_fl[1], f_ro[1]))
11255 0, f_or[1], f_fl[1], f_ro[1])),
11259 0, f_or[1], f_fl[1], f_ro[1]))
11262 3, f_or[1], f_fl[1], f_ro[1])),
11266 3, f_or[1], f_fl[1], f_ro[1]))
11269 2, f_or[1], f_fl[1], f_ro[1])),
11274 int line_indices[13];
11275 for (
unsigned int i = 0; i < 13; ++i)
11276 line_indices[i] = lines[i]->
index();
11287 const unsigned int middle_vertices[4] = {
11288 hex->line(8)->child(0)->vertex_index(1),
11289 hex->line(10)->child(0)->vertex_index(1),
11290 hex->line(0)->child(0)->vertex_index(1),
11291 hex->line(4)->child(0)->vertex_index(1),
11296 for (
unsigned int i = 0; i < 4; ++i)
11297 if (lines[i]->vertex_index(0) == middle_vertices[i])
11298 line_orientation[i] =
11303 Assert(lines[i]->vertex_index(1) ==
11304 middle_vertices[i],
11306 line_orientation[i] =
11316 for (
unsigned int i = 4; i < 12; ++i)
11317 if (lines[i]->vertex_index((i + 1) % 2) ==
11318 middle_vertex_index<dim, spacedim>(
11319 hex->face(i / 4 - 1)))
11320 line_orientation[i] =
11325 Assert(lines[i]->vertex_index(i % 2) ==
11326 (middle_vertex_index<dim, spacedim>(
11327 hex->face(i / 4 - 1))),
11329 line_orientation[i] =
11334 line_orientation[12] =
11355 new_quads[0]->set_bounding_object_indices(
11359 line_indices[12]});
11360 new_quads[1]->set_bounding_object_indices(
11365 new_quads[2]->set_bounding_object_indices(
11370 new_quads[3]->set_bounding_object_indices(
11376 new_quads[0]->set_line_orientation(
11377 0, line_orientation[6]);
11378 new_quads[0]->set_line_orientation(
11379 1, line_orientation[10]);
11380 new_quads[0]->set_line_orientation(
11381 2, line_orientation[0]);
11383 new_quads[1]->set_line_orientation(
11384 0, line_orientation[7]);
11385 new_quads[1]->set_line_orientation(
11386 1, line_orientation[11]);
11387 new_quads[1]->set_line_orientation(
11388 3, line_orientation[1]);
11390 new_quads[2]->set_line_orientation(
11391 0, line_orientation[2]);
11392 new_quads[2]->set_line_orientation(
11393 2, line_orientation[4]);
11394 new_quads[2]->set_line_orientation(
11395 3, line_orientation[8]);
11397 new_quads[3]->set_line_orientation(
11398 1, line_orientation[3]);
11399 new_quads[3]->set_line_orientation(
11400 2, line_orientation[5]);
11401 new_quads[3]->set_line_orientation(
11402 3, line_orientation[9]);
11436 const int quad_indices[20] = {
11437 new_quads[0]->index(),
11438 new_quads[1]->index(),
11439 new_quads[2]->index(),
11440 new_quads[3]->index(),
11442 hex->face(0)->isotropic_child_index(
11444 0, f_or[0], f_fl[0], f_ro[0])),
11445 hex->face(0)->isotropic_child_index(
11447 1, f_or[0], f_fl[0], f_ro[0])),
11448 hex->face(0)->isotropic_child_index(
11450 2, f_or[0], f_fl[0], f_ro[0])),
11451 hex->face(0)->isotropic_child_index(
11453 3, f_or[0], f_fl[0], f_ro[0])),
11455 hex->face(1)->isotropic_child_index(
11457 0, f_or[1], f_fl[1], f_ro[1])),
11458 hex->face(1)->isotropic_child_index(
11460 1, f_or[1], f_fl[1], f_ro[1])),
11461 hex->face(1)->isotropic_child_index(
11463 2, f_or[1], f_fl[1], f_ro[1])),
11464 hex->face(1)->isotropic_child_index(
11466 3, f_or[1], f_fl[1], f_ro[1])),
11468 hex->face(2)->child_index(
11469 child_at_origin[hex->face(2)->refinement_case() -
11470 1][f_fl[2]][f_ro[2]]),
11471 hex->face(2)->child_index(
11473 child_at_origin[hex->face(2)->refinement_case() -
11474 1][f_fl[2]][f_ro[2]]),
11476 hex->face(3)->child_index(
11477 child_at_origin[hex->face(3)->refinement_case() -
11478 1][f_fl[3]][f_ro[3]]),
11479 hex->face(3)->child_index(
11481 child_at_origin[hex->face(3)->refinement_case() -
11482 1][f_fl[3]][f_ro[3]]),
11484 hex->face(4)->child_index(
11485 child_at_origin[hex->face(4)->refinement_case() -
11486 1][f_fl[4]][f_ro[4]]),
11487 hex->face(4)->child_index(
11489 child_at_origin[hex->face(4)->refinement_case() -
11490 1][f_fl[4]][f_ro[4]]),
11492 hex->face(5)->child_index(
11493 child_at_origin[hex->face(5)->refinement_case() -
11494 1][f_fl[5]][f_ro[5]]),
11495 hex->face(5)->child_index(
11497 child_at_origin[hex->face(5)->refinement_case() -
11498 1][f_fl[5]][f_ro[5]])};
11500 new_hexes[0]->set_bounding_object_indices(
11507 new_hexes[1]->set_bounding_object_indices(
11514 new_hexes[2]->set_bounding_object_indices(
11520 quad_indices[18]});
11521 new_hexes[3]->set_bounding_object_indices(
11527 quad_indices[19]});
11559 ++next_unused_vertex;
11561 next_unused_vertex < triangulation.
vertices.size(),
11563 "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."));
11573 triangulation.
vertices[next_unused_vertex] =
11574 hex->center(
true,
true);
11596 middle_vertex_index<dim, spacedim>(hex->face(0)),
11597 middle_vertex_index<dim, spacedim>(hex->face(1)),
11598 middle_vertex_index<dim, spacedim>(hex->face(2)),
11599 middle_vertex_index<dim, spacedim>(hex->face(3)),
11600 middle_vertex_index<dim, spacedim>(hex->face(4)),
11601 middle_vertex_index<dim, spacedim>(hex->face(5)),
11602 next_unused_vertex};
11604 new_lines[0]->set_bounding_object_indices(
11606 new_lines[1]->set_bounding_object_indices(
11608 new_lines[2]->set_bounding_object_indices(
11610 new_lines[3]->set_bounding_object_indices(
11612 new_lines[4]->set_bounding_object_indices(
11614 new_lines[5]->set_bounding_object_indices(
11684 spacedim>::raw_line_iterator lines[30] = {
11688 0, f_or[0], f_fl[0], f_ro[0]))
11691 1, f_or[0], f_fl[0], f_ro[0])),
11695 3, f_or[0], f_fl[0], f_ro[0]))
11698 0, f_or[0], f_fl[0], f_ro[0])),
11702 0, f_or[0], f_fl[0], f_ro[0]))
11705 3, f_or[0], f_fl[0], f_ro[0])),
11709 3, f_or[0], f_fl[0], f_ro[0]))
11712 2, f_or[0], f_fl[0], f_ro[0])),
11717 0, f_or[1], f_fl[1], f_ro[1]))
11720 1, f_or[1], f_fl[1], f_ro[1])),
11724 3, f_or[1], f_fl[1], f_ro[1]))
11727 0, f_or[1], f_fl[1], f_ro[1])),
11731 0, f_or[1], f_fl[1], f_ro[1]))
11734 3, f_or[1], f_fl[1], f_ro[1])),
11738 3, f_or[1], f_fl[1], f_ro[1]))
11741 2, f_or[1], f_fl[1], f_ro[1])),
11746 0, f_or[2], f_fl[2], f_ro[2]))
11749 1, f_or[2], f_fl[2], f_ro[2])),
11753 3, f_or[2], f_fl[2], f_ro[2]))
11756 0, f_or[2], f_fl[2], f_ro[2])),
11760 0, f_or[2], f_fl[2], f_ro[2]))
11763 3, f_or[2], f_fl[2], f_ro[2])),
11767 3, f_or[2], f_fl[2], f_ro[2]))
11770 2, f_or[2], f_fl[2], f_ro[2])),
11775 0, f_or[3], f_fl[3], f_ro[3]))
11778 1, f_or[3], f_fl[3], f_ro[3])),
11782 3, f_or[3], f_fl[3], f_ro[3]))
11785 0, f_or[3], f_fl[3], f_ro[3])),
11789 0, f_or[3], f_fl[3], f_ro[3]))
11792 3, f_or[3], f_fl[3], f_ro[3])),
11796 3, f_or[3], f_fl[3], f_ro[3]))
11799 2, f_or[3], f_fl[3], f_ro[3])),
11804 0, f_or[4], f_fl[4], f_ro[4]))
11807 1, f_or[4], f_fl[4], f_ro[4])),
11811 3, f_or[4], f_fl[4], f_ro[4]))
11814 0, f_or[4], f_fl[4], f_ro[4])),
11818 0, f_or[4], f_fl[4], f_ro[4]))
11821 3, f_or[4], f_fl[4], f_ro[4])),
11825 3, f_or[4], f_fl[4], f_ro[4]))
11828 2, f_or[4], f_fl[4], f_ro[4])),
11833 0, f_or[5], f_fl[5], f_ro[5]))
11836 1, f_or[5], f_fl[5], f_ro[5])),
11840 3, f_or[5], f_fl[5], f_ro[5]))
11843 0, f_or[5], f_fl[5], f_ro[5])),
11847 0, f_or[5], f_fl[5], f_ro[5]))
11850 3, f_or[5], f_fl[5], f_ro[5])),
11854 3, f_or[5], f_fl[5], f_ro[5]))
11857 2, f_or[5], f_fl[5], f_ro[5])),
11867 int line_indices[30];
11868 for (
unsigned int i = 0; i < 30; ++i)
11869 line_indices[i] = lines[i]->
index();
11884 for (
unsigned int i = 0; i < 24; ++i)
11885 if (lines[i]->vertex_index((i + 1) % 2) ==
11887 line_orientation[i] =
11893 Assert(lines[i]->vertex_index(i % 2) ==
11896 line_orientation[i] =
11902 for (
unsigned int i = 24; i < 30; ++i)
11903 line_orientation[i] =
11936 new_quads[0]->set_bounding_object_indices(
11940 line_indices[24]});
11941 new_quads[1]->set_bounding_object_indices(
11945 line_indices[25]});
11946 new_quads[2]->set_bounding_object_indices(
11950 line_indices[20]});
11951 new_quads[3]->set_bounding_object_indices(
11955 line_indices[21]});
11956 new_quads[4]->set_bounding_object_indices(
11960 line_indices[28]});
11961 new_quads[5]->set_bounding_object_indices(
11965 line_indices[29]});
11966 new_quads[6]->set_bounding_object_indices(
11971 new_quads[7]->set_bounding_object_indices(
11976 new_quads[8]->set_bounding_object_indices(
11980 line_indices[26]});
11981 new_quads[9]->set_bounding_object_indices(
11985 line_indices[27]});
11986 new_quads[10]->set_bounding_object_indices(
11990 line_indices[12]});
11991 new_quads[11]->set_bounding_object_indices(
11995 line_indices[13]});
12000 new_quads[0]->set_line_orientation(
12001 0, line_orientation[10]);
12002 new_quads[0]->set_line_orientation(
12003 2, line_orientation[16]);
12005 new_quads[1]->set_line_orientation(
12006 1, line_orientation[14]);
12007 new_quads[1]->set_line_orientation(
12008 2, line_orientation[17]);
12010 new_quads[2]->set_line_orientation(
12011 0, line_orientation[11]);
12012 new_quads[2]->set_line_orientation(
12013 3, line_orientation[20]);
12015 new_quads[3]->set_line_orientation(
12016 1, line_orientation[15]);
12017 new_quads[3]->set_line_orientation(
12018 3, line_orientation[21]);
12020 new_quads[4]->set_line_orientation(
12021 0, line_orientation[18]);
12022 new_quads[4]->set_line_orientation(
12023 2, line_orientation[0]);
12025 new_quads[5]->set_line_orientation(
12026 1, line_orientation[22]);
12027 new_quads[5]->set_line_orientation(
12028 2, line_orientation[1]);
12030 new_quads[6]->set_line_orientation(
12031 0, line_orientation[19]);
12032 new_quads[6]->set_line_orientation(
12033 3, line_orientation[4]);
12035 new_quads[7]->set_line_orientation(
12036 1, line_orientation[23]);
12037 new_quads[7]->set_line_orientation(
12038 3, line_orientation[5]);
12040 new_quads[8]->set_line_orientation(
12041 0, line_orientation[2]);
12042 new_quads[8]->set_line_orientation(
12043 2, line_orientation[8]);
12045 new_quads[9]->set_line_orientation(
12046 1, line_orientation[6]);
12047 new_quads[9]->set_line_orientation(
12048 2, line_orientation[9]);
12050 new_quads[10]->set_line_orientation(
12051 0, line_orientation[3]);
12052 new_quads[10]->set_line_orientation(
12053 3, line_orientation[12]);
12055 new_quads[11]->set_line_orientation(
12056 1, line_orientation[7]);
12057 new_quads[11]->set_line_orientation(
12058 3, line_orientation[13]);
12099 const int quad_indices[36] = {
12100 new_quads[0]->index(),
12101 new_quads[1]->index(),
12102 new_quads[2]->index(),
12103 new_quads[3]->index(),
12104 new_quads[4]->index(),
12105 new_quads[5]->index(),
12106 new_quads[6]->index(),
12107 new_quads[7]->index(),
12108 new_quads[8]->index(),
12109 new_quads[9]->index(),
12110 new_quads[10]->index(),
12111 new_quads[11]->index(),
12113 hex->face(0)->isotropic_child_index(
12115 0, f_or[0], f_fl[0], f_ro[0])),
12116 hex->face(0)->isotropic_child_index(
12118 1, f_or[0], f_fl[0], f_ro[0])),
12119 hex->face(0)->isotropic_child_index(
12121 2, f_or[0], f_fl[0], f_ro[0])),
12122 hex->face(0)->isotropic_child_index(
12124 3, f_or[0], f_fl[0], f_ro[0])),
12126 hex->face(1)->isotropic_child_index(
12128 0, f_or[1], f_fl[1], f_ro[1])),
12129 hex->face(1)->isotropic_child_index(
12131 1, f_or[1], f_fl[1], f_ro[1])),
12132 hex->face(1)->isotropic_child_index(
12134 2, f_or[1], f_fl[1], f_ro[1])),
12135 hex->face(1)->isotropic_child_index(
12137 3, f_or[1], f_fl[1], f_ro[1])),
12139 hex->face(2)->isotropic_child_index(
12141 0, f_or[2], f_fl[2], f_ro[2])),
12142 hex->face(2)->isotropic_child_index(
12144 1, f_or[2], f_fl[2], f_ro[2])),
12145 hex->face(2)->isotropic_child_index(
12147 2, f_or[2], f_fl[2], f_ro[2])),
12148 hex->face(2)->isotropic_child_index(
12150 3, f_or[2], f_fl[2], f_ro[2])),
12152 hex->face(3)->isotropic_child_index(
12154 0, f_or[3], f_fl[3], f_ro[3])),
12155 hex->face(3)->isotropic_child_index(
12157 1, f_or[3], f_fl[3], f_ro[3])),
12158 hex->face(3)->isotropic_child_index(
12160 2, f_or[3], f_fl[3], f_ro[3])),
12161 hex->face(3)->isotropic_child_index(
12163 3, f_or[3], f_fl[3], f_ro[3])),
12165 hex->face(4)->isotropic_child_index(
12167 0, f_or[4], f_fl[4], f_ro[4])),
12168 hex->face(4)->isotropic_child_index(
12170 1, f_or[4], f_fl[4], f_ro[4])),
12171 hex->face(4)->isotropic_child_index(
12173 2, f_or[4], f_fl[4], f_ro[4])),
12174 hex->face(4)->isotropic_child_index(
12176 3, f_or[4], f_fl[4], f_ro[4])),
12178 hex->face(5)->isotropic_child_index(
12180 0, f_or[5], f_fl[5], f_ro[5])),
12181 hex->face(5)->isotropic_child_index(
12183 1, f_or[5], f_fl[5], f_ro[5])),
12184 hex->face(5)->isotropic_child_index(
12186 2, f_or[5], f_fl[5], f_ro[5])),
12187 hex->face(5)->isotropic_child_index(
12189 3, f_or[5], f_fl[5], f_ro[5]))};
12192 new_hexes[0]->set_bounding_object_indices(
12199 new_hexes[1]->set_bounding_object_indices(
12206 new_hexes[2]->set_bounding_object_indices(
12212 quad_indices[10]});
12213 new_hexes[3]->set_bounding_object_indices(
12219 quad_indices[11]});
12222 new_hexes[4]->set_bounding_object_indices(
12228 quad_indices[32]});
12229 new_hexes[5]->set_bounding_object_indices(
12235 quad_indices[33]});
12236 new_hexes[6]->set_bounding_object_indices(
12242 quad_indices[34]});
12243 new_hexes[7]->set_bounding_object_indices(
12249 quad_indices[35]});
12283 for (
unsigned int s = 0;
12290 const unsigned int current_child =
12299 ref_case, f, f_or[f], f_fl[f], f_ro[f]));
12300 new_hexes[current_child]->set_combined_face_orientation(
12306 if (check_for_distorted_cells &&
12307 has_distorted_children<dim, spacedim>(hex))
12324 triangulation.
faces->quads.clear_user_data();
12327 return cells_with_distorted_children;