5922 const bool check_for_distorted_cells)
5924 static const int dim = 3;
5926 using raw_line_iterator =
5928 using raw_quad_iterator =
5939 for (
const auto &cell :
triangulation.active_cell_iterators_on_level(
5941 if (cell->refine_flag_set())
5967 unsigned int needed_vertices = 0;
5968 unsigned int needed_lines_single = 0;
5969 unsigned int needed_quads_single = 0;
5970 unsigned int needed_lines_pair = 0;
5971 unsigned int needed_quads_pair = 0;
5974 unsigned int new_cells = 0;
5976 for (
const auto &cell :
5978 if (cell->refine_flag_set())
5981 Assert(cell->refine_flag_set() ==
5987 new_cells += cell->reference_cell().n_isotropic_children();
5992 needed_lines_single += 6;
5993 needed_quads_single += 12;
5995 else if (cell->reference_cell() ==
5998 needed_lines_single += 1;
5999 needed_quads_single += 8;
6010 for (
const auto face : cell->face_indices())
6011 if (cell->face(face)->n_children() == 0)
6012 cell->face(face)->set_user_flag();
6014 Assert(cell->face(face)->n_children() ==
6015 cell->reference_cell()
6016 .face_reference_cell(face)
6017 .n_isotropic_children(),
6020 for (
const auto line : cell->line_indices())
6021 if (cell->line(line)->has_children() ==
false)
6022 cell->line(line)->set_user_flag();
6024 Assert(cell->line(line)->n_children() == 2,
6028 const unsigned int used_cells =
6035 used_cells + new_cells,
6041 used_cells + new_cells,
6056 if (quad->user_flag_set() ==
false)
6061 needed_quads_pair += 4;
6062 needed_lines_pair += 4;
6063 needed_vertices += 1;
6067 needed_quads_pair += 4;
6068 needed_lines_single += 3;
6081 if (line->user_flag_set() ==
false)
6084 needed_lines_pair += 2;
6085 needed_vertices += 1;
6090 needed_lines_single);
6093 needed_quads_single);
6096 needed_quads_single);
6100 needed_vertices += std::count(
triangulation.vertices_used.begin(),
6121 for (
const auto &cell :
triangulation.active_cell_iterators())
6122 if (!cell->refine_flag_set())
6123 for (
unsigned int line_n = 0; line_n < cell->n_lines(); ++line_n)
6124 if (cell->line(line_n)->has_children())
6125 for (
unsigned int c = 0; c < 2; ++c)
6126 Assert(cell->line(line_n)->child(c)->user_flag_set() ==
false,
6130 unsigned int current_vertex = 0;
6134 auto get_next_unused_vertex = [](
const unsigned int current_vertex,
6135 std::vector<bool> &vertices_used) {
6136 unsigned int next_vertex = current_vertex;
6137 while (next_vertex < vertices_used.size() &&
6138 vertices_used[next_vertex] ==
true)
6141 vertices_used[next_vertex] =
true;
6151 raw_line_iterator next_unused_line =
triangulation.begin_raw_line();
6153 for (; line != endl; ++line)
6155 if (line->user_flag_set() ==
false)
6159 triangulation.faces->lines.template next_free_pair_object<1>(
6167 line->set_children(0, next_unused_line->index());
6169 const std::array<raw_line_iterator, 2> children{
6170 {next_unused_line, ++next_unused_line}};
6176 get_next_unused_vertex(current_vertex,
6178 triangulation.vertices[current_vertex] = line->center(
true);
6180 children[0]->set_bounding_object_indices(
6181 {line->vertex_index(0), current_vertex});
6182 children[1]->set_bounding_object_indices(
6183 {current_vertex, line->vertex_index(1)});
6185 const auto manifold_id = line->manifold_id();
6186 const auto boundary_id = line->boundary_id();
6187 for (
const auto &child : children)
6189 child->set_used_flag();
6190 child->clear_children();
6192 child->clear_user_flag();
6193 child->set_boundary_id_internal(boundary_id);
6194 child->set_manifold_id(manifold_id);
6197 line->clear_user_flag();
6207 for (; quad != endq; ++quad)
6209 if (quad->user_flag_set() ==
false)
6212 const auto reference_face_type = quad->reference_cell();
6216 std::array<raw_line_iterator, 4> new_lines;
6219 for (
unsigned int l = 0; l < 2; ++l)
6221 auto next_unused_line =
6224 new_lines[2 * l] = next_unused_line;
6225 new_lines[2 * l + 1] = ++next_unused_line;
6230 for (
unsigned int l = 0; l < 3; ++l)
6240 for (
const unsigned int line : quad->line_indices())
6248 std::array<raw_quad_iterator, 4> new_quads;
6249 for (
unsigned int q = 0; q < 2; ++q)
6251 auto next_unused_quad =
6255 new_quads[2 * q] = next_unused_quad;
6256 new_quads[2 * q + 1] = ++next_unused_quad;
6258 quad->set_children(2 * q, new_quads[2 * q]->
index());
6262 for (
const auto &quad : new_quads)
6274 for (
const auto i : quad->vertex_indices())
6277 for (
const auto i : quad->line_indices())
6283 get_next_unused_vertex(current_vertex,
6288 quad->center(
true,
true);
6292 std::array<raw_line_iterator, 12> lines;
6293 unsigned int n_lines = 0;
6294 for (
unsigned int l = 0; l < quad->
n_lines(); ++l)
6295 for (
unsigned int c = 0; c < 2; ++c)
6297 static constexpr ::ndarray<unsigned int, 2, 2>
index =
6304 quad->line(l)->child(
index[c][quad->line_orientation(l)]);
6307 for (
unsigned int l = 0; l < quad->
n_lines(); ++l)
6308 lines[n_lines++] = new_lines[l];
6310 std::array<int, 12> line_indices;
6311 for (
unsigned int i = 0; i < n_lines; ++i)
6312 line_indices[i] = lines[i]->
index();
6314 static constexpr ::ndarray<unsigned int, 12, 2>
6315 line_vertices_quad{{{{0, 4}},
6328 static constexpr ::ndarray<unsigned int, 4, 4>
6329 quad_lines_quad{{{{0, 8, 4, 10}},
6334 static constexpr ::ndarray<unsigned int, 12, 2>
6335 line_vertices_tri{{{{0, 3}},
6348 static constexpr ::ndarray<unsigned int, 4, 4>
6349 quad_lines_tri{{{{0, 8, 5, X}},
6354 static constexpr ::ndarray<unsigned int, 4, 4, 2>
6355 quad_line_vertices_tri{
6356 {{{{{0, 3}}, {{3, 5}}, {{5, 0}}, {{X, X}}}},
6357 {{{{3, 1}}, {{1, 4}}, {{4, 3}}, {{X, X}}}},
6358 {{{{5, 4}}, {{4, 2}}, {{2, 5}}, {{X, X}}}},
6359 {{{{3, 4}}, {{4, 5}}, {{5, 3}}, {{X, X}}}}}};
6361 const auto &line_vertices =
6363 line_vertices_quad :
6365 const auto &quad_lines =
6370 for (
unsigned int i = 0, j = 2 * quad->
n_lines();
6374 auto &new_line = new_lines[i];
6375 new_line->set_bounding_object_indices(
6378 new_line->set_used_flag();
6379 new_line->clear_user_flag();
6380 new_line->clear_user_data();
6381 new_line->clear_children();
6382 new_line->set_boundary_id_internal(quad->boundary_id());
6383 new_line->set_manifold_id(quad->manifold_id());
6387 for (
unsigned int i = 0; i < new_quads.size(); ++i)
6389 auto &new_quad = new_quads[i];
6394 reference_face_type);
6397 new_quad->set_bounding_object_indices(
6398 {line_indices[quad_lines[i][0]],
6399 line_indices[quad_lines[i][1]],
6400 line_indices[quad_lines[i][2]]});
6402 new_quad->set_bounding_object_indices(
6403 {line_indices[quad_lines[i][0]],
6404 line_indices[quad_lines[i][1]],
6405 line_indices[quad_lines[i][2]],
6406 line_indices[quad_lines[i][3]]});
6410 new_quad->set_used_flag();
6411 new_quad->clear_user_flag();
6412 new_quad->clear_user_data();
6413 new_quad->clear_children();
6414 new_quad->set_boundary_id_internal(quad->boundary_id());
6415 new_quad->set_manifold_id(quad->manifold_id());
6418 std::set<unsigned int> s;
6426 for (
const auto f : new_quad->line_indices())
6428 const std::array<unsigned int, 2> vertices_0 = {
6429 {lines[quad_lines[i][f]]->vertex_index(0),
6430 lines[quad_lines[i][f]]->vertex_index(1)}};
6432 const std::array<unsigned int, 2> vertices_1 = {
6436 const auto orientation =
6442 for (
const auto i : vertices_0)
6444 for (
const auto i : vertices_1)
6448 new_quad->set_line_orientation(
6452 default_combined_face_orientation());
6464 static constexpr ::ndarray<unsigned int, 4, 2>
6465 quad_child_boundary_lines{
6466 {{{0, 2}}, {{1, 3}}, {{0, 1}}, {{2, 3}}}};
6468 for (
unsigned int i = 0; i < 4; ++i)
6469 for (
unsigned int j = 0; j < 2; ++j)
6470 new_quads[quad_child_boundary_lines[i][j]]
6471 ->set_line_orientation(i, quad->line_orientation(i));
6474 quad->clear_user_flag();
6479 cells_with_distorted_children;
6489 hex->level() >=
static_cast<int>(
level),
6493 hex->level() ==
static_cast<int>(
level);
6496 if (hex->refine_flag_set() ==
6500 const auto &reference_cell_type = hex->reference_cell();
6503 hex->clear_refine_flag();
6504 hex->set_refinement_case(ref_case);
6506 unsigned int n_new_lines = 0;
6507 unsigned int n_new_quads = 0;
6508 unsigned int n_new_hexes = 0;
6525 std::array<raw_line_iterator, 6> new_lines;
6526 for (
unsigned int i = 0; i < n_new_lines; ++i)
6533 new_lines[i]->set_used_flag();
6534 new_lines[i]->clear_user_flag();
6535 new_lines[i]->clear_user_data();
6536 new_lines[i]->clear_children();
6537 new_lines[i]->set_boundary_id_internal(
6539 new_lines[i]->set_manifold_id(hex->manifold_id());
6542 std::array<raw_quad_iterator, 12> new_quads;
6543 for (
unsigned int i = 0; i < n_new_quads; ++i)
6549 auto &new_quad = new_quads[i];
6555 reference_cell_type.face_reference_cell(0));
6558 new_quad->set_used_flag();
6559 new_quad->clear_user_flag();
6560 new_quad->clear_user_data();
6561 new_quad->clear_children();
6562 new_quad->set_boundary_id_internal(
6564 new_quad->set_manifold_id(hex->manifold_id());
6565 for (
const auto j : new_quads[i]->line_indices())
6566 new_quad->set_line_orientation(j,
true);
6575 for (
unsigned int i = 0; i < n_new_hexes; ++i)
6584 new_hexes[i] = next_unused_hex;
6586 auto &new_hex = new_hexes[i];
6590 ->reference_cell[new_hex->index()] =
6591 reference_cell_type;
6594 new_hex->set_used_flag();
6595 new_hex->clear_user_flag();
6596 new_hex->clear_user_data();
6597 new_hex->clear_children();
6598 new_hex->set_material_id(hex->material_id());
6599 new_hex->set_manifold_id(hex->manifold_id());
6600 new_hex->set_subdomain_id(hex->subdomain_id());
6603 new_hex->set_parent(hex->index());
6608 for (
const auto f : new_hex->face_indices())
6609 new_hex->set_combined_face_orientation(
6613 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
6614 hex->set_children(2 * i, new_hexes[2 * i]->index());
6626 const unsigned int n_vertices =
6628 for (
unsigned int i = 0; i < n_vertices; ++i)
6631 const std::array<unsigned int, 12> line_indices =
6632 TriaAccessorImplementation::Implementation::
6633 get_line_indices_of_cell(*hex);
6645 for (
unsigned int l = 0; l < n_lines; ++l)
6655 for (
const unsigned int i : hex->face_indices())
6657 hex->face(i)->child(0)->vertex_index(3);
6661 get_next_unused_vertex(current_vertex,
6666 hex->center(
true,
true);
6670 unsigned int chosen_line_tetrahedron = 0;
6674 static constexpr ::ndarray<unsigned int, 6, 2>
6675 new_line_vertices = {{{{22, 26}},
6681 for (
unsigned int i = 0; i < n_new_lines; ++i)
6682 new_lines[i]->set_bounding_object_indices(
6692 static constexpr ::ndarray<unsigned int, 3, 2>
6693 new_line_vertices = {{{{6, 8}}, {{5, 7}}, {{4, 9}}}};
6697 std::uint8_t refinement_choice = hex->refine_choice();
6698 if (refinement_choice ==
6703 double min_distance =
6704 std::numeric_limits<double>::infinity();
6705 for (
unsigned int i = 0; i < new_line_vertices.size();
6708 const double current_distance =
6713 [new_line_vertices[i][1]]]);
6714 if (current_distance < min_distance)
6716 chosen_line_tetrahedron = i;
6717 min_distance = current_distance;
6721 else if (refinement_choice ==
6724 chosen_line_tetrahedron = 0;
6725 else if (refinement_choice ==
6728 chosen_line_tetrahedron = 1;
6729 else if (refinement_choice ==
6732 chosen_line_tetrahedron = 2;
6736 hex->set_refinement_case(
6739 new_lines[0]->set_bounding_object_indices(
6741 [new_line_vertices[chosen_line_tetrahedron][0]],
6743 [new_line_vertices[chosen_line_tetrahedron][1]]});
6748 boost::container::small_vector<raw_line_iterator, 30>
6753 relevant_lines.resize(30);
6754 for (
unsigned int f = 0, k = 0; f < 6; ++f)
6755 for (
unsigned int c = 0; c < 4; ++c, ++k)
6758 ndarray<unsigned int, 4, 2>
6760 {{{0, 1}}, {{3, 0}}, {{0, 3}}, {{3, 2}}}};
6766 standard_to_real_face_vertex(
6768 hex->face_orientation(f),
6770 hex->face_rotation(f)))
6772 standard_to_real_face_line(
6774 hex->face_orientation(f),
6776 hex->face_rotation(f)));
6779 for (
unsigned int i = 0, k = 24; i < 6; ++i, ++k)
6780 relevant_lines[k] = new_lines[i];
6795 relevant_lines.resize(13);
6798 for (
unsigned int f = 0; f < 4; ++f)
6799 for (
unsigned int l = 0; l < 3; ++l, ++k)
6803 array<std::array<unsigned int, 3>, 6>
6804 table = {{{{1, 0, 2}},
6811 const unsigned char combined_orientation =
6812 hex->combined_face_orientation(f);
6816 ->line(table[combined_orientation][l]);
6819 relevant_lines[k++] = new_lines[0];
6825 boost::container::small_vector<unsigned int, 30>
6826 relevant_line_indices(relevant_lines.size());
6827 for (
unsigned int i = 0; i < relevant_line_indices.size();
6829 relevant_line_indices[i] = relevant_lines[i]->
index();
6838 const auto &new_quad_lines =
6839 hex->reference_cell().new_isotropic_child_face_lines(
6840 chosen_line_tetrahedron);
6853 hex->reference_cell()
6854 .new_isotropic_child_face_line_vertices(
6855 chosen_line_tetrahedron);
6857 static constexpr ::ndarray<unsigned int, 4, 2>
6858 representative_lines{
6859 {{{0, 2}}, {{2, 0}}, {{3, 3}}, {{1, 1}}}};
6861 for (
unsigned int q = 0; q < n_new_quads; ++q)
6863 auto &new_quad = new_quads[q];
6865 if (new_quad->n_lines() == 3)
6866 new_quad->set_bounding_object_indices(
6867 {relevant_line_indices[new_quad_lines[q][0]],
6868 relevant_line_indices[new_quad_lines[q][1]],
6869 relevant_line_indices[new_quad_lines[q][2]]});
6870 else if (new_quad->n_lines() == 4)
6871 new_quad->set_bounding_object_indices(
6872 {relevant_line_indices[new_quad_lines[q][0]],
6873 relevant_line_indices[new_quad_lines[q][1]],
6874 relevant_line_indices[new_quad_lines[q][2]],
6875 relevant_line_indices[new_quad_lines[q][3]]});
6883 const unsigned int n_compute_lines =
6887 for (
unsigned int line = 0; line < n_compute_lines;
6890 const unsigned int l =
6891 (reference_cell_type ==
6893 representative_lines[q % 4][0] :
6896 const std::array<unsigned int, 2> vertices_0 = {
6897 {relevant_lines[new_quad_lines[q][l]]
6899 relevant_lines[new_quad_lines[q][l]]
6900 ->vertex_index(1)}};
6902 const std::array<unsigned int, 2> vertices_1 = {
6906 const auto orientation =
6911 new_quad->set_line_orientation(
6915 default_combined_face_orientation());
6920 if (reference_cell_type ==
6922 new_quads[representative_lines[q % 4][1] + q -
6924 ->set_line_orientation(
6928 default_combined_face_orientation());
6935 std::array<int, 36> quad_indices;
6939 for (
unsigned int i = 0; i < n_new_quads; ++i)
6940 quad_indices[i] = new_quads[i]->
index();
6942 for (
unsigned int f = 0, k = n_new_quads; f < 6; ++f)
6943 for (
unsigned int c = 0; c < 4; ++c, ++k)
6945 hex->face(f)->isotropic_child_index(
6948 hex->face_orientation(f),
6950 hex->face_rotation(f)));
6960 for (
unsigned int i = 0; i < n_new_quads; ++i)
6961 quad_indices[i] = new_quads[i]->
index();
6963 for (
unsigned int f = 0, k = n_new_quads; f < 4; ++f)
6964 for (
unsigned int c = 0; c < 4; ++c, ++k)
6966 const unsigned char combined_orientation =
6967 hex->combined_face_orientation(f);
6968 quad_indices[k] = hex->face(f)->child_index(
6971 .standard_to_real_face_vertex(
6972 c, f, combined_orientation));
6988 const auto &cell_quads =
6989 hex->reference_cell().new_isotropic_child_cell_faces(
6990 chosen_line_tetrahedron);
6992 for (
unsigned int c = 0;
6993 c < GeometryInfo<dim>::max_children_per_cell;
6996 auto &new_hex = new_hexes[c];
6998 if (new_hex->n_faces() == 4)
7000 new_hex->set_bounding_object_indices(
7001 {quad_indices[cell_quads[c][0]],
7002 quad_indices[cell_quads[c][1]],
7003 quad_indices[cell_quads[c][2]],
7004 quad_indices[cell_quads[c][3]]});
7009 for (
const auto f : new_hex->face_indices())
7011 const auto &face = new_hex->face(f);
7013 Assert(face->n_vertices() == 3,
7016 const std::array<unsigned int, 3> vertices_0 = {
7017 {face->vertex_index(0),
7018 face->vertex_index(1),
7019 face->vertex_index(2)}};
7028 const auto new_hex_vertices =
7029 hex->reference_cell()
7030 .new_isotropic_child_cell_vertices(
7031 chosen_line_tetrahedron)[c];
7035 const std::array<unsigned int, 3> vertices_1 = {
7051 new_hex->set_combined_face_orientation(
7053 face->reference_cell()
7054 .get_combined_orientation(
7059 else if (new_hex->n_faces() == 6)
7060 new_hex->set_bounding_object_indices(
7061 {quad_indices[cell_quads[c][0]],
7062 quad_indices[cell_quads[c][1]],
7063 quad_indices[cell_quads[c][2]],
7064 quad_indices[cell_quads[c][3]],
7065 quad_indices[cell_quads[c][4]],
7066 quad_indices[cell_quads[c][5]]});
7075 static constexpr ::ndarray<unsigned int, 6, 4>
7076 face_to_child_indices_hex{{{{0, 2, 4, 6}},
7083 for (
const auto f : hex->face_indices())
7085 const unsigned char combined_orientation =
7086 hex->combined_face_orientation(f);
7087 for (
unsigned int c = 0; c < 4; ++c)
7088 new_hexes[face_to_child_indices_hex[f][c]]
7089 ->set_combined_face_orientation(
7090 f, combined_orientation);
7095 if (check_for_distorted_cells &&
7096 has_distorted_children<dim, spacedim>(hex))
7105 return cells_with_distorted_children;
7115 const bool check_for_distorted_cells)
7117 const unsigned int dim = 3;
7120 bool flag_isotropic_mesh =
true;
7124 for (; cell != endc; ++cell)
7134 flag_isotropic_mesh =
false;
7138 if (flag_isotropic_mesh)
7140 check_for_distorted_cells);
7151 for (
const auto &cell :
triangulation.active_cell_iterators_on_level(
7153 if (cell->refine_flag_set())
7170 line->clear_user_flag();
7175 quad->clear_user_flag();
7198 unsigned int needed_vertices = 0;
7199 unsigned int needed_lines_single = 0;
7200 unsigned int needed_quads_single = 0;
7201 unsigned int needed_lines_pair = 0;
7202 unsigned int needed_quads_pair = 0;
7207 unsigned int new_cells = 0;
7209 for (
const auto &acell :
7211 if (acell->refine_flag_set())
7221 ++needed_quads_single;
7229 ++needed_lines_single;
7230 needed_quads_single += 4;
7237 needed_lines_single += 6;
7238 needed_quads_single += 12;
7252 for (
const unsigned int face :
7256 aface = acell->face(face);
7263 acell->face_orientation(face),
7264 acell->face_flip(face),
7265 acell->face_rotation(face));
7270 if (face_ref_case ==
7273 if (aface->n_active_descendants() < 4)
7276 aface->set_user_flag();
7278 else if (aface->refinement_case() != face_ref_case)
7289 Assert(aface->refinement_case() ==
7292 aface->refinement_case() ==
7295 aface->set_user_index(face_ref_case);
7301 for (
unsigned int line = 0;
7302 line < GeometryInfo<dim>::lines_per_cell;
7306 !acell->line(line)->has_children())
7307 acell->line(line)->set_user_flag();
7313 const unsigned int used_cells =
7323 used_cells + new_cells,
7337 if (quad->user_flag_set())
7343 needed_quads_pair += 4;
7344 needed_lines_pair += 4;
7345 needed_vertices += 1;
7347 if (quad->user_index())
7351 needed_quads_pair += 2;
7352 needed_lines_single += 1;
7365 if (quad->has_children())
7367 Assert(quad->refinement_case() ==
7370 if ((face_refinement_cases[quad->user_index()] ==
7372 (quad->child(0)->line_index(1) + 1 !=
7373 quad->child(2)->line_index(1))) ||
7374 (face_refinement_cases[quad->user_index()] ==
7376 (quad->child(0)->line_index(3) + 1 !=
7377 quad->child(1)->line_index(3))))
7378 needed_lines_pair += 2;
7387 if (line->user_flag_set())
7389 needed_lines_pair += 2;
7390 needed_vertices += 1;
7396 needed_lines_single);
7400 needed_quads_single);
7403 needed_quads_single);
7407 needed_vertices += std::count(
triangulation.vertices_used.begin(),
7431 for (
const auto &cell :
triangulation.active_cell_iterators())
7432 if (!cell->refine_flag_set())
7433 for (
unsigned int line = 0;
7434 line < GeometryInfo<dim>::lines_per_cell;
7436 if (cell->line(line)->has_children())
7437 for (
unsigned int c = 0; c < 2; ++c)
7438 Assert(cell->line(line)->child(c)->user_flag_set() ==
false,
7450 unsigned int next_unused_vertex = 0;
7461 for (; line != endl; ++line)
7462 if (line->user_flag_set())
7468 while (
triangulation.vertices_used[next_unused_vertex] ==
true)
7469 ++next_unused_vertex;
7473 "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."));
7476 triangulation.vertices[next_unused_vertex] = line->center(
true);
7490 line->set_children(0, next_unused_line->index());
7494 children[2] = {next_unused_line, ++next_unused_line};
7501 children[0]->set_bounding_object_indices(
7502 {line->vertex_index(0), next_unused_vertex});
7503 children[1]->set_bounding_object_indices(
7504 {next_unused_vertex, line->vertex_index(1)});
7506 children[0]->set_used_flag();
7507 children[1]->set_used_flag();
7508 children[0]->clear_children();
7509 children[1]->clear_children();
7512 children[0]->clear_user_flag();
7513 children[1]->clear_user_flag();
7515 children[0]->set_boundary_id_internal(line->boundary_id());
7516 children[1]->set_boundary_id_internal(line->boundary_id());
7518 children[0]->set_manifold_id(line->manifold_id());
7519 children[1]->set_manifold_id(line->manifold_id());
7524 line->clear_user_flag();
7554 for (
unsigned int loop = 0; loop < 2; ++loop)
7567 for (; quad != endq; ++quad)
7569 if (quad->user_index())
7572 face_refinement_cases[quad->user_index()];
7581 if (aniso_quad_ref_case == quad->refinement_case())
7584 Assert(quad->refinement_case() ==
7586 quad->refinement_case() ==
7591 Assert(quad->user_index() ==
7593 quad->user_index() ==
7623 quad->line(2)->child(0)->vertex_index(1);
7625 quad->line(3)->child(0)->vertex_index(1);
7630 quad->line(0)->child(0)->vertex_index(1);
7632 quad->line(1)->child(0)->vertex_index(1);
7635 new_line->set_bounding_object_indices(
7637 new_line->set_used_flag();
7638 new_line->clear_user_flag();
7640 new_line->clear_children();
7641 new_line->set_boundary_id_internal(quad->boundary_id());
7642 new_line->set_manifold_id(quad->manifold_id());
7650 const unsigned int index[2][2] = {
7662 new_quads[0] = next_unused_quad;
7666 new_quads[1] = next_unused_quad;
7671 new_quads[0]->set_bounding_object_indices(
7672 {
static_cast<int>(quad->line_index(0)),
7675 ->child(
index[0][quad->line_orientation(2)])
7678 ->child(
index[0][quad->line_orientation(3)])
7680 new_quads[1]->set_bounding_object_indices(
7682 static_cast<int>(quad->line_index(1)),
7684 ->child(
index[1][quad->line_orientation(2)])
7687 ->child(
index[1][quad->line_orientation(3)])
7692 new_quads[0]->set_bounding_object_indices(
7694 ->child(
index[0][quad->line_orientation(0)])
7697 ->child(
index[0][quad->line_orientation(1)])
7699 static_cast<int>(quad->line_index(2)),
7700 new_line->index()});
7701 new_quads[1]->set_bounding_object_indices(
7703 ->child(
index[1][quad->line_orientation(0)])
7706 ->child(
index[1][quad->line_orientation(1)])
7709 static_cast<int>(quad->line_index(3))});
7712 for (
const auto &new_quad : new_quads)
7714 new_quad->set_used_flag();
7715 new_quad->clear_user_flag();
7717 new_quad->clear_children();
7718 new_quad->set_boundary_id_internal(quad->boundary_id());
7719 new_quad->set_manifold_id(quad->manifold_id());
7723 for (
unsigned int j = 0;
7724 j < GeometryInfo<dim>::lines_per_face;
7726 new_quad->set_line_orientation(j,
true);
7732 new_quads[0]->set_line_orientation(
7733 0, quad->line_orientation(0));
7734 new_quads[0]->set_line_orientation(
7735 2, quad->line_orientation(2));
7736 new_quads[1]->set_line_orientation(
7737 1, quad->line_orientation(1));
7738 new_quads[1]->set_line_orientation(
7739 3, quad->line_orientation(3));
7742 new_quads[0]->set_line_orientation(
7743 3, quad->line_orientation(3));
7744 new_quads[1]->set_line_orientation(
7745 2, quad->line_orientation(2));
7749 new_quads[0]->set_line_orientation(
7750 1, quad->line_orientation(1));
7751 new_quads[1]->set_line_orientation(
7752 0, quad->line_orientation(0));
7758 if (quad->refinement_case() ==
7781 if (aniso_quad_ref_case ==
7784 old_child[0] = quad->child(0)->line(1);
7785 old_child[1] = quad->child(2)->line(1);
7789 Assert(aniso_quad_ref_case ==
7793 old_child[0] = quad->child(0)->line(3);
7794 old_child[1] = quad->child(1)->line(3);
7797 if (old_child[0]->
index() + 1 != old_child[1]->
index())
7803 spacedim>::raw_line_iterator
7806 new_child[0] = new_child[1] =
7808 .template next_free_pair_object<1>(
7812 new_child[0]->set_used_flag();
7813 new_child[1]->set_used_flag();
7815 const int old_index_0 = old_child[0]->index(),
7816 old_index_1 = old_child[1]->index(),
7817 new_index_0 = new_child[0]->index(),
7818 new_index_1 = new_child[1]->index();
7822 for (
unsigned int q = 0;
7825 for (
unsigned int l = 0;
7826 l < GeometryInfo<dim>::lines_per_face;
7829 const int this_index =
7831 .get_bounding_object_indices(q)[l];
7832 if (this_index == old_index_0)
7834 .get_bounding_object_indices(q)[l] =
7836 else if (this_index == old_index_1)
7838 .get_bounding_object_indices(q)[l] =
7843 for (
unsigned int i = 0; i < 2; ++i)
7845 Assert(!old_child[i]->has_children(),
7848 new_child[i]->set_bounding_object_indices(
7849 {old_child[i]->vertex_index(0),
7850 old_child[i]->vertex_index(1)});
7851 new_child[i]->set_boundary_id_internal(
7852 old_child[i]->boundary_id());
7853 new_child[i]->set_manifold_id(
7854 old_child[i]->manifold_id());
7855 new_child[i]->set_user_index(
7856 old_child[i]->user_index());
7857 if (old_child[i]->user_flag_set())
7858 new_child[i]->set_user_flag();
7860 new_child[i]->clear_user_flag();
7862 new_child[i]->clear_children();
7864 old_child[i]->clear_user_flag();
7865 old_child[i]->clear_user_index();
7866 old_child[i]->clear_used_flag();
7872 if (aniso_quad_ref_case ==
7875 new_line->set_children(
7876 0, quad->child(0)->line_index(1));
7877 Assert(new_line->child(1) ==
7878 quad->child(2)->line(1),
7915 quad_iterator switch_1 = quad->child(1),
7916 switch_2 = quad->child(2);
7917 const int switch_1_index = switch_1->index();
7918 const int switch_2_index = switch_2->index();
7919 for (
unsigned int l = 0;
7922 for (
unsigned int h = 0;
7926 for (
const unsigned int q :
7929 const int face_index =
7931 ->cells.get_bounding_object_indices(
7933 if (face_index == switch_1_index)
7935 ->cells.get_bounding_object_indices(
7936 h)[q] = switch_2_index;
7937 else if (face_index == switch_2_index)
7939 ->cells.get_bounding_object_indices(
7940 h)[q] = switch_1_index;
7944 const unsigned int switch_1_lines[4] = {
7945 switch_1->line_index(0),
7946 switch_1->line_index(1),
7947 switch_1->line_index(2),
7948 switch_1->line_index(3)};
7949 const bool switch_1_line_orientations[4] = {
7950 switch_1->line_orientation(0),
7951 switch_1->line_orientation(1),
7952 switch_1->line_orientation(2),
7953 switch_1->line_orientation(3)};
7955 switch_1->boundary_id();
7956 const unsigned int switch_1_user_index =
7957 switch_1->user_index();
7958 const bool switch_1_user_flag =
7959 switch_1->user_flag_set();
7961 switch_1_refinement_case =
7962 switch_1->refinement_case();
7963 const int switch_1_first_child_pair =
7964 (switch_1_refinement_case ?
7965 switch_1->child_index(0) :
7967 const int switch_1_second_child_pair =
7968 (switch_1_refinement_case ==
7970 switch_1->child_index(2) :
7973 switch_1->set_bounding_object_indices(
7974 {switch_2->line_index(0),
7975 switch_2->line_index(1),
7976 switch_2->line_index(2),
7977 switch_2->line_index(3)});
7978 switch_1->set_line_orientation(
7979 0, switch_2->line_orientation(0));
7980 switch_1->set_line_orientation(
7981 1, switch_2->line_orientation(1));
7982 switch_1->set_line_orientation(
7983 2, switch_2->line_orientation(2));
7984 switch_1->set_line_orientation(
7985 3, switch_2->line_orientation(3));
7986 switch_1->set_boundary_id_internal(
7987 switch_2->boundary_id());
7988 switch_1->set_manifold_id(switch_2->manifold_id());
7989 switch_1->set_user_index(switch_2->user_index());
7990 if (switch_2->user_flag_set())
7991 switch_1->set_user_flag();
7993 switch_1->clear_user_flag();
7994 switch_1->clear_refinement_case();
7995 switch_1->set_refinement_case(
7996 switch_2->refinement_case());
7997 switch_1->clear_children();
7998 if (switch_2->refinement_case())
7999 switch_1->set_children(0,
8000 switch_2->child_index(0));
8001 if (switch_2->refinement_case() ==
8003 switch_1->set_children(2,
8004 switch_2->child_index(2));
8006 switch_2->set_bounding_object_indices(
8010 switch_1_lines[3]});
8011 switch_2->set_line_orientation(
8012 0, switch_1_line_orientations[0]);
8013 switch_2->set_line_orientation(
8014 1, switch_1_line_orientations[1]);
8015 switch_2->set_line_orientation(
8016 2, switch_1_line_orientations[2]);
8017 switch_2->set_line_orientation(
8018 3, switch_1_line_orientations[3]);
8019 switch_2->set_boundary_id_internal(
8020 switch_1_boundary_id);
8021 switch_2->set_manifold_id(switch_1->manifold_id());
8022 switch_2->set_user_index(switch_1_user_index);
8023 if (switch_1_user_flag)
8024 switch_2->set_user_flag();
8026 switch_2->clear_user_flag();
8027 switch_2->clear_refinement_case();
8028 switch_2->set_refinement_case(
8029 switch_1_refinement_case);
8030 switch_2->clear_children();
8031 switch_2->set_children(0,
8032 switch_1_first_child_pair);
8033 switch_2->set_children(2,
8034 switch_1_second_child_pair);
8036 new_quads[0]->set_refinement_case(
8038 new_quads[0]->set_children(0, quad->child_index(0));
8039 new_quads[1]->set_refinement_case(
8041 new_quads[1]->set_children(0, quad->child_index(2));
8045 new_quads[0]->set_refinement_case(
8047 new_quads[0]->set_children(0, quad->child_index(0));
8048 new_quads[1]->set_refinement_case(
8050 new_quads[1]->set_children(0, quad->child_index(2));
8051 new_line->set_children(
8052 0, quad->child(0)->line_index(3));
8053 Assert(new_line->child(1) ==
8054 quad->child(1)->line(3),
8057 quad->clear_children();
8061 quad->set_children(0, new_quads[0]->
index());
8063 quad->set_refinement_case(aniso_quad_ref_case);
8070 if (quad->user_flag_set())
8082 ++next_unused_vertex;
8086 "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."));
8094 quad->refinement_case();
8100 quad->child(0)->set_user_index(
8102 quad->child(1)->set_user_index(
8108 middle_line = quad->child(0)->line(1);
8110 middle_line = quad->child(0)->line(3);
8117 if (!middle_line->has_children())
8125 middle_line->center(
true);
8133 .template next_free_pair_object<1>(
8138 middle_line->set_children(
8139 0, next_unused_line->index());
8143 raw_line_iterator children[2] = {
8144 next_unused_line, ++next_unused_line};
8152 children[0]->set_bounding_object_indices(
8153 {middle_line->vertex_index(0),
8154 next_unused_vertex});
8155 children[1]->set_bounding_object_indices(
8156 {next_unused_vertex,
8157 middle_line->vertex_index(1)});
8159 children[0]->set_used_flag();
8160 children[1]->set_used_flag();
8161 children[0]->clear_children();
8162 children[1]->clear_children();
8165 children[0]->clear_user_flag();
8166 children[1]->clear_user_flag();
8168 children[0]->set_boundary_id_internal(
8169 middle_line->boundary_id());
8170 children[1]->set_boundary_id_internal(
8171 middle_line->boundary_id());
8173 children[0]->set_manifold_id(
8174 middle_line->manifold_id());
8175 children[1]->set_manifold_id(
8176 middle_line->manifold_id());
8182 quad->clear_user_flag();
8212 quad->center(
true,
true);
8221 for (
unsigned int i = 0; i < 4; ++i)
8234 new_lines[i] = next_unused_line;
8258 quad->line(0)->child(0)->vertex_index(1),
8259 quad->line(1)->child(0)->vertex_index(1),
8260 quad->line(2)->child(0)->vertex_index(1),
8261 quad->line(3)->child(0)->vertex_index(1),
8262 next_unused_vertex};
8264 new_lines[0]->set_bounding_object_indices(
8266 new_lines[1]->set_bounding_object_indices(
8268 new_lines[2]->set_bounding_object_indices(
8270 new_lines[3]->set_bounding_object_indices(
8273 for (
const auto &new_line : new_lines)
8275 new_line->set_used_flag();
8276 new_line->clear_user_flag();
8278 new_line->clear_children();
8279 new_line->set_boundary_id_internal(quad->boundary_id());
8280 new_line->set_manifold_id(quad->manifold_id());
8299 const unsigned int index[2][2] = {
8303 const int line_indices[12] = {
8305 ->child(
index[0][quad->line_orientation(0)])
8308 ->child(
index[1][quad->line_orientation(0)])
8311 ->child(
index[0][quad->line_orientation(1)])
8314 ->child(
index[1][quad->line_orientation(1)])
8317 ->child(
index[0][quad->line_orientation(2)])
8320 ->child(
index[1][quad->line_orientation(2)])
8323 ->child(
index[0][quad->line_orientation(3)])
8326 ->child(
index[1][quad->line_orientation(3)])
8328 new_lines[0]->index(),
8329 new_lines[1]->index(),
8330 new_lines[2]->index(),
8331 new_lines[3]->index()};
8343 new_quads[0] = next_unused_quad;
8347 new_quads[1] = next_unused_quad;
8353 new_quads[2] = next_unused_quad;
8357 new_quads[3] = next_unused_quad;
8361 quad->set_children(0, new_quads[0]->
index());
8362 quad->set_children(2, new_quads[2]->
index());
8365 new_quads[0]->set_bounding_object_indices(
8370 new_quads[1]->set_bounding_object_indices(
8375 new_quads[2]->set_bounding_object_indices(
8380 new_quads[3]->set_bounding_object_indices(
8385 for (
const auto &new_quad : new_quads)
8387 new_quad->set_used_flag();
8388 new_quad->clear_user_flag();
8390 new_quad->clear_children();
8391 new_quad->set_boundary_id_internal(quad->boundary_id());
8392 new_quad->set_manifold_id(quad->manifold_id());
8396 for (
unsigned int j = 0;
8397 j < GeometryInfo<dim>::lines_per_face;
8399 new_quad->set_line_orientation(j,
true);
8405 new_quads[0]->set_line_orientation(
8406 0, quad->line_orientation(0));
8407 new_quads[0]->set_line_orientation(
8408 2, quad->line_orientation(2));
8409 new_quads[1]->set_line_orientation(
8410 1, quad->line_orientation(1));
8411 new_quads[1]->set_line_orientation(
8412 2, quad->line_orientation(2));
8413 new_quads[2]->set_line_orientation(
8414 0, quad->line_orientation(0));
8415 new_quads[2]->set_line_orientation(
8416 3, quad->line_orientation(3));
8417 new_quads[3]->set_line_orientation(
8418 1, quad->line_orientation(1));
8419 new_quads[3]->set_line_orientation(
8420 3, quad->line_orientation(3));
8424 quad->clear_user_flag();
8435 cells_with_distorted_children;
8449 for (; hex != endh; ++hex)
8450 if (hex->refine_flag_set())
8458 hex->clear_refine_flag();
8459 hex->set_refinement_case(ref_case);
8470 unsigned int n_new_lines = 0;
8471 unsigned int n_new_quads = 0;
8472 unsigned int n_new_hexes = 0;
8503 new_lines(n_new_lines);
8504 for (
unsigned int i = 0; i < n_new_lines; ++i)
8511 new_lines[i]->set_used_flag();
8512 new_lines[i]->clear_user_flag();
8513 new_lines[i]->clear_user_data();
8514 new_lines[i]->clear_children();
8516 new_lines[i]->set_boundary_id_internal(
8520 new_lines[i]->set_manifold_id(hex->manifold_id());
8527 new_quads(n_new_quads);
8528 for (
unsigned int i = 0; i < n_new_quads; ++i)
8535 new_quads[i]->set_used_flag();
8536 new_quads[i]->clear_user_flag();
8537 new_quads[i]->clear_user_data();
8538 new_quads[i]->clear_children();
8540 new_quads[i]->set_boundary_id_internal(
8544 new_quads[i]->set_manifold_id(hex->manifold_id());
8547 for (
unsigned int j = 0;
8548 j < GeometryInfo<dim>::lines_per_face;
8550 new_quads[i]->set_line_orientation(j,
true);
8559 new_hexes(n_new_hexes);
8560 for (
unsigned int i = 0; i < n_new_hexes; ++i)
8569 new_hexes[i] = next_unused_hex;
8572 new_hexes[i]->set_used_flag();
8573 new_hexes[i]->clear_user_flag();
8574 new_hexes[i]->clear_user_data();
8575 new_hexes[i]->clear_children();
8578 new_hexes[i]->set_material_id(hex->material_id());
8579 new_hexes[i]->set_manifold_id(hex->manifold_id());
8580 new_hexes[i]->set_subdomain_id(subdomainid);
8583 new_hexes[i]->set_parent(hex->index());
8595 for (
const unsigned int f :
8597 new_hexes[i]->set_combined_face_orientation(
8602 for (
unsigned int i = 0; i < n_new_hexes / 2; ++i)
8603 hex->set_children(2 * i, new_hexes[2 * i]->index());
8610 const bool f_or[6] = {hex->face_orientation(0),
8611 hex->face_orientation(1),
8612 hex->face_orientation(2),
8613 hex->face_orientation(3),
8614 hex->face_orientation(4),
8615 hex->face_orientation(5)};
8618 const bool f_fl[6] = {hex->face_flip(0),
8626 const bool f_ro[6] = {hex->face_rotation(0),
8627 hex->face_rotation(1),
8628 hex->face_rotation(2),
8629 hex->face_rotation(3),
8630 hex->face_rotation(4),
8631 hex->face_rotation(5)};
8634 const unsigned char f_co[6] = {
8635 hex->combined_face_orientation(0),
8636 hex->combined_face_orientation(1),
8637 hex->combined_face_orientation(2),
8638 hex->combined_face_orientation(3),
8639 hex->combined_face_orientation(4),
8640 hex->combined_face_orientation(5)};
8650 const unsigned int child_at_origin[2][2][2] = {
8737 raw_line_iterator lines[4] = {
8738 hex->face(2)->child(0)->line(
8739 (hex->face(2)->refinement_case() ==
8743 hex->face(3)->child(0)->line(
8744 (hex->face(3)->refinement_case() ==
8748 hex->face(4)->child(0)->line(
8749 (hex->face(4)->refinement_case() ==
8753 hex->face(5)->child(0)->line(
8754 (hex->face(5)->refinement_case() ==
8760 unsigned int line_indices[4];
8761 for (
unsigned int i = 0; i < 4; ++i)
8762 line_indices[i] = lines[i]->
index();
8769 bool line_orientation[4];
8775 const unsigned int middle_vertices[2] = {
8776 hex->line(2)->child(0)->vertex_index(1),
8777 hex->line(7)->child(0)->vertex_index(1)};
8779 for (
unsigned int i = 0; i < 4; ++i)
8780 if (lines[i]->vertex_index(i % 2) ==
8781 middle_vertices[i % 2])
8782 line_orientation[i] =
true;
8787 Assert(lines[i]->vertex_index((i + 1) % 2) ==
8788 middle_vertices[i % 2],
8790 line_orientation[i] =
false;
8795 new_quads[0]->set_bounding_object_indices(
8801 new_quads[0]->set_line_orientation(
8802 0, line_orientation[0]);
8803 new_quads[0]->set_line_orientation(
8804 1, line_orientation[1]);
8805 new_quads[0]->set_line_orientation(
8806 2, line_orientation[2]);
8807 new_quads[0]->set_line_orientation(
8808 3, line_orientation[3]);
8841 const int quad_indices[11] = {
8842 new_quads[0]->index(),
8844 hex->face(0)->index(),
8846 hex->face(1)->index(),
8848 hex->face(2)->child_index(
8849 child_at_origin[hex->face(2)->refinement_case() -
8850 1][f_fl[2]][f_ro[2]]),
8851 hex->face(2)->child_index(
8853 child_at_origin[hex->face(2)->refinement_case() -
8854 1][f_fl[2]][f_ro[2]]),
8856 hex->face(3)->child_index(
8857 child_at_origin[hex->face(3)->refinement_case() -
8858 1][f_fl[3]][f_ro[3]]),
8859 hex->face(3)->child_index(
8861 child_at_origin[hex->face(3)->refinement_case() -
8862 1][f_fl[3]][f_ro[3]]),
8864 hex->face(4)->child_index(
8865 child_at_origin[hex->face(4)->refinement_case() -
8866 1][f_fl[4]][f_ro[4]]),
8867 hex->face(4)->child_index(
8869 child_at_origin[hex->face(4)->refinement_case() -
8870 1][f_fl[4]][f_ro[4]]),
8872 hex->face(5)->child_index(
8873 child_at_origin[hex->face(5)->refinement_case() -
8874 1][f_fl[5]][f_ro[5]]),
8875 hex->face(5)->child_index(
8877 child_at_origin[hex->face(5)->refinement_case() -
8878 1][f_fl[5]][f_ro[5]])
8882 new_hexes[0]->set_bounding_object_indices(
8889 new_hexes[1]->set_bounding_object_indices(
8964 raw_line_iterator lines[4] = {
8965 hex->face(0)->child(0)->line(
8966 (hex->face(0)->refinement_case() ==
8970 hex->face(1)->child(0)->line(
8971 (hex->face(1)->refinement_case() ==
8975 hex->face(4)->child(0)->line(
8976 (hex->face(4)->refinement_case() ==
8980 hex->face(5)->child(0)->line(
8981 (hex->face(5)->refinement_case() ==
8987 unsigned int line_indices[4];
8988 for (
unsigned int i = 0; i < 4; ++i)
8989 line_indices[i] = lines[i]->
index();
8996 bool line_orientation[4];
9002 const unsigned int middle_vertices[2] = {
9003 hex->line(0)->child(0)->vertex_index(1),
9004 hex->line(5)->child(0)->vertex_index(1)};
9006 for (
unsigned int i = 0; i < 4; ++i)
9007 if (lines[i]->vertex_index(i % 2) ==
9008 middle_vertices[i % 2])
9009 line_orientation[i] =
true;
9013 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9014 middle_vertices[i % 2],
9016 line_orientation[i] =
false;
9021 new_quads[0]->set_bounding_object_indices(
9027 new_quads[0]->set_line_orientation(
9028 0, line_orientation[2]);
9029 new_quads[0]->set_line_orientation(
9030 1, line_orientation[3]);
9031 new_quads[0]->set_line_orientation(
9032 2, line_orientation[0]);
9033 new_quads[0]->set_line_orientation(
9034 3, line_orientation[1]);
9067 const int quad_indices[11] = {
9068 new_quads[0]->index(),
9070 hex->face(0)->child_index(
9071 child_at_origin[hex->face(0)->refinement_case() -
9072 1][f_fl[0]][f_ro[0]]),
9073 hex->face(0)->child_index(
9075 child_at_origin[hex->face(0)->refinement_case() -
9076 1][f_fl[0]][f_ro[0]]),
9078 hex->face(1)->child_index(
9079 child_at_origin[hex->face(1)->refinement_case() -
9080 1][f_fl[1]][f_ro[1]]),
9081 hex->face(1)->child_index(
9083 child_at_origin[hex->face(1)->refinement_case() -
9084 1][f_fl[1]][f_ro[1]]),
9086 hex->face(2)->index(),
9088 hex->face(3)->index(),
9090 hex->face(4)->child_index(
9091 child_at_origin[hex->face(4)->refinement_case() -
9092 1][f_fl[4]][f_ro[4]]),
9093 hex->face(4)->child_index(
9095 child_at_origin[hex->face(4)->refinement_case() -
9096 1][f_fl[4]][f_ro[4]]),
9098 hex->face(5)->child_index(
9099 child_at_origin[hex->face(5)->refinement_case() -
9100 1][f_fl[5]][f_ro[5]]),
9101 hex->face(5)->child_index(
9103 child_at_origin[hex->face(5)->refinement_case() -
9104 1][f_fl[5]][f_ro[5]])
9108 new_hexes[0]->set_bounding_object_indices(
9115 new_hexes[1]->set_bounding_object_indices(
9192 raw_line_iterator lines[4] = {
9193 hex->face(0)->child(0)->line(
9194 (hex->face(0)->refinement_case() ==
9198 hex->face(1)->child(0)->line(
9199 (hex->face(1)->refinement_case() ==
9203 hex->face(2)->child(0)->line(
9204 (hex->face(2)->refinement_case() ==
9208 hex->face(3)->child(0)->line(
9209 (hex->face(3)->refinement_case() ==
9215 unsigned int line_indices[4];
9216 for (
unsigned int i = 0; i < 4; ++i)
9217 line_indices[i] = lines[i]->
index();
9224 bool line_orientation[4];
9230 const unsigned int middle_vertices[2] = {
9231 middle_vertex_index<dim, spacedim>(hex->line(8)),
9232 middle_vertex_index<dim, spacedim>(hex->line(11))};
9234 for (
unsigned int i = 0; i < 4; ++i)
9235 if (lines[i]->vertex_index(i % 2) ==
9236 middle_vertices[i % 2])
9237 line_orientation[i] =
true;
9241 Assert(lines[i]->vertex_index((i + 1) % 2) ==
9242 middle_vertices[i % 2],
9244 line_orientation[i] =
false;
9249 new_quads[0]->set_bounding_object_indices(
9255 new_quads[0]->set_line_orientation(
9256 0, line_orientation[0]);
9257 new_quads[0]->set_line_orientation(
9258 1, line_orientation[1]);
9259 new_quads[0]->set_line_orientation(
9260 2, line_orientation[2]);
9261 new_quads[0]->set_line_orientation(
9262 3, line_orientation[3]);
9296 const int quad_indices[11] = {
9297 new_quads[0]->index(),
9299 hex->face(0)->child_index(
9300 child_at_origin[hex->face(0)->refinement_case() -
9301 1][f_fl[0]][f_ro[0]]),
9302 hex->face(0)->child_index(
9304 child_at_origin[hex->face(0)->refinement_case() -
9305 1][f_fl[0]][f_ro[0]]),
9307 hex->face(1)->child_index(
9308 child_at_origin[hex->face(1)->refinement_case() -
9309 1][f_fl[1]][f_ro[1]]),
9310 hex->face(1)->child_index(
9312 child_at_origin[hex->face(1)->refinement_case() -
9313 1][f_fl[1]][f_ro[1]]),
9315 hex->face(2)->child_index(
9316 child_at_origin[hex->face(2)->refinement_case() -
9317 1][f_fl[2]][f_ro[2]]),
9318 hex->face(2)->child_index(
9320 child_at_origin[hex->face(2)->refinement_case() -
9321 1][f_fl[2]][f_ro[2]]),
9323 hex->face(3)->child_index(
9324 child_at_origin[hex->face(3)->refinement_case() -
9325 1][f_fl[3]][f_ro[3]]),
9326 hex->face(3)->child_index(
9328 child_at_origin[hex->face(3)->refinement_case() -
9329 1][f_fl[3]][f_ro[3]]),
9331 hex->face(4)->index(),
9333 hex->face(5)->index()
9336 new_hexes[0]->set_bounding_object_indices(
9343 new_hexes[1]->set_bounding_object_indices(
9375 new_lines[0]->set_bounding_object_indices(
9376 {middle_vertex_index<dim, spacedim>(hex->face(4)),
9377 middle_vertex_index<dim, spacedim>(hex->face(5))});
9445 spacedim>::raw_line_iterator lines[13] = {
9446 hex->face(0)->child(0)->line(
9447 (hex->face(0)->refinement_case() ==
9451 hex->face(1)->child(0)->line(
9452 (hex->face(1)->refinement_case() ==
9456 hex->face(2)->child(0)->line(
9457 (hex->face(2)->refinement_case() ==
9461 hex->face(3)->child(0)->line(
9462 (hex->face(3)->refinement_case() ==
9470 0, f_or[4], f_fl[4], f_ro[4]))
9473 1, f_or[4], f_fl[4], f_ro[4])),
9477 3, f_or[4], f_fl[4], f_ro[4]))
9480 0, f_or[4], f_fl[4], f_ro[4])),
9484 0, f_or[4], f_fl[4], f_ro[4]))
9487 3, f_or[4], f_fl[4], f_ro[4])),
9491 3, f_or[4], f_fl[4], f_ro[4]))
9494 2, f_or[4], f_fl[4], f_ro[4])),
9499 0, f_or[5], f_fl[5], f_ro[5]))
9502 1, f_or[5], f_fl[5], f_ro[5])),
9506 3, f_or[5], f_fl[5], f_ro[5]))
9509 0, f_or[5], f_fl[5], f_ro[5])),
9513 0, f_or[5], f_fl[5], f_ro[5]))
9516 3, f_or[5], f_fl[5], f_ro[5])),
9520 3, f_or[5], f_fl[5], f_ro[5]))
9523 2, f_or[5], f_fl[5], f_ro[5])),
9528 unsigned int line_indices[13];
9529 for (
unsigned int i = 0; i < 13; ++i)
9530 line_indices[i] = lines[i]->
index();
9537 bool line_orientation[13];
9541 const unsigned int middle_vertices[4] = {
9542 hex->line(0)->child(0)->vertex_index(1),
9543 hex->line(1)->child(0)->vertex_index(1),
9544 hex->line(2)->child(0)->vertex_index(1),
9545 hex->line(3)->child(0)->vertex_index(1),
9551 for (
unsigned int i = 0; i < 4; ++i)
9552 if (lines[i]->vertex_index(0) == middle_vertices[i])
9553 line_orientation[i] =
true;
9557 Assert(lines[i]->vertex_index(1) ==
9560 line_orientation[i] =
false;
9569 for (
unsigned int i = 4; i < 12; ++i)
9570 if (lines[i]->vertex_index((i + 1) % 2) ==
9571 middle_vertex_index<dim, spacedim>(
9572 hex->face(3 + i / 4)))
9573 line_orientation[i] =
true;
9578 Assert(lines[i]->vertex_index(i % 2) ==
9579 (middle_vertex_index<dim, spacedim>(
9580 hex->face(3 + i / 4))),
9582 line_orientation[i] =
false;
9587 line_orientation[12] =
true;
9612 new_quads[0]->set_bounding_object_indices(
9617 new_quads[1]->set_bounding_object_indices(
9622 new_quads[2]->set_bounding_object_indices(
9627 new_quads[3]->set_bounding_object_indices(
9633 new_quads[0]->set_line_orientation(
9634 0, line_orientation[2]);
9635 new_quads[0]->set_line_orientation(
9636 2, line_orientation[4]);
9637 new_quads[0]->set_line_orientation(
9638 3, line_orientation[8]);
9640 new_quads[1]->set_line_orientation(
9641 1, line_orientation[3]);
9642 new_quads[1]->set_line_orientation(
9643 2, line_orientation[5]);
9644 new_quads[1]->set_line_orientation(
9645 3, line_orientation[9]);
9647 new_quads[2]->set_line_orientation(
9648 0, line_orientation[6]);
9649 new_quads[2]->set_line_orientation(
9650 1, line_orientation[10]);
9651 new_quads[2]->set_line_orientation(
9652 2, line_orientation[0]);
9654 new_quads[3]->set_line_orientation(
9655 0, line_orientation[7]);
9656 new_quads[3]->set_line_orientation(
9657 1, line_orientation[11]);
9658 new_quads[3]->set_line_orientation(
9659 3, line_orientation[1]);
9692 const int quad_indices[20] = {
9693 new_quads[0]->index(),
9694 new_quads[1]->index(),
9695 new_quads[2]->index(),
9696 new_quads[3]->index(),
9698 hex->face(0)->child_index(
9699 child_at_origin[hex->face(0)->refinement_case() -
9700 1][f_fl[0]][f_ro[0]]),
9701 hex->face(0)->child_index(
9703 child_at_origin[hex->face(0)->refinement_case() -
9704 1][f_fl[0]][f_ro[0]]),
9706 hex->face(1)->child_index(
9707 child_at_origin[hex->face(1)->refinement_case() -
9708 1][f_fl[1]][f_ro[1]]),
9709 hex->face(1)->child_index(
9711 child_at_origin[hex->face(1)->refinement_case() -
9712 1][f_fl[1]][f_ro[1]]),
9714 hex->face(2)->child_index(
9715 child_at_origin[hex->face(2)->refinement_case() -
9716 1][f_fl[2]][f_ro[2]]),
9717 hex->face(2)->child_index(
9719 child_at_origin[hex->face(2)->refinement_case() -
9720 1][f_fl[2]][f_ro[2]]),
9722 hex->face(3)->child_index(
9723 child_at_origin[hex->face(3)->refinement_case() -
9724 1][f_fl[3]][f_ro[3]]),
9725 hex->face(3)->child_index(
9727 child_at_origin[hex->face(3)->refinement_case() -
9728 1][f_fl[3]][f_ro[3]]),
9730 hex->face(4)->isotropic_child_index(
9732 0, f_or[4], f_fl[4], f_ro[4])),
9733 hex->face(4)->isotropic_child_index(
9735 1, f_or[4], f_fl[4], f_ro[4])),
9736 hex->face(4)->isotropic_child_index(
9738 2, f_or[4], f_fl[4], f_ro[4])),
9739 hex->face(4)->isotropic_child_index(
9741 3, f_or[4], f_fl[4], f_ro[4])),
9743 hex->face(5)->isotropic_child_index(
9745 0, f_or[5], f_fl[5], f_ro[5])),
9746 hex->face(5)->isotropic_child_index(
9748 1, f_or[5], f_fl[5], f_ro[5])),
9749 hex->face(5)->isotropic_child_index(
9751 2, f_or[5], f_fl[5], f_ro[5])),
9752 hex->face(5)->isotropic_child_index(
9754 3, f_or[5], f_fl[5], f_ro[5]))};
9756 new_hexes[0]->set_bounding_object_indices(
9763 new_hexes[1]->set_bounding_object_indices(
9770 new_hexes[2]->set_bounding_object_indices(
9777 new_hexes[3]->set_bounding_object_indices(
9809 new_lines[0]->set_bounding_object_indices(
9810 {middle_vertex_index<dim, spacedim>(hex->face(2)),
9811 middle_vertex_index<dim, spacedim>(hex->face(3))});
9879 spacedim>::raw_line_iterator lines[13] = {
9880 hex->face(0)->child(0)->line(
9881 (hex->face(0)->refinement_case() ==
9885 hex->face(1)->child(0)->line(
9886 (hex->face(1)->refinement_case() ==
9890 hex->face(4)->child(0)->line(
9891 (hex->face(4)->refinement_case() ==
9895 hex->face(5)->child(0)->line(
9896 (hex->face(5)->refinement_case() ==
9904 0, f_or[2], f_fl[2], f_ro[2]))
9907 3, f_or[2], f_fl[2], f_ro[2])),
9911 3, f_or[2], f_fl[2], f_ro[2]))
9914 2, f_or[2], f_fl[2], f_ro[2])),
9918 0, f_or[2], f_fl[2], f_ro[2]))
9921 1, f_or[2], f_fl[2], f_ro[2])),
9925 3, f_or[2], f_fl[2], f_ro[2]))
9928 0, f_or[2], f_fl[2], f_ro[2])),
9933 0, f_or[3], f_fl[3], f_ro[3]))
9936 3, f_or[3], f_fl[3], f_ro[3])),
9940 3, f_or[3], f_fl[3], f_ro[3]))
9943 2, f_or[3], f_fl[3], f_ro[3])),
9947 0, f_or[3], f_fl[3], f_ro[3]))
9950 1, f_or[3], f_fl[3], f_ro[3])),
9954 3, f_or[3], f_fl[3], f_ro[3]))
9957 0, f_or[3], f_fl[3], f_ro[3])),
9962 unsigned int line_indices[13];
9963 for (
unsigned int i = 0; i < 13; ++i)
9964 line_indices[i] = lines[i]->
index();
9971 bool line_orientation[13];
9975 const unsigned int middle_vertices[4] = {
9976 hex->line(8)->child(0)->vertex_index(1),
9977 hex->line(9)->child(0)->vertex_index(1),
9978 hex->line(2)->child(0)->vertex_index(1),
9979 hex->line(6)->child(0)->vertex_index(1),
9984 for (
unsigned int i = 0; i < 4; ++i)
9985 if (lines[i]->vertex_index(0) == middle_vertices[i])
9986 line_orientation[i] =
true;
9990 Assert(lines[i]->vertex_index(1) ==
9993 line_orientation[i] =
false;
10002 for (
unsigned int i = 4; i < 12; ++i)
10003 if (lines[i]->vertex_index((i + 1) % 2) ==
10004 middle_vertex_index<dim, spacedim>(
10005 hex->face(1 + i / 4)))
10006 line_orientation[i] =
true;
10011 Assert(lines[i]->vertex_index(i % 2) ==
10012 (middle_vertex_index<dim, spacedim>(
10013 hex->face(1 + i / 4))),
10015 line_orientation[i] =
false;
10020 line_orientation[12] =
true;
10046 new_quads[0]->set_bounding_object_indices(
10050 line_indices[10]});
10051 new_quads[1]->set_bounding_object_indices(
10055 line_indices[11]});
10056 new_quads[2]->set_bounding_object_indices(
10060 line_indices[12]});
10061 new_quads[3]->set_bounding_object_indices(
10067 new_quads[0]->set_line_orientation(
10068 0, line_orientation[0]);
10069 new_quads[0]->set_line_orientation(
10070 2, line_orientation[6]);
10071 new_quads[0]->set_line_orientation(
10072 3, line_orientation[10]);
10074 new_quads[1]->set_line_orientation(
10075 1, line_orientation[1]);
10076 new_quads[1]->set_line_orientation(
10077 2, line_orientation[7]);
10078 new_quads[1]->set_line_orientation(
10079 3, line_orientation[11]);
10081 new_quads[2]->set_line_orientation(
10082 0, line_orientation[4]);
10083 new_quads[2]->set_line_orientation(
10084 1, line_orientation[8]);
10085 new_quads[2]->set_line_orientation(
10086 2, line_orientation[2]);
10088 new_quads[3]->set_line_orientation(
10089 0, line_orientation[5]);
10090 new_quads[3]->set_line_orientation(
10091 1, line_orientation[9]);
10092 new_quads[3]->set_line_orientation(
10093 3, line_orientation[3]);
10127 const int quad_indices[20] = {
10128 new_quads[0]->index(),
10129 new_quads[1]->index(),
10130 new_quads[2]->index(),
10131 new_quads[3]->index(),
10133 hex->face(0)->child_index(
10134 child_at_origin[hex->face(0)->refinement_case() -
10135 1][f_fl[0]][f_ro[0]]),
10136 hex->face(0)->child_index(
10138 child_at_origin[hex->face(0)->refinement_case() -
10139 1][f_fl[0]][f_ro[0]]),
10141 hex->face(1)->child_index(
10142 child_at_origin[hex->face(1)->refinement_case() -
10143 1][f_fl[1]][f_ro[1]]),
10144 hex->face(1)->child_index(
10146 child_at_origin[hex->face(1)->refinement_case() -
10147 1][f_fl[1]][f_ro[1]]),
10149 hex->face(2)->isotropic_child_index(
10151 0, f_or[2], f_fl[2], f_ro[2])),
10152 hex->face(2)->isotropic_child_index(
10154 1, f_or[2], f_fl[2], f_ro[2])),
10155 hex->face(2)->isotropic_child_index(
10157 2, f_or[2], f_fl[2], f_ro[2])),
10158 hex->face(2)->isotropic_child_index(
10160 3, f_or[2], f_fl[2], f_ro[2])),
10162 hex->face(3)->isotropic_child_index(
10164 0, f_or[3], f_fl[3], f_ro[3])),
10165 hex->face(3)->isotropic_child_index(
10167 1, f_or[3], f_fl[3], f_ro[3])),
10168 hex->face(3)->isotropic_child_index(
10170 2, f_or[3], f_fl[3], f_ro[3])),
10171 hex->face(3)->isotropic_child_index(
10173 3, f_or[3], f_fl[3], f_ro[3])),
10175 hex->face(4)->child_index(
10176 child_at_origin[hex->face(4)->refinement_case() -
10177 1][f_fl[4]][f_ro[4]]),
10178 hex->face(4)->child_index(
10180 child_at_origin[hex->face(4)->refinement_case() -
10181 1][f_fl[4]][f_ro[4]]),
10183 hex->face(5)->child_index(
10184 child_at_origin[hex->face(5)->refinement_case() -
10185 1][f_fl[5]][f_ro[5]]),
10186 hex->face(5)->child_index(
10188 child_at_origin[hex->face(5)->refinement_case() -
10189 1][f_fl[5]][f_ro[5]])};
10200 new_hexes[0]->set_bounding_object_indices(
10207 new_hexes[1]->set_bounding_object_indices(
10213 quad_indices[18]});
10214 new_hexes[2]->set_bounding_object_indices(
10221 new_hexes[3]->set_bounding_object_indices(
10227 quad_indices[19]});
10254 new_lines[0]->set_bounding_object_indices(
10256 {middle_vertex_index<dim, spacedim>(hex->face(0)),
10257 middle_vertex_index<dim, spacedim>(hex->face(1))});
10326 spacedim>::raw_line_iterator lines[13] = {
10327 hex->face(2)->child(0)->line(
10328 (hex->face(2)->refinement_case() ==
10332 hex->face(3)->child(0)->line(
10333 (hex->face(3)->refinement_case() ==
10337 hex->face(4)->child(0)->line(
10338 (hex->face(4)->refinement_case() ==
10342 hex->face(5)->child(0)->line(
10343 (hex->face(5)->refinement_case() ==
10351 0, f_or[0], f_fl[0], f_ro[0]))
10354 1, f_or[0], f_fl[0], f_ro[0])),
10358 3, f_or[0], f_fl[0], f_ro[0]))
10361 0, f_or[0], f_fl[0], f_ro[0])),
10365 0, f_or[0], f_fl[0], f_ro[0]))
10368 3, f_or[0], f_fl[0], f_ro[0])),
10372 3, f_or[0], f_fl[0], f_ro[0]))
10375 2, f_or[0], f_fl[0], f_ro[0])),
10380 0, f_or[1], f_fl[1], f_ro[1]))
10383 1, f_or[1], f_fl[1], f_ro[1])),
10387 3, f_or[1], f_fl[1], f_ro[1]))
10390 0, f_or[1], f_fl[1], f_ro[1])),
10394 0, f_or[1], f_fl[1], f_ro[1]))
10397 3, f_or[1], f_fl[1], f_ro[1])),
10401 3, f_or[1], f_fl[1], f_ro[1]))
10404 2, f_or[1], f_fl[1], f_ro[1])),
10409 unsigned int line_indices[13];
10411 for (
unsigned int i = 0; i < 13; ++i)
10412 line_indices[i] = lines[i]->
index();
10419 bool line_orientation[13];
10423 const unsigned int middle_vertices[4] = {
10424 hex->line(8)->child(0)->vertex_index(1),
10425 hex->line(10)->child(0)->vertex_index(1),
10426 hex->line(0)->child(0)->vertex_index(1),
10427 hex->line(4)->child(0)->vertex_index(1),
10432 for (
unsigned int i = 0; i < 4; ++i)
10433 if (lines[i]->vertex_index(0) == middle_vertices[i])
10434 line_orientation[i] =
true;
10438 Assert(lines[i]->vertex_index(1) ==
10439 middle_vertices[i],
10441 line_orientation[i] =
false;
10450 for (
unsigned int i = 4; i < 12; ++i)
10451 if (lines[i]->vertex_index((i + 1) % 2) ==
10452 middle_vertex_index<dim, spacedim>(
10453 hex->face(i / 4 - 1)))
10454 line_orientation[i] =
true;
10459 Assert(lines[i]->vertex_index(i % 2) ==
10460 (middle_vertex_index<dim, spacedim>(
10461 hex->face(i / 4 - 1))),
10463 line_orientation[i] =
false;
10468 line_orientation[12] =
true;
10488 new_quads[0]->set_bounding_object_indices(
10492 line_indices[12]});
10493 new_quads[1]->set_bounding_object_indices(
10498 new_quads[2]->set_bounding_object_indices(
10503 new_quads[3]->set_bounding_object_indices(
10509 new_quads[0]->set_line_orientation(
10510 0, line_orientation[6]);
10511 new_quads[0]->set_line_orientation(
10512 1, line_orientation[10]);
10513 new_quads[0]->set_line_orientation(
10514 2, line_orientation[0]);
10516 new_quads[1]->set_line_orientation(
10517 0, line_orientation[7]);
10518 new_quads[1]->set_line_orientation(
10519 1, line_orientation[11]);
10520 new_quads[1]->set_line_orientation(
10521 3, line_orientation[1]);
10523 new_quads[2]->set_line_orientation(
10524 0, line_orientation[2]);
10525 new_quads[2]->set_line_orientation(
10526 2, line_orientation[4]);
10527 new_quads[2]->set_line_orientation(
10528 3, line_orientation[8]);
10530 new_quads[3]->set_line_orientation(
10531 1, line_orientation[3]);
10532 new_quads[3]->set_line_orientation(
10533 2, line_orientation[5]);
10534 new_quads[3]->set_line_orientation(
10535 3, line_orientation[9]);
10569 const int quad_indices[20] = {
10570 new_quads[0]->index(),
10571 new_quads[1]->index(),
10572 new_quads[2]->index(),
10573 new_quads[3]->index(),
10575 hex->face(0)->isotropic_child_index(
10577 0, f_or[0], f_fl[0], f_ro[0])),
10578 hex->face(0)->isotropic_child_index(
10580 1, f_or[0], f_fl[0], f_ro[0])),
10581 hex->face(0)->isotropic_child_index(
10583 2, f_or[0], f_fl[0], f_ro[0])),
10584 hex->face(0)->isotropic_child_index(
10586 3, f_or[0], f_fl[0], f_ro[0])),
10588 hex->face(1)->isotropic_child_index(
10590 0, f_or[1], f_fl[1], f_ro[1])),
10591 hex->face(1)->isotropic_child_index(
10593 1, f_or[1], f_fl[1], f_ro[1])),
10594 hex->face(1)->isotropic_child_index(
10596 2, f_or[1], f_fl[1], f_ro[1])),
10597 hex->face(1)->isotropic_child_index(
10599 3, f_or[1], f_fl[1], f_ro[1])),
10601 hex->face(2)->child_index(
10602 child_at_origin[hex->face(2)->refinement_case() -
10603 1][f_fl[2]][f_ro[2]]),
10604 hex->face(2)->child_index(
10606 child_at_origin[hex->face(2)->refinement_case() -
10607 1][f_fl[2]][f_ro[2]]),
10609 hex->face(3)->child_index(
10610 child_at_origin[hex->face(3)->refinement_case() -
10611 1][f_fl[3]][f_ro[3]]),
10612 hex->face(3)->child_index(
10614 child_at_origin[hex->face(3)->refinement_case() -
10615 1][f_fl[3]][f_ro[3]]),
10617 hex->face(4)->child_index(
10618 child_at_origin[hex->face(4)->refinement_case() -
10619 1][f_fl[4]][f_ro[4]]),
10620 hex->face(4)->child_index(
10622 child_at_origin[hex->face(4)->refinement_case() -
10623 1][f_fl[4]][f_ro[4]]),
10625 hex->face(5)->child_index(
10626 child_at_origin[hex->face(5)->refinement_case() -
10627 1][f_fl[5]][f_ro[5]]),
10628 hex->face(5)->child_index(
10630 child_at_origin[hex->face(5)->refinement_case() -
10631 1][f_fl[5]][f_ro[5]])};
10633 new_hexes[0]->set_bounding_object_indices(
10640 new_hexes[1]->set_bounding_object_indices(
10647 new_hexes[2]->set_bounding_object_indices(
10653 quad_indices[18]});
10654 new_hexes[3]->set_bounding_object_indices(
10660 quad_indices[19]});
10692 ++next_unused_vertex;
10696 "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."));
10707 hex->center(
true,
true);
10729 middle_vertex_index<dim, spacedim>(hex->face(0)),
10730 middle_vertex_index<dim, spacedim>(hex->face(1)),
10731 middle_vertex_index<dim, spacedim>(hex->face(2)),
10732 middle_vertex_index<dim, spacedim>(hex->face(3)),
10733 middle_vertex_index<dim, spacedim>(hex->face(4)),
10734 middle_vertex_index<dim, spacedim>(hex->face(5)),
10735 next_unused_vertex};
10737 new_lines[0]->set_bounding_object_indices(
10739 new_lines[1]->set_bounding_object_indices(
10741 new_lines[2]->set_bounding_object_indices(
10743 new_lines[3]->set_bounding_object_indices(
10745 new_lines[4]->set_bounding_object_indices(
10747 new_lines[5]->set_bounding_object_indices(
10817 spacedim>::raw_line_iterator lines[30] = {
10821 0, f_or[0], f_fl[0], f_ro[0]))
10824 1, f_or[0], f_fl[0], f_ro[0])),
10828 3, f_or[0], f_fl[0], f_ro[0]))
10831 0, f_or[0], f_fl[0], f_ro[0])),
10835 0, f_or[0], f_fl[0], f_ro[0]))
10838 3, f_or[0], f_fl[0], f_ro[0])),
10842 3, f_or[0], f_fl[0], f_ro[0]))
10845 2, f_or[0], f_fl[0], f_ro[0])),
10850 0, f_or[1], f_fl[1], f_ro[1]))
10853 1, f_or[1], f_fl[1], f_ro[1])),
10857 3, f_or[1], f_fl[1], f_ro[1]))
10860 0, f_or[1], f_fl[1], f_ro[1])),
10864 0, f_or[1], f_fl[1], f_ro[1]))
10867 3, f_or[1], f_fl[1], f_ro[1])),
10871 3, f_or[1], f_fl[1], f_ro[1]))
10874 2, f_or[1], f_fl[1], f_ro[1])),
10879 0, f_or[2], f_fl[2], f_ro[2]))
10882 1, f_or[2], f_fl[2], f_ro[2])),
10886 3, f_or[2], f_fl[2], f_ro[2]))
10889 0, f_or[2], f_fl[2], f_ro[2])),
10893 0, f_or[2], f_fl[2], f_ro[2]))
10896 3, f_or[2], f_fl[2], f_ro[2])),
10900 3, f_or[2], f_fl[2], f_ro[2]))
10903 2, f_or[2], f_fl[2], f_ro[2])),
10908 0, f_or[3], f_fl[3], f_ro[3]))
10911 1, f_or[3], f_fl[3], f_ro[3])),
10915 3, f_or[3], f_fl[3], f_ro[3]))
10918 0, f_or[3], f_fl[3], f_ro[3])),
10922 0, f_or[3], f_fl[3], f_ro[3]))
10925 3, f_or[3], f_fl[3], f_ro[3])),
10929 3, f_or[3], f_fl[3], f_ro[3]))
10932 2, f_or[3], f_fl[3], f_ro[3])),
10937 0, f_or[4], f_fl[4], f_ro[4]))
10940 1, f_or[4], f_fl[4], f_ro[4])),
10944 3, f_or[4], f_fl[4], f_ro[4]))
10947 0, f_or[4], f_fl[4], f_ro[4])),
10951 0, f_or[4], f_fl[4], f_ro[4]))
10954 3, f_or[4], f_fl[4], f_ro[4])),
10958 3, f_or[4], f_fl[4], f_ro[4]))
10961 2, f_or[4], f_fl[4], f_ro[4])),
10966 0, f_or[5], f_fl[5], f_ro[5]))
10969 1, f_or[5], f_fl[5], f_ro[5])),
10973 3, f_or[5], f_fl[5], f_ro[5]))
10976 0, f_or[5], f_fl[5], f_ro[5])),
10980 0, f_or[5], f_fl[5], f_ro[5]))
10983 3, f_or[5], f_fl[5], f_ro[5])),
10987 3, f_or[5], f_fl[5], f_ro[5]))
10990 2, f_or[5], f_fl[5], f_ro[5])),
11000 unsigned int line_indices[30];
11001 for (
unsigned int i = 0; i < 30; ++i)
11002 line_indices[i] = lines[i]->
index();
11009 bool line_orientation[30];
11017 for (
unsigned int i = 0; i < 24; ++i)
11018 if (lines[i]->vertex_index((i + 1) % 2) ==
11020 line_orientation[i] =
true;
11025 Assert(lines[i]->vertex_index(i % 2) ==
11028 line_orientation[i] =
false;
11033 for (
unsigned int i = 24; i < 30; ++i)
11034 line_orientation[i] =
true;
11066 new_quads[0]->set_bounding_object_indices(
11070 line_indices[24]});
11071 new_quads[1]->set_bounding_object_indices(
11075 line_indices[25]});
11076 new_quads[2]->set_bounding_object_indices(
11080 line_indices[20]});
11081 new_quads[3]->set_bounding_object_indices(
11085 line_indices[21]});
11086 new_quads[4]->set_bounding_object_indices(
11090 line_indices[28]});
11091 new_quads[5]->set_bounding_object_indices(
11095 line_indices[29]});
11096 new_quads[6]->set_bounding_object_indices(
11101 new_quads[7]->set_bounding_object_indices(
11106 new_quads[8]->set_bounding_object_indices(
11110 line_indices[26]});
11111 new_quads[9]->set_bounding_object_indices(
11115 line_indices[27]});
11116 new_quads[10]->set_bounding_object_indices(
11120 line_indices[12]});
11121 new_quads[11]->set_bounding_object_indices(
11125 line_indices[13]});
11130 new_quads[0]->set_line_orientation(
11131 0, line_orientation[10]);
11132 new_quads[0]->set_line_orientation(
11133 2, line_orientation[16]);
11135 new_quads[1]->set_line_orientation(
11136 1, line_orientation[14]);
11137 new_quads[1]->set_line_orientation(
11138 2, line_orientation[17]);
11140 new_quads[2]->set_line_orientation(
11141 0, line_orientation[11]);
11142 new_quads[2]->set_line_orientation(
11143 3, line_orientation[20]);
11145 new_quads[3]->set_line_orientation(
11146 1, line_orientation[15]);
11147 new_quads[3]->set_line_orientation(
11148 3, line_orientation[21]);
11150 new_quads[4]->set_line_orientation(
11151 0, line_orientation[18]);
11152 new_quads[4]->set_line_orientation(
11153 2, line_orientation[0]);
11155 new_quads[5]->set_line_orientation(
11156 1, line_orientation[22]);
11157 new_quads[5]->set_line_orientation(
11158 2, line_orientation[1]);
11160 new_quads[6]->set_line_orientation(
11161 0, line_orientation[19]);
11162 new_quads[6]->set_line_orientation(
11163 3, line_orientation[4]);
11165 new_quads[7]->set_line_orientation(
11166 1, line_orientation[23]);
11167 new_quads[7]->set_line_orientation(
11168 3, line_orientation[5]);
11170 new_quads[8]->set_line_orientation(
11171 0, line_orientation[2]);
11172 new_quads[8]->set_line_orientation(
11173 2, line_orientation[8]);
11175 new_quads[9]->set_line_orientation(
11176 1, line_orientation[6]);
11177 new_quads[9]->set_line_orientation(
11178 2, line_orientation[9]);
11180 new_quads[10]->set_line_orientation(
11181 0, line_orientation[3]);
11182 new_quads[10]->set_line_orientation(
11183 3, line_orientation[12]);
11185 new_quads[11]->set_line_orientation(
11186 1, line_orientation[7]);
11187 new_quads[11]->set_line_orientation(
11188 3, line_orientation[13]);
11229 const int quad_indices[36] = {
11230 new_quads[0]->index(),
11231 new_quads[1]->index(),
11232 new_quads[2]->index(),
11233 new_quads[3]->index(),
11234 new_quads[4]->index(),
11235 new_quads[5]->index(),
11236 new_quads[6]->index(),
11237 new_quads[7]->index(),
11238 new_quads[8]->index(),
11239 new_quads[9]->index(),
11240 new_quads[10]->index(),
11241 new_quads[11]->index(),
11243 hex->face(0)->isotropic_child_index(
11245 0, f_or[0], f_fl[0], f_ro[0])),
11246 hex->face(0)->isotropic_child_index(
11248 1, f_or[0], f_fl[0], f_ro[0])),
11249 hex->face(0)->isotropic_child_index(
11251 2, f_or[0], f_fl[0], f_ro[0])),
11252 hex->face(0)->isotropic_child_index(
11254 3, f_or[0], f_fl[0], f_ro[0])),
11256 hex->face(1)->isotropic_child_index(
11258 0, f_or[1], f_fl[1], f_ro[1])),
11259 hex->face(1)->isotropic_child_index(
11261 1, f_or[1], f_fl[1], f_ro[1])),
11262 hex->face(1)->isotropic_child_index(
11264 2, f_or[1], f_fl[1], f_ro[1])),
11265 hex->face(1)->isotropic_child_index(
11267 3, f_or[1], f_fl[1], f_ro[1])),
11269 hex->face(2)->isotropic_child_index(
11271 0, f_or[2], f_fl[2], f_ro[2])),
11272 hex->face(2)->isotropic_child_index(
11274 1, f_or[2], f_fl[2], f_ro[2])),
11275 hex->face(2)->isotropic_child_index(
11277 2, f_or[2], f_fl[2], f_ro[2])),
11278 hex->face(2)->isotropic_child_index(
11280 3, f_or[2], f_fl[2], f_ro[2])),
11282 hex->face(3)->isotropic_child_index(
11284 0, f_or[3], f_fl[3], f_ro[3])),
11285 hex->face(3)->isotropic_child_index(
11287 1, f_or[3], f_fl[3], f_ro[3])),
11288 hex->face(3)->isotropic_child_index(
11290 2, f_or[3], f_fl[3], f_ro[3])),
11291 hex->face(3)->isotropic_child_index(
11293 3, f_or[3], f_fl[3], f_ro[3])),
11295 hex->face(4)->isotropic_child_index(
11297 0, f_or[4], f_fl[4], f_ro[4])),
11298 hex->face(4)->isotropic_child_index(
11300 1, f_or[4], f_fl[4], f_ro[4])),
11301 hex->face(4)->isotropic_child_index(
11303 2, f_or[4], f_fl[4], f_ro[4])),
11304 hex->face(4)->isotropic_child_index(
11306 3, f_or[4], f_fl[4], f_ro[4])),
11308 hex->face(5)->isotropic_child_index(
11310 0, f_or[5], f_fl[5], f_ro[5])),
11311 hex->face(5)->isotropic_child_index(
11313 1, f_or[5], f_fl[5], f_ro[5])),
11314 hex->face(5)->isotropic_child_index(
11316 2, f_or[5], f_fl[5], f_ro[5])),
11317 hex->face(5)->isotropic_child_index(
11319 3, f_or[5], f_fl[5], f_ro[5]))};
11322 new_hexes[0]->set_bounding_object_indices(
11329 new_hexes[1]->set_bounding_object_indices(
11336 new_hexes[2]->set_bounding_object_indices(
11342 quad_indices[10]});
11343 new_hexes[3]->set_bounding_object_indices(
11349 quad_indices[11]});
11352 new_hexes[4]->set_bounding_object_indices(
11358 quad_indices[32]});
11359 new_hexes[5]->set_bounding_object_indices(
11365 quad_indices[33]});
11366 new_hexes[6]->set_bounding_object_indices(
11372 quad_indices[34]});
11373 new_hexes[7]->set_bounding_object_indices(
11379 quad_indices[35]});
11413 for (
unsigned int s = 0;
11420 const unsigned int current_child =
11429 ref_case, f, f_or[f], f_fl[f], f_ro[f]));
11430 new_hexes[current_child]->set_combined_face_orientation(
11436 if (check_for_distorted_cells &&
11437 has_distorted_children<dim, spacedim>(hex))
11457 return cells_with_distorted_children;