15#ifndef dealii_tria_accessor_h
16#define dealii_tria_accessor_h
35#include <boost/container/small_vector.hpp>
46template <
int dim,
int spacedim>
49template <
typename Accessor>
51template <
typename Accessor>
53template <
typename Accessor>
58 template <
int dim,
int spacedim>
63template <
int dim,
int spacedim>
66template <
int dim,
int spacedim,
bool lda>
70template <
int dim,
int spacedim>
73template <
int dim,
int spacedim>
88 struct Implementation;
95 template <
int structdim,
int dim>
149template <
int structdim,
int dim,
int spacedim>
151template <
int dim,
int spacedim>
153template <
int spacedim>
165 "The operation you are attempting can only be performed for "
166 "(cell, face, or edge) iterators that point to valid "
167 "objects. These objects need not necessarily be active, "
168 "i.e., have no children, but they need to be part of a "
169 "triangulation. (The objects pointed to by an iterator "
170 "may -- after coarsening -- also be objects that used "
171 "to be part of a triangulation, but are now no longer "
172 "used. Their memory location may have been retained "
173 "for re-use upon the next mesh refinement, but is "
174 "currently unused.)");
185 "The operation you are attempting can only be performed for "
186 "(cell, face, or edge) iterators that point to 'active' "
187 "objects. 'Active' objects are those that do not have "
188 "children (in the case of cells), or that are part of "
189 "an active cell (in the case of faces or edges). However, "
190 "the object on which you are trying the current "
191 "operation is not 'active' in this sense.");
198 "The operation you are attempting can only be performed for "
199 "(cell, face, or edge) iterators that have children, "
200 "but the object on which you are trying the current "
201 "operation does not have any.");
209 "The operation you are attempting can only be performed for "
210 "(cell, face, or edge) iterators that have a parent object, "
211 "but the object on which you are trying the current "
212 "operation does not have one -- i.e., it is on the "
213 "coarsest level of the triangulation.");
219 <<
"You can only set the child index if the cell does not "
220 <<
"currently have children registered; or you can clear it. "
221 <<
"The given index was " << arg1
222 <<
" (-1 means: clear children).");
226 template <
typename AccessorType>
229 <<
"You tried to dereference an iterator for which this "
230 <<
"is not possible. More information on this iterator: "
231 <<
"index=" << arg1.index() <<
", state="
241 "Iterators can only be compared if they point to the same "
242 "triangulation, or if neither of them are associated "
243 "with a triangulation.");
276 <<
"You can only set the child index of an even numbered child."
277 <<
"The number of the child given was " << arg1 <<
'.');
306template <
int structdim,
int dim,
int spacedim = dim>
356 const int level = -1,
357 const int index = -1,
527 typename ::internal::TriaAccessorImplementation::
542 template <
typename Accessor>
544 template <
typename Accessor>
546 template <
typename Accessor>
572template <
int structdim,
int dim,
int spacedim = dim>
613 const int level = -1,
614 const int index = -1,
630 template <
typename OtherAccessor>
726 line(
const unsigned int i)
const;
733 quad(
const unsigned int i)
const;
755template <
int structdim,
int dim,
int spacedim>
769 const int level = -1,
770 const int index = -1,
796 template <
int structdim2,
int dim2,
int spacedim2>
803 template <
int structdim2,
int dim2,
int spacedim2>
913 typename ::internal::TriangulationImplementation::
914 Iterators<dim, spacedim>::line_iterator
915 line(
const unsigned int i)
const;
929 typename ::internal::TriangulationImplementation::
930 Iterators<dim, spacedim>::quad_iterator
931 quad(
const unsigned int i)
const;
1539 std::pair<Point<spacedim>,
double>
1647 center(
const bool respect_manifold =
false,
1648 const bool interpolate_from_surrounding =
false)
const;
1798 const std::initializer_list<int> &new_indices)
const;
1805 const std::initializer_list<unsigned int> &new_indices)
const;
1829 const unsigned int face,
1884 friend struct ::internal::TriangulationImplementation::Implementation;
1885 friend struct ::internal::TriangulationImplementation::
1886 ImplementationMixedMesh;
1887 friend struct ::internal::TriaAccessorImplementation::Implementation;
1910template <
int dim,
int spacedim>
1953 const int level = 0,
1954 const int index = 0,
1960 template <
int structdim2,
int dim2,
int spacedim2>
1966 template <
int structdim2,
int dim2,
int spacedim2>
2067 typename ::internal::TriangulationImplementation::
2068 Iterators<dim, spacedim>::line_iterator
static line(
const unsigned int);
2079 static typename ::internal::TriangulationImplementation::
2080 Iterators<dim, spacedim>::quad_iterator
2126 const bool interpolate_from_surrounding =
false)
const;
2295 template <
typename Accessor>
2297 template <
typename Accessor>
2299 template <
typename Accessor>
2321template <
int spacedim>
2337 static constexpr unsigned int dimension = 1;
2383 const VertexKind vertex_kind,
2399 template <
int structdim2,
int dim2,
int spacedim2>
2405 template <
int structdim2,
int dim2,
int spacedim2>
2406 TriaAccessor(
const InvalidAccessor<structdim2, dim2, spacedim2> &);
2449 const Triangulation<1, spacedim> &
2529 vertex(
const unsigned int i = 0)
const;
2542 typename ::internal::TriangulationImplementation::
2543 Iterators<1, spacedim>::line_iterator
static line(
const unsigned int);
2557 static typename ::internal::TriangulationImplementation::
2558 Iterators<1, spacedim>::quad_iterator
2559 quad(
const unsigned int i);
2621 const Manifold<1, spacedim> &
2915 child(
const unsigned int);
3059 VertexKind vertex_kind;
3064 unsigned int global_vertex_index;
3084template <
int dim,
int spacedim = dim>
3109 const int level = -1,
3110 const int index = -1,
3130 template <
int structdim2,
int dim2,
int spacedim2>
3137 template <
int structdim2,
int dim2,
int spacedim2>
3234 boost::container::small_vector<TriaIterator<CellAccessor<dim, spacedim>>,
3255 boost::container::small_vector<
3326 const unsigned int subface_no)
const;
3439 std::pair<unsigned int, unsigned int>
3518 const unsigned int subface_no)
const;
3530 std::pair<unsigned int, unsigned int>
3707 const unsigned int face_no,
4207 template <
int dim_,
int spacedim_>
4256 friend struct ::internal::TriangulationImplementation::Implementation;
4257 friend struct ::internal::TriangulationImplementation::
4258 ImplementationMixedMesh;
4266template <
int structdim,
int dim,
int spacedim>
4267template <
typename OtherAccessor>
4269 const OtherAccessor &)
4272 ExcMessage(
"You are attempting an illegal conversion between "
4273 "iterator/accessor types. The constructor you call "
4274 "only exists to make certain template constructs "
4275 "easier to write as dimension independent code but "
4276 "the conversion is not valid in the current context."));
4281template <
int structdim,
int dim,
int spacedim>
4282template <
int structdim2,
int dim2,
int spacedim2>
4287 ExcMessage(
"You are attempting an illegal conversion between "
4288 "iterator/accessor types. The constructor you call "
4289 "only exists to make certain template constructs "
4290 "easier to write as dimension independent code but "
4291 "the conversion is not valid in the current context."));
4296template <
int dim,
int spacedim>
4297template <
int structdim2,
int dim2,
int spacedim2>
4302 ExcMessage(
"You are attempting an illegal conversion between "
4303 "iterator/accessor types. The constructor you call "
4304 "only exists to make certain template constructs "
4305 "easier to write as dimension independent code but "
4306 "the conversion is not valid in the current context."));
4311template <
int structdim,
int dim,
int spacedim>
4312template <
int structdim2,
int dim2,
int spacedim2>
4317 ExcMessage(
"You are attempting an illegal conversion between "
4318 "iterator/accessor types. The constructor you call "
4319 "only exists to make certain template constructs "
4320 "easier to write as dimension independent code but "
4321 "the conversion is not valid in the current context."));
4326template <
int dim,
int spacedim>
4327template <
int structdim2,
int dim2,
int spacedim2>
4332 ExcMessage(
"You are attempting an illegal conversion between "
4333 "iterator/accessor types. The constructor you call "
4334 "only exists to make certain template constructs "
4335 "easier to write as dimension independent code but "
4336 "the conversion is not valid in the current context."));
4370 namespace TriaAccessorImplementation
4377 template <
int dim,
int spacedim>
4389 return (vertices[1] - vertices[0]).norm();
4392 return std::max({(vertices[1] - vertices[0]).norm(),
4393 (vertices[2] - vertices[1]).norm(),
4394 (vertices[2] - vertices[0]).norm()});
4398 (vertices[2] - vertices[1]).
norm()});
4402 (vertices[2] - vertices[0]).
norm(),
4403 (vertices[2] - vertices[1]).
norm(),
4404 (vertices[3] - vertices[0]).
norm(),
4405 (vertices[3] - vertices[1]).
norm(),
4406 (vertices[3] - vertices[2]).
norm()});
4411 (vertices[3] - vertices[0]).
norm(),
4412 (vertices[2] - vertices[1]).
norm(),
4415 (vertices[4] - vertices[0]).
norm(),
4416 (vertices[4] - vertices[1]).
norm(),
4417 (vertices[4] - vertices[2]).
norm(),
4418 (vertices[4] - vertices[3]).
norm()});
4423 (vertices[4] - vertices[0]).
norm(),
4424 (vertices[3] - vertices[1]).
norm(),
4425 (vertices[5] - vertices[1]).
norm(),
4426 (vertices[4] - vertices[2]).
norm(),
4427 (vertices[5] - vertices[0]).
norm(),
4428 (vertices[3] - vertices[2]).
norm(),
4431 (vertices[1] - vertices[0]).
norm(),
4432 (vertices[2] - vertices[1]).
norm(),
4433 (vertices[2] - vertices[0]).
norm(),
4434 (vertices[4] - vertices[3]).
norm(),
4435 (vertices[5] - vertices[4]).
norm(),
4436 (vertices[5] - vertices[3]).
norm()});
4440 (vertices[6] - vertices[1]).
norm(),
4441 (vertices[2] - vertices[5]).
norm(),
4442 (vertices[3] - vertices[4]).
norm()});
4453template <
int structdim,
int dim,
int spacedim>
4458 const AccessorData *)
4459 : present_level((structdim == dim) ? level : 0)
4460 , present_index(
index)
4468 if (structdim != dim)
4476template <
int structdim,
int dim,
int spacedim>
4479 : present_level(a.present_level)
4480 , present_index(a.present_index)
4485template <
int structdim,
int dim,
int spacedim>
4494 if (structdim != dim)
4496 Assert((present_level == 0) || (present_level == -1) ||
4497 (present_level == -2),
4504template <
int structdim,
int dim,
int spacedim>
4513 if (structdim != dim)
4515 Assert((present_level == 0) || (present_level == -1) ||
4516 (present_level == -2),
4524template <
int structdim,
int dim,
int spacedim>
4537template <
int structdim,
int dim,
int spacedim>
4550template <
int structdim,
int dim,
int spacedim>
4565template <
int structdim,
int dim,
int spacedim>
4571 return present_level;
4576template <
int structdim,
int dim,
int spacedim>
4580 return present_index;
4585template <
int structdim,
int dim,
int spacedim>
4589 if ((present_level >= 0) && (present_index >= 0))
4591 else if (present_index == -1)
4599template <
int structdim,
int dim,
int spacedim>
4608template <
int structdim,
int dim,
int spacedim>
4614 ++this->present_index;
4616 if (structdim != dim)
4623 if (this->present_index >=
static_cast<int>(objects().n_objects()))
4624 this->present_index = -1;
4628 while (this->present_index >=
4630 this->tria->
levels[this->present_level]->cells.n_objects()))
4634 ++this->present_level;
4635 this->present_index = 0;
4637 if (this->present_level >=
4638 static_cast<int>(this->tria->
levels.size()))
4641 this->present_level = this->present_index = -1;
4649template <
int structdim,
int dim,
int spacedim>
4654 --this->present_index;
4656 if (structdim != dim)
4658 if (this->present_index < 0)
4659 this->present_index = -1;
4663 while (this->present_index < 0)
4666 --this->present_level;
4668 if (this->present_level == -1)
4671 this->present_level = this->present_index = -1;
4675 this->present_index =
4676 this->tria->
levels[this->present_level]->cells.n_objects() - 1;
4683template <
int structdim,
int dim,
int spacedim>
4684inline ::internal::TriangulationImplementation::TriaObjects &
4687 if (structdim == dim)
4688 return this->tria->
levels[this->present_level]->cells;
4690 if (structdim == 1 && dim > 1)
4691 return this->tria->
faces->lines;
4693 if (structdim == 2 && dim > 2)
4694 return this->tria->
faces->quads;
4698 return this->tria->
levels[this->present_level]->cells;
4705template <
int structdim,
int dim,
int spacedim>
4709 const AccessorData *)
4712 ExcMessage(
"You are attempting an invalid conversion between "
4713 "iterator/accessor types. The constructor you call "
4714 "only exists to make certain template constructs "
4715 "easier to write as dimension independent code but "
4716 "the conversion is not valid in the current context."));
4721template <
int structdim,
int dim,
int spacedim>
4726 ExcMessage(
"You are attempting an invalid conversion between "
4727 "iterator/accessor types. The constructor you call "
4728 "only exists to make certain template constructs "
4729 "easier to write as dimension independent code but "
4730 "the conversion is not valid in the current context."));
4735template <
int structdim,
int dim,
int spacedim>
4748template <
int structdim,
int dim,
int spacedim>
4763template <
int structdim,
int dim,
int spacedim>
4778template <
int structdim,
int dim,
int spacedim>
4792template <
int structdim,
int dim,
int spacedim>
4806template <
int structdim,
int dim,
int spacedim>
4813template <
int structdim,
int dim,
int spacedim>
4820template <
int structdim,
int dim,
int spacedim>
4829template <
int structdim,
int dim,
int spacedim>
4838template <
int structdim,
int dim,
int spacedim>
4841 const unsigned int)
const
4844 ExcMessage(
"You are trying to set the user index of an "
4845 "invalid object."));
4850template <
int structdim,
int dim,
int spacedim>
4856 ExcMessage(
"You are trying to set the manifold id of an "
4857 "invalid object."));
4862template <
int structdim,
int dim,
int spacedim>
4869 return invalid_vertex;
4873template <
int structdim,
int dim,
int spacedim>
4884template <
int structdim,
int dim,
int spacedim>
4907 using ::TriaAccessor;
4913 struct Implementation
4918 template <
int structdim,
int dim,
int spacedim>
4920 set_combined_face_orientation(
4921 const TriaAccessor<structdim, dim, spacedim> &accessor,
4922 const unsigned int face_no,
4926 ExcMessage(
"This function can only be used on objects that are "
4927 "cells and not on objects which bound cells."));
4936 ->face_orientations.set_combined_orientation(
4939 combined_orientation);
4944 template <
int dim,
int spacedim>
4945 static std::array<unsigned int, 1>
4946 get_line_indices_of_cell(
const TriaAccessor<1, dim, spacedim> &)
4954 template <
int structdim,
int dim,
int spacedim>
4955 static std::array<unsigned int, 4>
4956 get_line_indices_of_cell(
const TriaAccessor<2, dim, spacedim> &cell)
4960 std::array<unsigned int, 4> line_indices = {};
4963 return line_indices;
4970 template <
int structdim,
int dim,
int spacedim>
4971 static std::array<unsigned int, 12>
4972 get_line_indices_of_cell(
4973 const TriaAccessor<structdim, dim, spacedim> &cell)
4975 std::array<unsigned int, 12> line_indices = {};
4983 for (
unsigned int f = 4; f < 6; ++f)
4985 const auto orientation =
4988 ->face_orientations.get_combined_orientation(
4997 const std::array<unsigned int, 4> my_indices{
4998 {ref_cell.standard_to_real_face_line(0, f, orientation),
4999 ref_cell.standard_to_real_face_line(1, f, orientation),
5000 ref_cell.standard_to_real_face_line(2, f, orientation),
5001 ref_cell.standard_to_real_face_line(3, f, orientation)}};
5002 const auto quad = cell.
quad(f);
5003 for (
unsigned int l = 0;
l < 4; ++
l)
5004 line_indices[4 * (f - 4) +
l] =
5005 quad->line_index(my_indices[l]);
5007 for (
unsigned int f = 0; f < 2; ++f)
5009 const auto orientation =
5012 ->face_orientations.get_combined_orientation(
5014 const std::array<unsigned int, 2> my_indices{
5015 {ref_cell.standard_to_real_face_line(0, f, orientation),
5016 ref_cell.standard_to_real_face_line(1, f, orientation)}};
5017 const auto quad = cell.
quad(f);
5018 line_indices[8 + f] = quad->line_index(my_indices[0]);
5019 line_indices[10 + f] = quad->line_index(my_indices[1]);
5024 std::array<unsigned int, 3> orientations{
5028 const std::array<unsigned int, 6> my_indices{
5029 {ref_cell.standard_to_real_face_line(0, 0, orientations[0]),
5030 ref_cell.standard_to_real_face_line(1, 0, orientations[0]),
5031 ref_cell.standard_to_real_face_line(2, 0, orientations[0]),
5032 ref_cell.standard_to_real_face_line(1, 1, orientations[1]),
5033 ref_cell.standard_to_real_face_line(2, 1, orientations[1]),
5034 ref_cell.standard_to_real_face_line(1, 2, orientations[2])}};
5035 line_indices[0] = cell.
quad(0)->line_index(my_indices[0]);
5036 line_indices[1] = cell.
quad(0)->line_index(my_indices[1]);
5037 line_indices[2] = cell.
quad(0)->line_index(my_indices[2]);
5038 line_indices[3] = cell.
quad(1)->line_index(my_indices[3]);
5039 line_indices[4] = cell.
quad(1)->line_index(my_indices[4]);
5040 line_indices[5] = cell.
quad(2)->line_index(my_indices[5]);
5048 return line_indices;
5057 template <
int dim,
int spacedim>
5058 static std::array<types::geometric_orientation, 1>
5059 get_line_orientations_of_cell(
const TriaAccessor<1, dim, spacedim> &)
5071 template <
int dim,
int spacedim>
5072 static std::array<types::geometric_orientation, 4>
5073 get_line_orientations_of_cell(
const TriaAccessor<2, dim, spacedim> &cell)
5077 std::array<types::geometric_orientation, 4> line_orientations = {};
5080 return line_orientations;
5089 template <
int dim,
int spacedim>
5090 static std::array<types::geometric_orientation, 12>
5091 get_line_orientations_of_cell(
const TriaAccessor<3, dim, spacedim> &cell)
5093 std::array<types::geometric_orientation, 12> line_orientations = {};
5101 for (
unsigned int f = 4; f < 6; ++f)
5103 const auto orientation =
5106 ->face_orientations.get_combined_orientation(
5115 const std::array<unsigned int, 4> my_indices{
5116 {ref_cell.standard_to_real_face_line(0, f, orientation),
5117 ref_cell.standard_to_real_face_line(1, f, orientation),
5118 ref_cell.standard_to_real_face_line(2, f, orientation),
5119 ref_cell.standard_to_real_face_line(3, f, orientation)}};
5120 const auto quad = cell.
quad(f);
5121 const std::array<types::geometric_orientation, 4>
5122 my_orientations{{ref_cell.face_to_cell_line_orientation(
5126 quad->line_orientation(my_indices[0])),
5127 ref_cell.face_to_cell_line_orientation(
5131 quad->line_orientation(my_indices[1])),
5132 ref_cell.face_to_cell_line_orientation(
5136 quad->line_orientation(my_indices[2])),
5137 ref_cell.face_to_cell_line_orientation(
5141 quad->line_orientation(my_indices[3]))}};
5142 for (
unsigned int l = 0;
l < 4; ++
l)
5143 line_orientations[4 * (f - 4) +
l] = my_orientations[
l];
5145 for (
unsigned int f = 0; f < 2; ++f)
5147 const auto orientation =
5150 ->face_orientations.get_combined_orientation(
5152 const std::array<unsigned int, 2> my_indices{
5153 {ref_cell.standard_to_real_face_line(0, f, orientation),
5154 ref_cell.standard_to_real_face_line(1, f, orientation)}};
5155 const auto quad = cell.
quad(f);
5156 const std::array<types::geometric_orientation, 2>
5157 my_orientations{{ref_cell.face_to_cell_line_orientation(
5161 quad->line_orientation(my_indices[0])),
5162 ref_cell.face_to_cell_line_orientation(
5166 quad->line_orientation(my_indices[1]))}};
5167 line_orientations[8 + f] = my_orientations[0];
5168 line_orientations[10 + f] = my_orientations[1];
5173 std::array<unsigned int, 3> orientations{
5177 const std::array<unsigned int, 6> my_indices{
5178 {ref_cell.standard_to_real_face_line(0, 0, orientations[0]),
5179 ref_cell.standard_to_real_face_line(1, 0, orientations[0]),
5180 ref_cell.standard_to_real_face_line(2, 0, orientations[0]),
5181 ref_cell.standard_to_real_face_line(1, 1, orientations[1]),
5182 ref_cell.standard_to_real_face_line(2, 1, orientations[1]),
5183 ref_cell.standard_to_real_face_line(1, 2, orientations[2])}};
5184 line_orientations[0] = ref_cell.face_to_cell_line_orientation(
5188 cell.
quad(0)->line_orientation(my_indices[0]));
5189 line_orientations[1] = ref_cell.face_to_cell_line_orientation(
5193 cell.
quad(0)->line_orientation(my_indices[1]));
5194 line_orientations[2] = ref_cell.face_to_cell_line_orientation(
5198 cell.
quad(0)->line_orientation(my_indices[2]));
5199 line_orientations[3] = ref_cell.face_to_cell_line_orientation(
5203 cell.
quad(1)->line_orientation(my_indices[3]));
5204 line_orientations[4] = ref_cell.face_to_cell_line_orientation(
5208 cell.
quad(1)->line_orientation(my_indices[4]));
5209 line_orientations[5] = ref_cell.face_to_cell_line_orientation(
5213 cell.
quad(2)->line_orientation(my_indices[5]));
5221 return line_orientations;
5229template <
int structdim,
int dim,
int spacedim>
5234 const AccessorData *local_data)
5240template <
int structdim,
int dim,
int spacedim>
5247 return this->objects().used[this->present_index];
5252template <
int structdim,
int dim,
int spacedim>
5255 const unsigned int i)
const
5264template <
int structdim,
int dim,
int spacedim>
5270 else if (structdim == 1)
5272 else if (structdim == dim)
5273 return this->tria->
levels[this->present_level]
5274 ->reference_cell[this->present_index];
5276 return this->tria->
faces->get_quad_type(this->present_index);
5281template <
int structdim,
int dim,
int spacedim>
5284 const unsigned int corner)
const
5288 if constexpr (structdim == 1)
5293 return this->objects()
5296 else if constexpr (structdim == dim)
5300 const auto my_index =
static_cast<std::size_t
>(this->present_index) *
5303 this->tria->
levels[this->present_level]
5304 ->cell_vertex_indices_cache.size());
5305 const unsigned int vertex_index =
5306 this->tria->
levels[this->present_level]
5307 ->cell_vertex_indices_cache[my_index + corner];
5309 return vertex_index;
5311 else if constexpr (structdim == 2)
5313 const auto [line_index, vertex_index] =
5315 const auto vertex_within_line_index =
5317 vertex_index, line_index, this->line_orientation(line_index));
5319 return this->line(line_index)->vertex_index(vertex_within_line_index);
5330template <
int structdim,
int dim,
int spacedim>
5339template <
int structdim,
int dim,
int spacedim>
5340inline typename ::internal::TriangulationImplementation::
5341 Iterators<dim, spacedim>::line_iterator
5345 return typename ::internal::TriangulationImplementation::
5346 Iterators<dim, spacedim>::line_iterator(this->tria, 0, line_index(i));
5351template <
int structdim,
int dim,
int spacedim>
5358 ExcMessage(
"You can't ask for the index of a line bounding a "
5359 "one-dimensional cell because it is not bounded by "
5362 if constexpr (structdim == 2)
5364 return this->objects()
5367 else if constexpr (structdim == 3)
5369 const auto [face_index, line_index] =
5371 const auto line_within_face_index =
5375 return this->quad(face_index)->line_index(line_within_face_index);
5384template <
int structdim,
int dim,
int spacedim>
5385inline typename ::internal::TriangulationImplementation::
5386 Iterators<dim, spacedim>::quad_iterator
5390 return typename ::internal::TriangulationImplementation::
5391 Iterators<dim, spacedim>::quad_iterator(this->tria, 0, quad_index(i));
5396template <
int structdim,
int dim,
int spacedim>
5401 ExcMessage(
"You can't ask for the index of a quad bounding "
5402 "a one- or two-dimensional cell because it is not "
5403 "bounded by quads."));
5406 if constexpr (structdim == 3)
5409 return this->tria->
levels[this->present_level]
5419template <
int structdim,
int dim,
int spacedim>
5422 const unsigned int face)
const
5427 ExcMessage(
"This function can only be used on objects "
5428 "that are cells, but not on faces or edges "
5429 "that bound cells."));
5433 if constexpr (structdim == 1)
5435 else if constexpr (structdim == 2)
5439 if (this->tria->
levels[this->present_level]
5440 ->face_orientations.n_objects() == 0)
5443 return this->tria->
levels[this->present_level]
5444 ->face_orientations.get_combined_orientation(
5448 return this->tria->
levels[this->present_level]
5449 ->face_orientations.get_combined_orientation(
5455template <
int structdim,
int dim,
int spacedim>
5458 const unsigned int face)
const
5463 ExcMessage(
"This function can only be used on objects "
5464 "that are cells, but not on faces or edges "
5465 "that bound cells."));
5469 if constexpr (structdim == 1)
5472 else if constexpr (structdim == 2)
5473 return this->line_orientation(face) ==
5476 return this->tria->
levels[this->present_level]
5477 ->face_orientations.get_orientation(
5483template <
int structdim,
int dim,
int spacedim>
5489 ExcMessage(
"This function can only be used on objects "
5490 "that are cells, but not on faces or edges "
5491 "that bound cells."));
5496 if constexpr (structdim == 3)
5497 return this->tria->
levels[this->present_level]->face_orientations.get_flip(
5506template <
int structdim,
int dim,
int spacedim>
5509 const unsigned int face)
const
5513 ExcMessage(
"This function can only be used on objects "
5514 "that are cells, but not on faces or edges "
5515 "that bound cells."));
5520 if constexpr (structdim == 3)
5521 return this->tria->
levels[this->present_level]
5522 ->face_orientations.get_rotation(
5532template <
int structdim,
int dim,
int spacedim>
5535 const unsigned int line)
const
5542 if constexpr (structdim == 1)
5544 else if constexpr (structdim == 2 && dim == 2)
5551 return combined_orientation;
5553 else if constexpr (structdim == 2 && dim == 3)
5560 Assert(index < this->tria->
faces->quads_line_orientations.size(),
5562 return this->tria->
faces->quads_line_orientations[
index] ?
5566 else if constexpr (structdim == 3 && dim == 3)
5571 const auto [face_index, line_index] =
5573 const auto line_within_face_index =
5582 this->quad(face_index)->line_orientation(line_within_face_index));
5593template <
int structdim,
int dim,
int spacedim>
5596 const unsigned int line,
5602 ExcMessage(
"In 1d lines are cells and thus do not need to have their "
5603 "orientations set."));
5605 ExcMessage(
"In 2d lines are faces, and, for compatibility with other "
5606 "dimensions, their orientations should be set via "
5607 "set_combined_face_orientation()."));
5613 if constexpr (dim == 3)
5620 Assert(index < this->tria->
faces->quads_line_orientations.size(),
5622 this->tria->
faces->quads_line_orientations[
index] =
5629template <
int structdim,
int dim,
int spacedim>
5632 const unsigned int face,
5638 ::internal::TriaAccessorImplementation::Implementation::
5639 set_combined_face_orientation(*
this, face, combined_orientation);
5644template <
int structdim,
int dim,
int spacedim>
5651 this->objects().used[this->present_index] =
true;
5656template <
int structdim,
int dim,
int spacedim>
5663 this->objects().used[this->present_index] =
false;
5667template <
int structdim,
int dim,
int spacedim>
5677 const unsigned int n_sets_of_two =
5679 return this->objects().children[n_sets_of_two * this->present_index + i / 2] +
5685template <
int structdim,
int dim,
int spacedim>
5688 const unsigned int i)
const
5695 return child_index(i);
5699 static_cast<std::uint8_t
>(refinement_case()));
5705 return child_index(i);
5707 (child(i % 2)->refinement_case() ==
5709 return child(i % 2)->child_index(i / 2);
5711 (child(i / 2)->refinement_case() ==
5713 return child(i / 2)->child_index(i % 2);
5718 "This cell has no grandchildren equivalent to isotropic refinement"));
5730template <
int structdim,
int dim,
int spacedim>
5742 this->objects().children[this->present_index] != -1 ?
5758 Assert(
static_cast<unsigned int>(this->present_index) <
5759 this->objects().refinement_cases.size(),
5762 this->objects().refinement_cases.size()));
5765 this->objects().refinement_cases[this->present_index]));
5771template <
int structdim,
int dim,
int spacedim>
5778 this->tria, (dim == structdim ? this->level() + 1 : 0), child_index(i));
5788template <
int structdim,
int dim,
int spacedim>
5793 const auto n_children = this->n_children();
5794 for (
unsigned int child_n = 0; child_n < n_children; ++child_n)
5795 if (this->child(child_n) == child)
5799 ExcMessage(
"The given child is not a child of the current object."));
5805template <
int structdim,
int dim,
int spacedim>
5808 const unsigned int i)
const
5821 static_cast<std::uint8_t
>(refinement_case()));
5829 (child(i % 2)->refinement_case() ==
5831 return child(i % 2)->child(i / 2);
5833 (child(i / 2)->refinement_case() ==
5835 return child(i / 2)->child(i % 2);
5840 "This cell has no grandchildren equivalent to isotropic refinement"));
5854template <
int structdim,
int dim,
int spacedim>
5865 const unsigned int n_sets_of_two =
5867 return (this->objects().children[n_sets_of_two * this->present_index] != -1);
5872template <
int structdim,
int dim,
int spacedim>
5888template <
int structdim,
int dim,
int spacedim>
5896 Assert(
static_cast<unsigned int>(this->present_index) <
5897 this->objects().refinement_cases.size(),
5900 this->objects().refinement_cases.size()));
5902 this->objects().refinement_cases[this->present_index] = refinement_case;
5906template <
int structdim,
int dim,
int spacedim>
5913 Assert(
static_cast<unsigned int>(this->present_index) <
5914 this->objects().refinement_cases.size(),
5917 this->objects().refinement_cases.size()));
5919 this->objects().refinement_cases[this->present_index] =
5925template <
int structdim,
int dim,
int spacedim>
5928 const int index)
const
5936 const unsigned int n_sets_of_two =
5944 (i == 0 && !this->has_children() && (index >= 0)) ||
5948 (i > 0 && this->has_children() && (index >= 0) &&
5949 this->objects().children[n_sets_of_two * this->present_index + i / 2] ==
5953 this->objects().children[n_sets_of_two * this->present_index + i / 2] =
index;
5958template <
int structdim,
int dim,
int spacedim>
5965 const unsigned int n_sets_of_two =
5968 for (
unsigned int i = 0; i < n_sets_of_two; ++i)
5969 set_children(2 * i, -1);
5974template <
int structdim,
int dim,
int spacedim>
5979 return this->objects().user_flags[this->present_index];
5984template <
int structdim,
int dim,
int spacedim>
5989 this->objects().user_flags[this->present_index] =
true;
5994template <
int structdim,
int dim,
int spacedim>
5999 this->objects().user_flags[this->present_index] =
false;
6004template <
int structdim,
int dim,
int spacedim>
6010 if (this->has_children())
6011 for (
unsigned int c = 0; c < this->n_children(); ++c)
6012 this->child(c)->recursively_set_user_flag();
6017template <
int structdim,
int dim,
int spacedim>
6023 if (this->has_children())
6024 for (
unsigned int c = 0; c < this->n_children(); ++c)
6025 this->child(c)->recursively_clear_user_flag();
6030template <
int structdim,
int dim,
int spacedim>
6035 this->objects().clear_user_data(this->present_index);
6040template <
int structdim,
int dim,
int spacedim>
6045 this->objects().user_pointer(this->present_index) = p;
6050template <
int structdim,
int dim,
int spacedim>
6055 this->objects().user_pointer(this->present_index) =
nullptr;
6060template <
int structdim,
int dim,
int spacedim>
6065 return this->objects().user_pointer(this->present_index);
6070template <
int structdim,
int dim,
int spacedim>
6075 set_user_pointer(p);
6077 if (this->has_children())
6078 for (
unsigned int c = 0; c < this->n_children(); ++c)
6079 this->child(c)->recursively_set_user_pointer(p);
6084template <
int structdim,
int dim,
int spacedim>
6088 clear_user_pointer();
6090 if (this->has_children())
6091 for (
unsigned int c = 0; c < this->n_children(); ++c)
6092 this->child(c)->recursively_clear_user_pointer();
6097template <
int structdim,
int dim,
int spacedim>
6100 const unsigned int p)
const
6103 this->objects().user_index(this->present_index) = p;
6108template <
int structdim,
int dim,
int spacedim>
6113 this->objects().user_index(this->present_index) = 0;
6118template <
int structdim,
int dim,
int spacedim>
6123 return this->objects().user_index(this->present_index);
6128template <
int structdim,
int dim,
int spacedim>
6131 const unsigned int p)
const
6135 if (this->has_children())
6136 for (
unsigned int c = 0; c < this->n_children(); ++c)
6137 this->child(c)->recursively_set_user_index(p);
6142template <
int structdim,
int dim,
int spacedim>
6148 if (this->has_children())
6149 for (
unsigned int c = 0; c < this->n_children(); ++c)
6150 this->child(c)->recursively_clear_user_index();
6155template <
int structdim,
int dim,
int spacedim>
6159 if (!this->has_children())
6162 unsigned int max_depth = 1;
6163 for (
unsigned int c = 0; c < n_children(); ++c)
6164 max_depth =
std::max(max_depth, child(c)->max_refinement_depth() + 1);
6170template <
int structdim,
int dim,
int spacedim>
6174 if (!this->has_children())
6178 unsigned int sum = 0;
6179 for (
unsigned int c = 0; c < n_children(); ++c)
6180 sum += this->child(c)->n_active_descendants();
6187template <
int structdim,
int dim,
int spacedim>
6194 return this->objects()
6195 .boundary_or_material_id[this->present_index]
6201template <
int structdim,
int dim,
int spacedim>
6209 ExcMessage(
"You are trying to set the boundary_id to an invalid "
6210 "value (numbers::internal_face_boundary_id is reserved)."));
6211 Assert(this->at_boundary(),
6212 ExcMessage(
"You are trying to set the boundary_id of an "
6213 "internal object, which is not allowed!"));
6215 this->objects().boundary_or_material_id[this->present_index].boundary_id =
6221template <
int structdim,
int dim,
int spacedim>
6229 this->objects().boundary_or_material_id[this->present_index].boundary_id =
6235template <
int structdim,
int dim,
int spacedim>
6240 set_boundary_id(boundary_ind);
6252 for (
unsigned int i = 0; i < this->n_lines(); ++i)
6253 this->line(i)->set_boundary_id(boundary_ind);
6263template <
int structdim,
int dim,
int spacedim>
6274template <
int structdim,
int dim,
int spacedim>
6283template <
int structdim,
int dim,
int spacedim>
6289 return this->objects().manifold_id[this->present_index];
6294template <
int structdim,
int dim,
int spacedim>
6301 this->objects().manifold_id[this->present_index] = manifold_ind;
6305template <
int structdim,
int dim,
int spacedim>
6310 set_manifold_id(manifold_ind);
6312 if (this->has_children())
6313 for (
unsigned int c = 0; c < this->n_children(); ++c)
6314 this->child(c)->set_all_manifold_ids(manifold_ind);
6330 for (
unsigned int i = 0; i < this->n_lines(); ++i)
6331 this->line(i)->set_manifold_id(manifold_ind);
6340template <
int structdim,
int dim,
int spacedim>
6344 boost::container::small_vector<Point<spacedim>,
6351 vertices(this->n_vertices());
6353 for (
unsigned int v = 0; v < vertices.size(); ++v)
6354 vertices[v] = this->vertex(v);
6356 return internal::TriaAccessorImplementation::diameter<structdim, spacedim>(
6362template <
int dim,
int spacedim>
6367 return internal::TriaAccessorImplementation::diameter<dim, spacedim>(
6369 this->tria, this->level(), this->index())));
6374template <
int structdim,
int dim,
int spacedim>
6375std::pair<Point<spacedim>,
double>
6383 return std::make_pair((this->vertex(1) + this->vertex(0)) * 0.5,
6384 (this->vertex(1) - this->vertex(0)).
norm() * 0.5);
6392 std::vector<bool> is_initial_guess_vertex(this->n_vertices());
6395 std::fill(is_initial_guess_vertex.begin(),
6396 is_initial_guess_vertex.end(),
6409 if (p30.norm() > p21.norm())
6411 center = this->vertex(0) + 0.5 * p30;
6412 radius = p30.norm() / 2.;
6413 is_initial_guess_vertex[3] =
true;
6414 is_initial_guess_vertex[0] =
true;
6418 center = this->vertex(1) + 0.5 * p21;
6419 radius = p21.norm() / 2.;
6420 is_initial_guess_vertex[2] =
true;
6421 is_initial_guess_vertex[1] =
true;
6431 const std::vector<double> diagonals = {p70.norm(),
6435 const std::vector<double>::const_iterator it =
6436 std::max_element(diagonals.begin(), diagonals.end());
6437 if (it == diagonals.begin())
6439 center = this->vertex(0) + 0.5 * p70;
6440 is_initial_guess_vertex[7] =
true;
6441 is_initial_guess_vertex[0] =
true;
6443 else if (it == diagonals.begin() + 1)
6445 center = this->vertex(1) + 0.5 * p61;
6446 is_initial_guess_vertex[6] =
true;
6447 is_initial_guess_vertex[1] =
true;
6449 else if (it == diagonals.begin() + 2)
6451 center = this->vertex(5) + 0.5 * p25;
6452 is_initial_guess_vertex[2] =
true;
6453 is_initial_guess_vertex[5] =
true;
6457 center = this->vertex(4) + 0.5 * p34;
6458 is_initial_guess_vertex[3] =
true;
6459 is_initial_guess_vertex[4] =
true;
6466 return std::pair<Point<spacedim>,
double>();
6472 for (
const unsigned int v : this->vertex_indices())
6473 if (!is_initial_guess_vertex[v])
6475 const double distance = center.
distance(this->vertex(v));
6476 if (distance > radius)
6481 radius = (distance + radius) * 0.5;
6482 center = this->vertex(v) + pCV * (radius / distance);
6491 bool all_vertices_within_ball =
true;
6495 for (
const unsigned int v : this->vertex_indices())
6496 if (center.
distance(this->vertex(v)) >
6497 radius + 100. * std::numeric_limits<double>::epsilon())
6499 all_vertices_within_ball =
false;
6505 return std::make_pair(center, radius);
6509template <
int structdim,
int dim,
int spacedim>
6516 return (this->vertex(1) - this->vertex(0)).norm();
6520 double min = std::numeric_limits<double>::max();
6521 for (
const unsigned int i : this->vertex_indices())
6522 for (
unsigned int j = i + 1; j < this->n_vertices(); ++j)
6524 (this->vertex(i) - this->vertex(j)) *
6525 (this->vertex(i) - this->vertex(j)));
6535template <
int structdim,
int dim,
int spacedim>
6555 bool is_translation =
true;
6558 for (
unsigned int i = 1; i < this->n_vertices(); ++i)
6561 (o->vertex(i) - this->vertex(i)) - dist;
6564 is_translation =
false;
6568 return is_translation;
6573template <
int structdim,
int dim,
int spacedim>
6582template <
int structdim,
int dim,
int spacedim>
6586 return this->reference_cell().
n_lines();
6591template <
int structdim,
int dim,
int spacedim>
6596 ExcMessage(
"This function can only be used on objects "
6597 "that are cells, but not on faces or edges "
6598 "that bound cells."));
6600 return this->reference_cell().
n_faces();
6605template <
int structdim,
int dim,
int spacedim>
6615template <
int structdim,
int dim,
int spacedim>
6625template <
int structdim,
int dim,
int spacedim>
6637template <
int dim,
int spacedim>
6640 const unsigned int vertex_index)
6647template <
int dim,
int spacedim>
6652 const AccessorData *)
6659template <
int dim,
int spacedim>
6660template <
int structdim2,
int dim2,
int spacedim2>
6671template <
int dim,
int spacedim>
6672template <
int structdim2,
int dim2,
int spacedim2>
6683template <
int dim,
int spacedim>
6693template <
int dim,
int spacedim>
6700 return (global_vertex_index < other.global_vertex_index);
6705template <
int dim,
int spacedim>
6717template <
int dim,
int spacedim>
6726template <
int dim,
int spacedim>
6735template <
int dim,
int spacedim>
6744template <
int dim,
int spacedim>
6749 if (global_vertex_index >= tria->
n_vertices())
6755template <
int dim,
int spacedim>
6761 if (global_vertex_index != 0)
6770template <
int dim,
int spacedim>
6782template <
int dim,
int spacedim>
6786 return !(*
this == t);
6791template <
int dim,
int spacedim>
6800template <
int dim,
int spacedim>
6810template <
int dim,
int spacedim>
6811inline typename ::internal::TriangulationImplementation::
6812 Iterators<dim, spacedim>::line_iterator
6815 return typename ::internal::TriangulationImplementation::
6816 Iterators<dim, spacedim>::line_iterator();
6821template <
int dim,
int spacedim>
6831template <
int dim,
int spacedim>
6832inline typename ::internal::TriangulationImplementation::
6833 Iterators<dim, spacedim>::quad_iterator
6836 return typename ::internal::TriangulationImplementation::
6837 Iterators<dim, spacedim>::quad_iterator();
6842template <
int dim,
int spacedim>
6852template <
int dim,
int spacedim>
6861template <
int dim,
int spacedim>
6870template <
int dim,
int spacedim>
6879template <
int dim,
int spacedim>
6888template <
int dim,
int spacedim>
6891 const unsigned int )
6898template <
int dim,
int spacedim>
6907template <
int dim,
int spacedim>
6916template <
int dim,
int spacedim>
6925template <
int dim,
int spacedim>
6934template <
int dim,
int spacedim>
6943template <
int dim,
int spacedim>
6952template <
int dim,
int spacedim>
6961template <
int dim,
int spacedim>
6970template <
int dim,
int spacedim>
6980template <
int dim,
int spacedim>
6989template <
int dim,
int spacedim>
6998template <
int dim,
int spacedim>
7007template <
int dim,
int spacedim>
7016template <
int dim,
int spacedim>
7025template <
int dim,
int spacedim>
7036template <
int spacedim>
7039 const VertexKind vertex_kind,
7040 const unsigned int vertex_index)
7042 , vertex_kind(vertex_kind)
7048template <
int spacedim>
7053 const AccessorData *)
7055 , vertex_kind(interior_vertex)
7069 "This constructor can not be called for face iterators in 1d, "
7070 "except to default-construct iterator objects."));
7075template <
int spacedim>
7076template <
int structdim2,
int dim2,
int spacedim2>
7080 , vertex_kind(interior_vertex)
7088template <
int spacedim>
7089template <
int structdim2,
int dim2,
int spacedim2>
7093 , vertex_kind(interior_vertex)
7101template <
int spacedim>
7106 vertex_kind = t.vertex_kind;
7112template <
int spacedim>
7125template <
int spacedim>
7132 return (global_vertex_index < other.global_vertex_index);
7137template <
int spacedim>
7145template <
int spacedim>
7154template <
int spacedim>
7163template <
int spacedim>
7172template <
int spacedim>
7180template <
int spacedim>
7189template <
int spacedim>
7206template <
int spacedim>
7210 return !(*
this == t);
7215template <
int spacedim>
7226template <
int spacedim>
7238template <
int spacedim>
7247template <
int spacedim>
7248inline typename ::internal::TriangulationImplementation::
7249 Iterators<1, spacedim>::line_iterator
7256template <
int spacedim>
7265template <
int spacedim>
7266inline typename ::internal::TriangulationImplementation::
7267 Iterators<1, spacedim>::quad_iterator
7275template <
int spacedim>
7285template <
int spacedim>
7294template <
int spacedim>
7298 return vertex_kind != interior_vertex;
7302template <
int spacedim>
7306 switch (vertex_kind)
7312 this->vertex_index()) !=
7326template <
int spacedim>
7335template <
int spacedim>
7347template <
int spacedim>
7350 const unsigned int )
7356template <
int spacedim>
7365template <
int spacedim>
7374template <
int spacedim>
7383template <
int spacedim>
7392template <
int spacedim>
7401template <
int spacedim>
7410template <
int spacedim>
7419template <
int spacedim>
7428template <
int spacedim>
7438template <
int spacedim>
7446template <
int spacedim>
7454template <
int spacedim>
7461template <
int spacedim>
7469template <
int spacedim>
7478template <
int spacedim>
7484 ExcMessage(
"You can't set the boundary_id of a face of a cell that is "
7485 "not actually at the boundary."));
7492template <
int spacedim>
7501template <
int spacedim>
7511template <
int spacedim>
7520template <
int spacedim>
7529template <
int spacedim>
7538template <
int spacedim>
7547template <
int spacedim>
7556template <
int spacedim>
7566template <
int spacedim>
7577template <
int dim,
int spacedim>
7582 const AccessorData *local_data)
7588template <
int dim,
int spacedim>
7592 static_cast<const
TriaAccessor<dim, dim, spacedim> &>(cell_accessor))
7597template <
int dim,
int spacedim>
7602 this->present_level + 1,
7603 this->child_index(i));
7613template <
int dim,
int spacedim>
7614inline boost::container::small_vector<TriaIterator<CellAccessor<dim, spacedim>>,
7618 boost::container::small_vector<TriaIterator<CellAccessor<dim, spacedim>>,
7620 child_iterators(this->n_children());
7622 for (
unsigned int i = 0; i < this->n_children(); ++i)
7623 child_iterators[i] = this->child(i);
7625 return child_iterators;
7630template <
int dim,
int spacedim>
7635 if constexpr (dim == 1)
7638 VertexKind vertex_kind = VertexKind::interior_vertex;
7639 if (i == 0 && at_boundary(0))
7640 vertex_kind = VertexKind::left_vertex;
7641 if (i == 1 && at_boundary(1))
7642 vertex_kind = VertexKind::right_vertex;
7645 this->vertex_index(i));
7648 else if constexpr (dim == 2)
7649 return this->line(i);
7650 else if constexpr (dim == 3)
7651 return this->quad(i);
7661template <
int dim,
int spacedim>
7666 for (
const unsigned int face_n : this->face_indices())
7667 if (this->face(face_n) == face)
7671 ExcMessage(
"The given face is not a face of the current cell."));
7677template <
int dim,
int spacedim>
7678inline boost::container::small_vector<
7688 boost::container::small_vector<
7696 face_iterators(this->n_faces());
7698 for (
const unsigned int i : this->face_indices())
7699 face_iterators[i] = this->face(i);
7701 return face_iterators;
7706template <
int dim,
int spacedim>
7713 return this->vertex_index(i);
7716 return this->line_index(i);
7719 return this->quad_index(i);
7728template <
int dim,
int spacedim>
7733 return this->tria->
levels[this->present_level]
7741template <
int dim,
int spacedim>
7746 return this->tria->
levels[this->present_level]
7754template <
int dim,
int spacedim>
7764 Assert(this->is_active() || !this->tria->
levels[this->present_level]
7765 ->refine_flags[this->present_index],
7766 ExcRefineCellNotActive());
7768 this->tria->
levels[this->present_level]->refine_flags[this->present_index]);
7773template <
int dim,
int spacedim>
7778 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7779 Assert(!coarsen_flag_set(), ExcCellFlaggedForCoarsening());
7781 this->tria->
levels[this->present_level]->refine_flags[this->present_index] =
7787template <
int dim,
int spacedim>
7791 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7792 this->tria->
levels[this->present_level]->refine_flags[this->present_index] =
7797template <
int dim,
int spacedim>
7802 if (this->tria->
levels[this->present_level]->refine_choice.size() == 0)
7804 return this->tria->
levels[this->present_level]
7805 ->refine_choice[this->present_index];
7809template <
int dim,
int spacedim>
7812 const std::uint8_t refinement_choice)
const
7814 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7815 if (this->tria->
levels[this->present_level]->refine_choice.size() != 0)
7816 this->tria->
levels[this->present_level]
7817 ->refine_choice[this->present_index] = refinement_choice;
7821template <
int dim,
int spacedim>
7825 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7826 if (this->tria->
levels[this->present_level]->refine_choice.size() != 0)
7827 this->tria->
levels[this->present_level]
7828 ->refine_choice[this->present_index] =
7833template <
int dim,
int spacedim>
7836 const unsigned int face_no,
7852 face_refinement_case,
7854 this->face_orientation(face_no),
7855 this->face_flip(face_no),
7856 this->face_rotation(face_no)));
7857 set_refine_flag(new_ref_case);
7860 return new_ref_case != old_ref_case;
7865template <
int dim,
int spacedim>
7868 const unsigned int line_no)
const
7878 old_ref_case = refine_flag_set(),
7882 set_refine_flag(new_ref_case);
7885 return new_ref_case != old_ref_case;
7890template <
int dim,
int spacedim>
7897 if constexpr (dim == 1)
7899 else if constexpr (dim == 2)
7900 return ((face(face_no)->has_children()) ?
7903 else if constexpr (dim == 3)
7905 switch (
static_cast<std::uint8_t
>(face(face_no)->refinement_case()))
7910 if (face(face_no)->child(0)->has_children())
7912 Assert(face(face_no)->child(0)->refinement_case() ==
7915 if (face(face_no)->child(1)->has_children())
7917 Assert(face(face_no)->child(1)->refinement_case() ==
7927 if (face(face_no)->child(1)->has_children())
7929 Assert(face(face_no)->child(1)->refinement_case() ==
7938 if (face(face_no)->child(0)->has_children())
7940 Assert(face(face_no)->child(0)->refinement_case() ==
7943 if (face(face_no)->child(1)->has_children())
7945 Assert(face(face_no)->child(1)->refinement_case() ==
7955 if (face(face_no)->child(1)->has_children())
7957 Assert(face(face_no)->child(1)->refinement_case() ==
7979template <
int dim,
int spacedim>
7989 Assert(this->is_active() || !this->tria->
levels[this->present_level]
7990 ->coarsen_flags[this->present_index],
7991 ExcRefineCellNotActive());
7992 return this->tria->
levels[this->present_level]
7993 ->coarsen_flags[this->present_index];
7998template <
int dim,
int spacedim>
8002 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
8003 Assert(!refine_flag_set(), ExcCellFlaggedForRefinement());
8005 this->tria->
levels[this->present_level]->coarsen_flags[this->present_index] =
8011template <
int dim,
int spacedim>
8015 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
8016 this->tria->
levels[this->present_level]->coarsen_flags[this->present_index] =
8022template <
int dim,
int spacedim>
8027 neighbor_level(face_no),
8028 neighbor_index(face_no));
8038template <
int dim,
int spacedim>
8042 return !this->has_children();
8047template <
int dim,
int spacedim>
8051 Assert(this->is_active(),
8052 ExcMessage(
"is_locally_owned() can only be called on active cells!"));
8053# ifndef DEAL_II_WITH_MPI
8070template <
int dim,
int spacedim>
8074# ifndef DEAL_II_WITH_MPI
8085 this->level_subdomain_id() == locally_owned_subdomain);
8091template <
int dim,
int spacedim>
8095 Assert(this->is_active(),
8096 ExcMessage(
"is_ghost() can only be called on active cells!"));
8097 if (this->has_children())
8100# ifndef DEAL_II_WITH_MPI
8113 subdomain_id != locally_owned_subdomain &&
8120template <
int dim,
int spacedim>
8124# ifndef DEAL_II_WITH_MPI
8136 subdomain_id != locally_owned_subdomain &&
8144template <
int dim,
int spacedim>
8148 Assert(this->is_active(),
8149 ExcMessage(
"is_artificial() can only be called on active cells!"));
8150# ifndef DEAL_II_WITH_MPI
8166template <
int dim,
int spacedim>
8170# ifndef DEAL_II_WITH_MPI
8181template <
int dim,
int spacedim>
8186 Assert(this->is_active(),
8187 ExcMessage(
"subdomain_id() can only be called on active cells!"));
8188 return this->tria->
levels[this->present_level]
8189 ->subdomain_ids[this->present_index];
8194template <
int dim,
int spacedim>
8199 return this->tria->
levels[this->present_level]
8200 ->level_subdomain_ids[this->present_index];
8205template <
int dim,
int spacedim>
8209 const unsigned int n2 = neighbor_of_neighbor_internal(neighbor);
8216 return neighbor_of_coarser_neighbor(neighbor).first;
8221template <
int dim,
int spacedim>
8230template <
int dim,
int spacedim>
8235 return this->tria->
levels[this->present_level]
8236 ->active_cell_indices[this->present_index];
8241template <
int dim,
int spacedim>
8246 Assert(this->is_active(),
8248 "global_active_cell_index() can only be called on active cells!"));
8250 return this->tria->
levels[this->present_level]
8251 ->global_active_cell_indices[this->present_index];
8256template <
int dim,
int spacedim>
8260 return this->tria->
levels[this->present_level]
8261 ->global_level_cell_indices[this->present_index];
void recursively_set_subdomain_id(const types::subdomain_id new_subdomain_id) const
CellAccessor(const Triangulation< dim, spacedim > *parent=nullptr, const int level=-1, const int index=-1, const AccessorData *local_data=nullptr)
TriaIterator< CellAccessor< dim, spacedim > > parent() const
unsigned int neighbor_face_no(const unsigned int neighbor) const
void set_active_cell_index(const unsigned int active_cell_index) const
unsigned int neighbor_of_neighbor_internal(const unsigned int neighbor) const
Triangulation< dim, spacedim > Container
TriaIterator< CellAccessor< dim, spacedim > > periodic_neighbor(const unsigned int i) const
types::global_cell_index global_active_cell_index() const
void set_neighbor(const unsigned int i, const TriaIterator< CellAccessor< dim, spacedim > > &pointer) const
TriaIterator< CellAccessor< dim, spacedim > > neighbor(const unsigned int face_no) const
internal::SubfaceCase< dim > subface_case(const unsigned int face_no) const
boost::container::small_vector< TriaIterator< TriaAccessor< dim - 1, dim, spacedim > >, ReferenceCells::max_n_faces< dim >() > face_iterators() const
bool is_artificial_on_level() const
void set_direction_flag(const bool new_direction_flag) const
void recursively_set_material_id(const types::material_id new_material_id) const
void set_level_subdomain_id(const types::subdomain_id new_level_subdomain_id) const
types::subdomain_id level_subdomain_id() const
std::uint8_t refine_choice() const
RefinementCase< dim > refine_flag_set() const
bool flag_for_face_refinement(const unsigned int face_no, const RefinementCase< dim - 1 > &face_refinement_case=RefinementCase< dim - 1 >::isotropic_refinement) const
unsigned int face_index(const unsigned int i) const
double diameter(const Mapping< dim, spacedim > &mapping) const
TriaActiveIterator< DoFCellAccessor< dim, spacedim, false > > as_dof_handler_iterator(const DoFHandler< dim, spacedim > &dof_handler) const
bool at_boundary(const unsigned int i) const
CellAccessor< dim, spacedim > & operator=(CellAccessor< dim, spacedim > &&)=default
TriaIterator< CellAccessor< dim, spacedim > > neighbor_child_on_subface(const unsigned int face_no, const unsigned int subface_no) const
void set_subdomain_id(const types::subdomain_id new_subdomain_id) const
bool neighbor_is_coarser(const unsigned int face_no) const
TriaIterator< CellAccessor< dim, spacedim > > child(const unsigned int i) const
void set_global_level_cell_index(const types::global_cell_index index) const
bool has_periodic_neighbor(const unsigned int i) const
void clear_refine_choice() const
int periodic_neighbor_level(const unsigned int i) const
std::pair< unsigned int, unsigned int > neighbor_of_coarser_neighbor(const unsigned int neighbor) const
CellAccessor(const CellAccessor< dim, spacedim > &)=default
void set_coarsen_flag() const
TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > face(const unsigned int i) const
CellAccessor< dim, spacedim > & operator=(const CellAccessor< dim, spacedim > &)=delete
unsigned int neighbor_of_neighbor(const unsigned int face_no) const
unsigned int face_iterator_to_index(const TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > &face) const
void set_material_id(const types::material_id new_material_id) const
bool is_locally_owned() const
void set_refine_flag(const RefinementCase< dim > ref_case=RefinementCase< dim >::isotropic_refinement) const
CellAccessor(CellAccessor< dim, spacedim > &&)=default
bool point_inside_codim(const Point< spacedim_ > &p) const
typename TriaAccessor< dim, dim, spacedim >::AccessorData AccessorData
bool is_locally_owned_on_level() const
bool has_boundary_lines() const
TriaIterator< CellAccessor< dim, spacedim > > periodic_neighbor_child_on_subface(const unsigned int face_no, const unsigned int subface_no) const
int neighbor_level(const unsigned int face_no) const
int periodic_neighbor_index(const unsigned int i) const
CellAccessor(const InvalidAccessor< structdim2, dim2, spacedim2 > &)
bool periodic_neighbor_is_coarser(const unsigned int i) const
void set_global_active_cell_index(const types::global_cell_index index) const
void clear_coarsen_flag() const
void set_refine_choice(const std::uint8_t refinement_choice=static_cast< char >(IsotropicRefinementChoice::isotropic_refinement)) const
boost::container::small_vector< TriaIterator< CellAccessor< dim, spacedim > >, GeometryInfo< dim >::max_children_per_cell > child_iterators() const
void set_parent(const unsigned int parent_index)
std::pair< unsigned int, unsigned int > periodic_neighbor_of_coarser_periodic_neighbor(const unsigned face_no) const
CellAccessor(const TriaAccessor< dim, dim, spacedim > &cell_accessor)
unsigned int active_cell_index() const
static bool is_level_cell()
void clear_refine_flag() const
int neighbor_index(const unsigned int face_no) const
bool point_inside(const Point< spacedim > &p) const
types::subdomain_id subdomain_id() const
bool direction_flag() const
types::material_id material_id() const
bool coarsen_flag_set() const
types::global_cell_index global_level_cell_index() const
bool flag_for_line_refinement(const unsigned int line_no) const
CellAccessor(const TriaAccessor< structdim2, dim2, spacedim2 > &)
bool is_artificial() const
TriaIterator< DoFCellAccessor< dim, spacedim, true > > as_dof_handler_level_iterator(const DoFHandler< dim, spacedim > &dof_handler) const
bool is_ghost_on_level() const
TriaIterator< CellAccessor< dim, spacedim > > neighbor_or_periodic_neighbor(const unsigned int i) const
unsigned int periodic_neighbor_of_periodic_neighbor(const unsigned int i) const
unsigned int periodic_neighbor_face_no(const unsigned int i) const
void set_manifold_id(const types::manifold_id) const
InvalidAccessor(const InvalidAccessor &)
static constexpr unsigned int space_dimension
bool operator==(const InvalidAccessor &) const
Point< spacedim > & vertex(const unsigned int i) const
void * quad(const unsigned int i) const
void * line(const unsigned int i) const
static IteratorState::IteratorStates state()
bool operator!=(const InvalidAccessor &) const
bool has_children() const
unsigned int user_index() const
static const unsigned int structure_dimension
void copy_from(const InvalidAccessor &)
void set_user_index(const unsigned int p) const
types::manifold_id manifold_id() const
InvalidAccessor(const void *parent=nullptr, const int level=-1, const int index=-1, const AccessorData *local_data=nullptr)
static constexpr unsigned int dimension
Abstract base class for mapping classes.
numbers::NumberTraits< Number >::real_type distance(const Point< dim, Number > &p) const
unsigned int n_vertices() const
unsigned int standard_to_real_face_vertex(const unsigned int vertex, const unsigned int face, const types::geometric_orientation face_orientation) const
std::array< unsigned int, 2 > standard_vertex_to_face_and_vertex_index(const unsigned int vertex) const
std::array< unsigned int, 2 > standard_line_to_face_and_line_index(const unsigned int line) const
unsigned int n_face_orientations(const unsigned int face_no) const
unsigned int n_faces() const
unsigned int n_lines() const
static ReferenceCell n_vertices_to_type(const int dim, const unsigned int n_vertices)
unsigned int standard_to_real_face_line(const unsigned int line, const unsigned int face, const types::geometric_orientation face_orientation) const
constexpr numbers::NumberTraits< Number >::real_type norm_square() const
bool operator!=(const TriaAccessorBase &) const
static constexpr unsigned int space_dimension
static constexpr unsigned int dimension
TriaAccessorBase(const TriaAccessorBase &)
friend class TriaIterator
void operator=(const TriaAccessorBase *)=delete
static const unsigned int structure_dimension
TriaAccessorBase(const Triangulation< dim, spacedim > *parent=nullptr, const int level=-1, const int index=-1, const AccessorData *=nullptr)
void copy_from(const TriaAccessorBase &)
friend class TriaActiveIterator
const Triangulation< dim, spacedim > & get_triangulation() const
IteratorState::IteratorStates state() const
bool operator<(const TriaAccessorBase &other) const
typename::internal::TriaAccessorImplementation::PresentLevelType< structdim, dim >::type present_level
friend class TriaRawIterator
::internal::TriangulationImplementation::TriaObjects & objects() const
TriaAccessorBase & operator=(const TriaAccessorBase &)
const Triangulation< dim, spacedim > * tria
bool operator==(const TriaAccessorBase &) const
double extent_in_direction(const unsigned int axis) const
TriaAccessor(const Triangulation< dim, spacedim > *tria, const unsigned int vertex_index)
static constexpr unsigned int space_dimension
Point< spacedim > & vertex(const unsigned int i=0) const
static typename::internal::TriangulationImplementation::Iterators< dim, spacedim >::line_iterator line(const unsigned int)
bool operator!=(const TriaAccessor &) const
static RefinementCase< 0 > refinement_case()
friend class TriaIterator
void copy_from(const TriaAccessor &)
static TriaIterator< TriaAccessor< 0, dim, spacedim > > child(const unsigned int)
Return an invalid object.
friend class TriaActiveIterator
unsigned int global_vertex_index
static const unsigned int structure_dimension
TriaAccessor(const InvalidAccessor< structdim2, dim2, spacedim2 > &)
static int child_index(const unsigned int i)
Returns -1.
bool operator==(const TriaAccessor &) const
static unsigned int line_index(const unsigned int i)
static TriaIterator< TriaAccessor< 0, dim, spacedim > > isotropic_child(const unsigned int)
Return an invalid object.
static typename::internal::TriangulationImplementation::Iterators< dim, spacedim >::quad_iterator quad(const unsigned int i)
unsigned int vertex_index(const unsigned int i=0) const
const Triangulation< dim, spacedim > * tria
static int isotropic_child_index(const unsigned int i)
Returns -1.
TriaAccessor(const Triangulation< dim, spacedim > *tria=nullptr, const int level=0, const int index=0, const AccessorData *=nullptr)
static unsigned int n_children()
const Triangulation< dim, spacedim > & get_triangulation() const
friend class TriaRawIterator
static unsigned int child_iterator_to_index(const TriaIterator< TriaAccessor< 0, dim, spacedim > > &)
Return an invalid unsigned integer.
static unsigned int max_refinement_depth()
static unsigned int quad_index(const unsigned int i)
static unsigned int n_active_descendants()
TriaAccessor(const TriaAccessor< structdim2, dim2, spacedim2 > &)
static bool has_children()
Point< spacedim > center(const bool respect_manifold=false, const bool interpolate_from_surrounding=false) const
IteratorState::IteratorStates state() const
static constexpr unsigned int dimension
std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices() const
void clear_children() const
void set_boundary_id_internal(const types::boundary_id id) const
TriaAccessor(TriaAccessor &&)=default
unsigned int n_active_descendants() const
void * user_pointer() const
TriaIterator< TriaAccessor< 0, dim, spacedim > > vertex_iterator(const unsigned int i) const
Point< structdim > real_to_unit_cell_affine_approximation(const Point< spacedim > &point) const
unsigned int line_index(const unsigned int i) const
const Manifold< dim, spacedim > & get_manifold() const
unsigned int n_lines() const
double extent_in_direction(const unsigned int axis) const
Point< spacedim > intermediate_point(const Point< structdim > &coordinates) const
unsigned int n_vertices() const
bool has_children() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > line_indices() const
Point< spacedim > barycenter() const
BoundingBox< spacedim > bounding_box() const
void recursively_set_user_index(const unsigned int p) const
void set_bounding_object_indices(const std::initializer_list< unsigned int > &new_indices) const
TriaIterator< TriaAccessor< structdim, dim, spacedim > > child(const unsigned int i) const
unsigned int n_children() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices() const
void set_boundary_id(const types::boundary_id) const
bool is_translation_of(const TriaIterator< TriaAccessor< structdim, dim, spacedim > > &o) const
void recursively_set_user_pointer(void *p) const
void clear_user_index() const
void set_used_flag() const
types::manifold_id manifold_id() const
TriaAccessor(const TriaAccessor &)=default
void recursively_clear_user_pointer() const
void clear_used_flag() const
std::pair< Point< spacedim >, double > enclosing_ball() const
unsigned int vertex_index(const unsigned int i) const
void set_user_pointer(void *p) const
int isotropic_child_index(const unsigned int i) const
Point< spacedim > center(const bool respect_manifold=false, const bool interpolate_from_surrounding=false) const
void set_refinement_case(const RefinementCase< structdim > &ref_case) const
typename TriaAccessorBase< structdim, dim, spacedim >::AccessorData AccessorData
double minimum_vertex_distance() const
void set_all_boundary_ids(const types::boundary_id) const
void set_bounding_object_indices(const std::initializer_list< int > &new_indices) const
void clear_user_flag() const
unsigned int max_refinement_depth() const
void clear_user_pointer() const
void recursively_set_user_flag() const
void set_user_index(const unsigned int p) const
void clear_user_data() const
Point< spacedim > & vertex(const unsigned int i) const
void set_user_flag() const
void set_line_orientation(const unsigned int line, const types::geometric_orientation orientation) const
bool user_flag_set() const
unsigned int quad_index(const unsigned int i) const
TriaAccessor & operator=(const TriaAccessor &)=delete
int child_index(const unsigned int i) const
ReferenceCell reference_cell() const
RefinementCase< structdim > refinement_case() const
typename::internal::TriangulationImplementation::Iterators< dim, spacedim >::line_iterator line(const unsigned int i) const
void recursively_clear_user_flag() const
TriaAccessor(const Triangulation< dim, spacedim > *parent=nullptr, const int level=-1, const int index=-1, const AccessorData *local_data=nullptr)
unsigned int child_iterator_to_index(const TriaIterator< TriaAccessor< structdim, dim, spacedim > > &child) const
void set_children(const unsigned int i, const int index) const
void recursively_clear_user_index() const
void clear_refinement_case() const
types::boundary_id boundary_id() const
unsigned int n_faces() const
TriaAccessor & operator=(TriaAccessor &&)=default
TriaIterator< TriaAccessor< structdim, dim, spacedim > > isotropic_child(const unsigned int i) const
typename::internal::TriangulationImplementation::Iterators< dim, spacedim >::quad_iterator quad(const unsigned int i) const
unsigned int user_index() const
std::unique_ptr< std::map< unsigned int, types::manifold_id > > vertex_to_manifold_id_map_1d
std::vector< Point< spacedim > > vertices
virtual types::subdomain_id locally_owned_subdomain() const
std::unique_ptr< std::map< unsigned int, types::boundary_id > > vertex_to_boundary_id_map_1d
std::unique_ptr<::internal::TriangulationImplementation::TriaFaces > faces
bool vertex_used(const unsigned int index) const
unsigned int n_vertices() const
std::vector< std::unique_ptr<::internal::TriangulationImplementation::TriaLevel > > levels
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
const unsigned int DoFAccessor< structdim, dim, spacedim, level_dof_access >::space_dimension
const unsigned int DoFAccessor< structdim, dim, spacedim, level_dof_access >::dimension
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcCantCompareIterators()
#define DeclException0(Exception0)
static ::ExceptionBase & ExcCellHasNoParent()
static ::ExceptionBase & ExcCellFlaggedForRefinement()
static ::ExceptionBase & ExcCellHasNoChildren()
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcCellNotUsed()
static ::ExceptionBase & ExcNoPeriodicNeighbor()
static ::ExceptionBase & ExcCantSetChildren(int arg1)
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
static ::ExceptionBase & ExcNeighborIsNotCoarser()
static ::ExceptionBase & ExcSetOnlyEvenChildren(int arg1)
static ::ExceptionBase & ExcNeighborIsCoarser()
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcFacesHaveNoLevel()
static ::ExceptionBase & ExcDereferenceInvalidObject(AccessorType arg1)
static ::ExceptionBase & ExcCellFlaggedForCoarsening()
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcRefineCellNotActive()
static ::ExceptionBase & ExcMessage(std::string arg1)
static ::ExceptionBase & ExcCellNotActive()
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
const bool IsBlockVector< VectorType >::value
void set_all_manifold_ids(const types::manifold_id) const
const Manifold< dim, spacedim > & get_manifold(const types::manifold_id number) const
void set_all_manifold_ids(const types::manifold_id)
void set_manifold_id(const types::manifold_id) const
static bool face_orientation(const unsigned int face)
Always return false.
static types::geometric_orientation line_orientation(const unsigned int line)
Always return numbers::reverse_line_orientation.
bool face_rotation(const unsigned int face) const
bool face_orientation(const unsigned int face) const
static bool face_flip(const unsigned int face)
Always return false.
types::geometric_orientation combined_face_orientation(const unsigned int face) const
static bool face_flip(const unsigned int face)
Always return false.
static types::geometric_orientation combined_face_orientation(const unsigned int face)
Always return 0.
static bool face_rotation(const unsigned int face)
Always return false.
types::geometric_orientation line_orientation(const unsigned int line) const
static bool face_rotation(const unsigned int face)
Always return false.
void set_combined_face_orientation(const unsigned int face, const types::geometric_orientation combined_orientation) const
static types::geometric_orientation line_orientation(const unsigned int line)
Always return numbers::reverse_line_orientation.
static bool face_orientation(const unsigned int face)
Always return false.
bool face_flip(const unsigned int face) const
static types::geometric_orientation combined_face_orientation(const unsigned int face)
Always return 0.
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
@ past_the_end
Iterator reached end of container.
@ valid
Iterator points to a valid object.
@ invalid
Iterator is invalid, probably due to an error.
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim > > > &Du)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
constexpr ReferenceCell Triangle
constexpr ReferenceCell Hexahedron
constexpr ReferenceCell Pyramid
constexpr ReferenceCell Wedge
constexpr ReferenceCell Vertex
constexpr unsigned int max_n_lines()
constexpr unsigned int max_n_vertices()
constexpr unsigned int max_n_faces()
constexpr ReferenceCell Quadrilateral
constexpr ReferenceCell Tetrahedron
constexpr ReferenceCell Line
T sum(const T &t, const MPI_Comm mpi_communicator)
types::geometric_orientation combined_face_orientation(const bool face_orientation, const bool face_rotation, const bool face_flip)
constexpr unsigned int invalid_unsigned_int
constexpr types::boundary_id internal_face_boundary_id
constexpr types::manifold_id flat_manifold_id
constexpr types::subdomain_id artificial_subdomain_id
constexpr types::geometric_orientation reverse_line_orientation
constexpr types::subdomain_id invalid_subdomain_id
constexpr types::geometric_orientation default_geometric_orientation
boost::integer_range< IncrementableType > iota_view
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
unsigned int subdomain_id
std::uint64_t global_vertex_index
unsigned char geometric_orientation
unsigned int global_cell_index
static RefinementCase< dim > min_cell_refinement_case_for_line_refinement(const unsigned int line_no)
static constexpr unsigned int vertices_per_cell
static constexpr unsigned int faces_per_cell
static RefinementCase< dim > min_cell_refinement_case_for_face_refinement(const RefinementCase< dim - 1 > &face_refinement_case, const unsigned int face_no, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false)
static unsigned int n_children(const RefinementCase< dim > &refinement_case)
static constexpr unsigned int max_children_per_cell