13#ifndef dealii_tria_accessor_h
14#define dealii_tria_accessor_h
33#include <boost/container/small_vector.hpp>
45template <
int dim,
int spacedim>
48template <
typename Accessor>
50template <
typename Accessor>
52template <
typename Accessor>
57 template <
int dim,
int spacedim>
62template <
int dim,
int spacedim>
65template <
int dim,
int spacedim,
bool lda>
69template <
int dim,
int spacedim>
72template <
int dim,
int spacedim>
87 struct Implementation;
102 template <
bool level_access>
159template <
int structdim,
int dim,
int spacedim>
161template <
int dim,
int spacedim>
163template <
int spacedim>
175 "The operation you are attempting can only be performed for "
176 "(cell, face, or edge) iterators that point to valid "
177 "objects. These objects need not necessarily be active, "
178 "i.e., have no children, but they need to be part of a "
179 "triangulation. (The objects pointed to by an iterator "
180 "may -- after coarsening -- also be objects that used "
181 "to be part of a triangulation, but are now no longer "
182 "used. Their memory location may have been retained "
183 "for re-use upon the next mesh refinement, but is "
184 "currently unused.)");
195 "The operation you are attempting can only be performed for "
196 "(cell, face, or edge) iterators that point to 'active' "
197 "objects. 'Active' objects are those that do not have "
198 "children (in the case of cells), or that are part of "
199 "an active cell (in the case of faces or edges). However, "
200 "the object on which you are trying the current "
201 "operation is not 'active' in this sense.");
208 "The operation you are attempting can only be performed for "
209 "(cell, face, or edge) iterators that have children, "
210 "but the object on which you are trying the current "
211 "operation does not have any.");
219 "The operation you are attempting can only be performed for "
220 "(cell, face, or edge) iterators that have a parent object, "
221 "but the object on which you are trying the current "
222 "operation does not have one -- i.e., it is on the "
223 "coarsest level of the triangulation.");
229 <<
"You can only set the child index if the cell does not "
230 <<
"currently have children registered; or you can clear it. "
231 <<
"The given index was " << arg1
232 <<
" (-1 means: clear children).");
236 template <
typename AccessorType>
239 <<
"You tried to dereference an iterator for which this "
240 <<
"is not possible. More information on this iterator: "
241 <<
"index=" << arg1.index() <<
", state="
251 "Iterators can only be compared if they point to the same "
252 "triangulation, or if neither of them are associated "
253 "with a triangulation.");
287 <<
"You can only set the child index of an even numbered child."
288 <<
"The number of the child given was " << arg1 <<
'.');
317template <
int structdim,
int dim,
int spacedim = dim>
369 const int level = -1,
370 const int index = -1,
548 template <
typename Accessor>
550 template <
typename Accessor>
552 template <
typename Accessor>
578template <
int structdim,
int dim,
int spacedim = dim>
619 const int level = -1,
620 const int index = -1,
636 template <
typename OtherAccessor>
732 line(
const unsigned int i)
const;
739 quad(
const unsigned int i)
const;
761template <
int structdim,
int dim,
int spacedim>
775 const int level = -1,
776 const int index = -1,
802 template <
int structdim2,
int dim2,
int spacedim2>
809 template <
int structdim2,
int dim2,
int spacedim2>
919 typename ::internal::TriangulationImplementation::
920 Iterators<dim, spacedim>::line_iterator
921 line(
const unsigned int i)
const;
935 typename ::internal::TriangulationImplementation::
936 Iterators<dim, spacedim>::quad_iterator
937 quad(
const unsigned int i)
const;
1545 std::pair<Point<spacedim>,
double>
1653 center(
const bool respect_manifold =
false,
1654 const bool interpolate_from_surrounding =
false)
const;
1764 std_cxx20::ranges::iota_view<unsigned int, unsigned int>
1771 std_cxx20::ranges::iota_view<unsigned int, unsigned int>
1780 std_cxx20::ranges::iota_view<unsigned int, unsigned int>
1804 const std::initializer_list<int> &new_indices)
const;
1811 const std::initializer_list<unsigned int> &new_indices)
const;
1835 const unsigned int face_no,
1890 friend struct ::internal::TriangulationImplementation::Implementation;
1891 friend struct ::internal::TriangulationImplementation::
1892 ImplementationMixedMesh;
1893 friend struct ::internal::TriaAccessorImplementation::Implementation;
1916template <
int dim,
int spacedim>
1959 const int level = 0,
1960 const int index = 0,
1966 template <
int structdim2,
int dim2,
int spacedim2>
1972 template <
int structdim2,
int dim2,
int spacedim2>
2073 typename ::internal::TriangulationImplementation::
2074 Iterators<dim, spacedim>::line_iterator
static line(
const unsigned int);
2085 static typename ::internal::TriangulationImplementation::
2086 Iterators<dim, spacedim>::quad_iterator
2132 const bool interpolate_from_surrounding =
false)
const;
2301 template <
typename Accessor>
2303 template <
typename Accessor>
2305 template <
typename Accessor>
2327template <
int spacedim>
2405 template <
int structdim2,
int dim2,
int spacedim2>
2411 template <
int structdim2,
int dim2,
int spacedim2>
2548 typename ::internal::TriangulationImplementation::
2549 Iterators<1, spacedim>::line_iterator
static line(
const unsigned int);
2563 static typename ::internal::TriangulationImplementation::
2564 Iterators<1, spacedim>::quad_iterator
3045 std_cxx20::ranges::iota_view<unsigned int, unsigned int>
3052 std_cxx20::ranges::iota_view<unsigned int, unsigned int>
3090template <
int dim,
int spacedim = dim>
3115 const int level = -1,
3116 const int index = -1,
3136 template <
int structdim2,
int dim2,
int spacedim2>
3143 template <
int structdim2,
int dim2,
int spacedim2>
3240 boost::container::small_vector<TriaIterator<CellAccessor<dim, spacedim>>,
3261 boost::container::small_vector<
3332 const unsigned int subface_no)
const;
3445 std::pair<unsigned int, unsigned int>
3524 const unsigned int subface_no)
const;
3536 std::pair<unsigned int, unsigned int>
3713 const unsigned int face_no,
4164 std::set<TriaActiveIterator<CellAccessor<dim, spacedim>>>
4233 template <
int dim_,
int spacedim_>
4282 friend struct ::internal::TriangulationImplementation::Implementation;
4283 friend struct ::internal::TriangulationImplementation::
4284 ImplementationMixedMesh;
4292template <
int structdim,
int dim,
int spacedim>
4293template <
typename OtherAccessor>
4295 const OtherAccessor &)
4298 ExcMessage(
"You are attempting an illegal conversion between "
4299 "iterator/accessor types. The constructor you call "
4300 "only exists to make certain template constructs "
4301 "easier to write as dimension independent code but "
4302 "the conversion is not valid in the current context."));
4307template <
int structdim,
int dim,
int spacedim>
4308template <
int structdim2,
int dim2,
int spacedim2>
4313 ExcMessage(
"You are attempting an illegal conversion between "
4314 "iterator/accessor types. The constructor you call "
4315 "only exists to make certain template constructs "
4316 "easier to write as dimension independent code but "
4317 "the conversion is not valid in the current context."));
4322template <
int dim,
int spacedim>
4323template <
int structdim2,
int dim2,
int spacedim2>
4328 ExcMessage(
"You are attempting an illegal conversion between "
4329 "iterator/accessor types. The constructor you call "
4330 "only exists to make certain template constructs "
4331 "easier to write as dimension independent code but "
4332 "the conversion is not valid in the current context."));
4337template <
int structdim,
int dim,
int spacedim>
4338template <
int structdim2,
int dim2,
int spacedim2>
4343 ExcMessage(
"You are attempting an illegal conversion between "
4344 "iterator/accessor types. The constructor you call "
4345 "only exists to make certain template constructs "
4346 "easier to write as dimension independent code but "
4347 "the conversion is not valid in the current context."));
4352template <
int dim,
int spacedim>
4353template <
int structdim2,
int dim2,
int spacedim2>
4358 ExcMessage(
"You are attempting an illegal conversion between "
4359 "iterator/accessor types. The constructor you call "
4360 "only exists to make certain template constructs "
4361 "easier to write as dimension independent code but "
4362 "the conversion is not valid in the current context."));
4396 namespace TriaAccessorImplementation
4403 template <
int dim,
int spacedim>
4415 return (vertices[1] - vertices[0]).norm();
4418 return std::max({(vertices[1] - vertices[0]).norm(),
4419 (vertices[2] - vertices[1]).norm(),
4420 (vertices[2] - vertices[0]).norm()});
4424 (vertices[2] - vertices[1]).
norm()});
4428 (vertices[2] - vertices[0]).
norm(),
4429 (vertices[2] - vertices[1]).
norm(),
4430 (vertices[3] - vertices[0]).
norm(),
4431 (vertices[3] - vertices[1]).
norm(),
4432 (vertices[3] - vertices[2]).
norm()});
4437 (vertices[3] - vertices[0]).
norm(),
4438 (vertices[2] - vertices[1]).
norm(),
4441 (vertices[4] - vertices[0]).
norm(),
4442 (vertices[4] - vertices[1]).
norm(),
4443 (vertices[4] - vertices[2]).
norm(),
4444 (vertices[4] - vertices[3]).
norm()});
4449 (vertices[4] - vertices[0]).
norm(),
4450 (vertices[3] - vertices[1]).
norm(),
4451 (vertices[5] - vertices[1]).
norm(),
4452 (vertices[4] - vertices[2]).
norm(),
4453 (vertices[5] - vertices[0]).
norm(),
4454 (vertices[3] - vertices[2]).
norm(),
4457 (vertices[1] - vertices[0]).
norm(),
4458 (vertices[2] - vertices[1]).
norm(),
4459 (vertices[2] - vertices[0]).
norm(),
4460 (vertices[4] - vertices[3]).
norm(),
4461 (vertices[5] - vertices[4]).
norm(),
4462 (vertices[5] - vertices[3]).
norm()});
4466 (vertices[6] - vertices[1]).
norm(),
4467 (vertices[2] - vertices[5]).
norm(),
4468 (vertices[3] - vertices[4]).
norm()});
4479template <
int structdim,
int dim,
int spacedim>
4484 const AccessorData *)
4485 :
internal::TriaAccessorImplementation::LevelAccessor<dim == structdim>(
4486 (structdim == dim) ? level : 0)
4487 , present_index(
index)
4492 if (structdim != dim)
4497template <
int structdim,
int dim,
int spacedim>
4500 :
internal::TriaAccessorImplementation::LevelAccessor<dim == structdim>(
4502 , present_index(a.present_index)
4507template <
int structdim,
int dim,
int spacedim>
4512 this->set_level(a.
level());
4516 if (structdim != dim)
4522template <
int structdim,
int dim,
int spacedim>
4527 this->set_level(a.
level());
4531 if (structdim != dim)
4538template <
int structdim,
int dim,
int spacedim>
4545 return ((tria == a.
tria) && (level() == a.
level()) &&
4551template <
int structdim,
int dim,
int spacedim>
4558 return ((tria != a.
tria) || (level() != a.
level()) ||
4564template <
int structdim,
int dim,
int spacedim>
4571 if (level() != other.
level())
4572 return (level() < other.
level());
4579template <
int structdim,
int dim,
int spacedim>
4585 return this->get_level();
4590template <
int structdim,
int dim,
int spacedim>
4594 return present_index;
4599template <
int structdim,
int dim,
int spacedim>
4603 if ((level() >= 0) && (present_index >= 0))
4605 else if (present_index == -1)
4613template <
int structdim,
int dim,
int spacedim>
4622template <
int structdim,
int dim,
int spacedim>
4628 ++this->present_index;
4630 if (structdim != dim)
4637 if (this->present_index >=
static_cast<int>(objects().n_objects()))
4638 this->present_index = -1;
4642 while (this->present_index >=
4643 static_cast<int>(this->tria->
levels[level()]->cells.n_objects()))
4647 this->set_level(level() + 1);
4648 this->present_index = 0;
4650 if (level() >=
static_cast<int>(this->tria->
levels.size()))
4653 this->set_level(-1);
4654 this->present_index = -1;
4662template <
int structdim,
int dim,
int spacedim>
4667 --this->present_index;
4669 if (structdim != dim)
4671 if (this->present_index < 0)
4672 this->present_index = -1;
4676 while (this->present_index < 0)
4679 this->set_level(level() - 1);
4684 this->set_level(-1);
4685 this->present_index = -1;
4689 this->present_index =
4690 this->tria->
levels[level()]->cells.n_objects() - 1;
4697template <
int structdim,
int dim,
int spacedim>
4698inline ::internal::TriangulationImplementation::TriaObjects &
4701 if (structdim == dim)
4702 return this->tria->
levels[level()]->cells;
4704 if (structdim == 1 && dim > 1)
4705 return this->tria->
faces->lines;
4707 if (structdim == 2 && dim > 2)
4708 return this->tria->
faces->quads;
4712 return this->tria->
levels[level()]->cells;
4719template <
int structdim,
int dim,
int spacedim>
4723 const AccessorData *)
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>
4740 ExcMessage(
"You are attempting an invalid conversion between "
4741 "iterator/accessor types. The constructor you call "
4742 "only exists to make certain template constructs "
4743 "easier to write as dimension independent code but "
4744 "the conversion is not valid in the current context."));
4749template <
int structdim,
int dim,
int spacedim>
4759template <
int structdim,
int dim,
int spacedim>
4771template <
int structdim,
int dim,
int spacedim>
4783template <
int structdim,
int dim,
int spacedim>
4794template <
int structdim,
int dim,
int spacedim>
4805template <
int structdim,
int dim,
int spacedim>
4812template <
int structdim,
int dim,
int spacedim>
4819template <
int structdim,
int dim,
int spacedim>
4828template <
int structdim,
int dim,
int spacedim>
4837template <
int structdim,
int dim,
int spacedim>
4840 const unsigned int)
const
4843 ExcMessage(
"You are trying to set the user index of an "
4844 "invalid object."));
4849template <
int structdim,
int dim,
int spacedim>
4855 ExcMessage(
"You are trying to set the manifold id of an "
4856 "invalid object."));
4861template <
int structdim,
int dim,
int spacedim>
4868 return invalid_vertex;
4872template <
int structdim,
int dim,
int spacedim>
4883template <
int structdim,
int dim,
int spacedim>
4903 using ::TriaAccessor;
4909 struct Implementation
4911 template <
int dim,
int spacedim>
4912 static std::array<unsigned int, 1>
4913 get_line_indices_of_cell(
const TriaAccessor<1, dim, spacedim> &)
4921 template <
int structdim,
int dim,
int spacedim>
4922 static std::array<unsigned int, 4>
4923 get_line_indices_of_cell(
const TriaAccessor<2, dim, spacedim> &cell)
4927 std::array<unsigned int, 4> line_indices = {};
4930 return line_indices;
4937 template <
int structdim,
int dim,
int spacedim>
4938 static std::array<unsigned int, 12>
4939 get_line_indices_of_cell(
4940 const TriaAccessor<structdim, dim, spacedim> &cell)
4942 std::array<unsigned int, 12> line_indices = {};
4950 for (
unsigned int f = 4; f < 6; ++f)
4960 const std::array<unsigned int, 4> my_indices{
4961 {ref_cell.standard_to_real_face_line(0, f, orientation),
4962 ref_cell.standard_to_real_face_line(1, f, orientation),
4963 ref_cell.standard_to_real_face_line(2, f, orientation),
4964 ref_cell.standard_to_real_face_line(3, f, orientation)}};
4965 const auto quad = cell.
quad(f);
4966 for (
unsigned int l = 0;
l < 4; ++
l)
4967 line_indices[4 * (f - 4) +
l] =
4968 quad->line_index(my_indices[l]);
4970 for (
unsigned int f = 0; f < 2; ++f)
4972 const auto orientation =
4975 ->face_orientations.get_combined_orientation(cell.
index(),
4977 const std::array<unsigned int, 2> my_indices{
4978 {ref_cell.standard_to_real_face_line(0, f, orientation),
4979 ref_cell.standard_to_real_face_line(1, f, orientation)}};
4980 const auto quad = cell.
quad(f);
4981 line_indices[8 + f] = quad->line_index(my_indices[0]);
4982 line_indices[10 + f] = quad->line_index(my_indices[1]);
4987 std::array<unsigned int, 3> orientations{
4991 const std::array<unsigned int, 6> my_indices{
4992 {ref_cell.standard_to_real_face_line(0, 0, orientations[0]),
4993 ref_cell.standard_to_real_face_line(1, 0, orientations[0]),
4994 ref_cell.standard_to_real_face_line(2, 0, orientations[0]),
4995 ref_cell.standard_to_real_face_line(1, 1, orientations[1]),
4996 ref_cell.standard_to_real_face_line(2, 1, orientations[1]),
4997 ref_cell.standard_to_real_face_line(1, 2, orientations[2])}};
4998 line_indices[0] = cell.
quad(0)->line_index(my_indices[0]);
4999 line_indices[1] = cell.
quad(0)->line_index(my_indices[1]);
5000 line_indices[2] = cell.
quad(0)->line_index(my_indices[2]);
5001 line_indices[3] = cell.
quad(1)->line_index(my_indices[3]);
5002 line_indices[4] = cell.
quad(1)->line_index(my_indices[4]);
5003 line_indices[5] = cell.
quad(2)->line_index(my_indices[5]);
5011 return line_indices;
5020 template <
int dim,
int spacedim>
5021 static std::array<types::geometric_orientation, 1>
5022 get_line_orientations_of_cell(
const TriaAccessor<1, dim, spacedim> &)
5034 template <
int dim,
int spacedim>
5035 static std::array<types::geometric_orientation, 4>
5036 get_line_orientations_of_cell(
const TriaAccessor<2, dim, spacedim> &cell)
5040 std::array<types::geometric_orientation, 4> line_orientations = {};
5043 return line_orientations;
5052 template <
int dim,
int spacedim>
5053 static std::array<types::geometric_orientation, 12>
5054 get_line_orientations_of_cell(
const TriaAccessor<3, dim, spacedim> &cell)
5056 std::array<types::geometric_orientation, 12> line_orientations = {};
5064 for (
unsigned int f = 4; f < 6; ++f)
5066 const auto orientation =
5069 ->face_orientations.get_combined_orientation(cell.
index(),
5078 const std::array<unsigned int, 4> my_indices{
5079 {ref_cell.standard_to_real_face_line(0, f, orientation),
5080 ref_cell.standard_to_real_face_line(1, f, orientation),
5081 ref_cell.standard_to_real_face_line(2, f, orientation),
5082 ref_cell.standard_to_real_face_line(3, f, orientation)}};
5083 const auto quad = cell.
quad(f);
5084 const std::array<types::geometric_orientation, 4>
5085 my_orientations{{ref_cell.face_to_cell_line_orientation(
5089 quad->line_orientation(my_indices[0])),
5090 ref_cell.face_to_cell_line_orientation(
5094 quad->line_orientation(my_indices[1])),
5095 ref_cell.face_to_cell_line_orientation(
5099 quad->line_orientation(my_indices[2])),
5100 ref_cell.face_to_cell_line_orientation(
5104 quad->line_orientation(my_indices[3]))}};
5105 for (
unsigned int l = 0;
l < 4; ++
l)
5106 line_orientations[4 * (f - 4) +
l] = my_orientations[
l];
5108 for (
unsigned int f = 0; f < 2; ++f)
5110 const auto orientation =
5113 ->face_orientations.get_combined_orientation(cell.
index(),
5115 const std::array<unsigned int, 2> 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 const auto quad = cell.
quad(f);
5119 const std::array<types::geometric_orientation, 2>
5120 my_orientations{{ref_cell.face_to_cell_line_orientation(
5124 quad->line_orientation(my_indices[0])),
5125 ref_cell.face_to_cell_line_orientation(
5129 quad->line_orientation(my_indices[1]))}};
5130 line_orientations[8 + f] = my_orientations[0];
5131 line_orientations[10 + f] = my_orientations[1];
5136 std::array<unsigned int, 3> orientations{
5140 const std::array<unsigned int, 6> my_indices{
5141 {ref_cell.standard_to_real_face_line(0, 0, orientations[0]),
5142 ref_cell.standard_to_real_face_line(1, 0, orientations[0]),
5143 ref_cell.standard_to_real_face_line(2, 0, orientations[0]),
5144 ref_cell.standard_to_real_face_line(1, 1, orientations[1]),
5145 ref_cell.standard_to_real_face_line(2, 1, orientations[1]),
5146 ref_cell.standard_to_real_face_line(1, 2, orientations[2])}};
5147 line_orientations[0] = ref_cell.face_to_cell_line_orientation(
5151 cell.
quad(0)->line_orientation(my_indices[0]));
5152 line_orientations[1] = ref_cell.face_to_cell_line_orientation(
5156 cell.
quad(0)->line_orientation(my_indices[1]));
5157 line_orientations[2] = ref_cell.face_to_cell_line_orientation(
5161 cell.
quad(0)->line_orientation(my_indices[2]));
5162 line_orientations[3] = ref_cell.face_to_cell_line_orientation(
5166 cell.
quad(1)->line_orientation(my_indices[3]));
5167 line_orientations[4] = ref_cell.face_to_cell_line_orientation(
5171 cell.
quad(1)->line_orientation(my_indices[4]));
5172 line_orientations[5] = ref_cell.face_to_cell_line_orientation(
5176 cell.
quad(2)->line_orientation(my_indices[5]));
5184 return line_orientations;
5192template <
int structdim,
int dim,
int spacedim>
5197 const AccessorData *local_data)
5203template <
int structdim,
int dim,
int spacedim>
5210 return this->objects().used[this->present_index];
5215template <
int structdim,
int dim,
int spacedim>
5218 const unsigned int i)
const
5227template <
int structdim,
int dim,
int spacedim>
5231 if constexpr (structdim == 0)
5233 else if constexpr (structdim == 1)
5235 else if constexpr (structdim == dim)
5236 return this->tria->
levels[this->level()]
5237 ->reference_cell[this->present_index];
5239 return this->tria->
faces->get_quad_type(this->present_index);
5244template <
int structdim,
int dim,
int spacedim>
5247 const unsigned int vertex_no)
const
5251 if constexpr (structdim == 1)
5256 return this->objects().get_bounding_object(this->present_index,
5259 else if constexpr (structdim == dim)
5263 const auto vertex_index =
5264 this->tria->
levels[this->level()]->cached_vertex_index(
5265 this->present_index, vertex_no);
5269 "The present vertex's vertex_index is not valid. This is typically "
5270 "caused by calling cell->vertex_index() during grid refinement for "
5271 "a newly created cell, since the cell vertex index cache is not "
5272 "complete at that point."));
5273 return vertex_index;
5275 else if constexpr (structdim == 2)
5277 const auto [line_index, vertex_index] =
5280 const auto vertex_within_line_index =
5282 vertex_index, line_index, this->line_orientation(line_index));
5284 return this->line(line_index)->vertex_index(vertex_within_line_index);
5295template <
int structdim,
int dim,
int spacedim>
5304template <
int structdim,
int dim,
int spacedim>
5305inline typename ::internal::TriangulationImplementation::
5306 Iterators<dim, spacedim>::line_iterator
5310 return typename ::internal::TriangulationImplementation::
5311 Iterators<dim, spacedim>::line_iterator(this->tria, 0, line_index(i));
5316template <
int structdim,
int dim,
int spacedim>
5323 ExcMessage(
"You can't ask for the index of a line bounding a "
5324 "one-dimensional cell because it is not bounded by "
5327 if constexpr (structdim == 2)
5329 return this->objects().get_bounding_object(this->present_index, i);
5331 else if constexpr (structdim == 3)
5333 const auto [face_index, line_index] =
5335 const auto line_within_face_index =
5339 return this->quad(face_index)->line_index(line_within_face_index);
5348template <
int structdim,
int dim,
int spacedim>
5349inline typename ::internal::TriangulationImplementation::
5350 Iterators<dim, spacedim>::quad_iterator
5354 return typename ::internal::TriangulationImplementation::
5355 Iterators<dim, spacedim>::quad_iterator(this->tria, 0, quad_index(i));
5360template <
int structdim,
int dim,
int spacedim>
5363 const unsigned int face_no)
const
5366 ExcMessage(
"You can't ask for the index of a quad bounding "
5367 "a one- or two-dimensional cell because it is not "
5368 "bounded by quads."));
5372 if constexpr (structdim == 3)
5373 return this->objects().get_bounding_object(this->present_index, face_no);
5380template <
int structdim,
int dim,
int spacedim>
5383 const unsigned int face)
const
5388 ExcMessage(
"This function can only be used on objects "
5389 "that are cells, but not on faces or edges "
5390 "that bound cells."));
5394 if constexpr (structdim == 1)
5396 else if constexpr (structdim == 2)
5400 if (this->tria->
levels[this->level()]->face_orientations.n_objects() == 0)
5403 return this->tria->
levels[this->level()]
5404 ->face_orientations.get_combined_orientation(this->present_index,
5408 return this->tria->
levels[this->level()]
5409 ->face_orientations.get_combined_orientation(this->present_index, face);
5414template <
int structdim,
int dim,
int spacedim>
5417 const unsigned int face)
const
5422 ExcMessage(
"This function can only be used on objects "
5423 "that are cells, but not on faces or edges "
5424 "that bound cells."));
5428 if constexpr (structdim == 1)
5431 else if constexpr (structdim == 2)
5432 return this->line_orientation(face) ==
5435 return this->tria->
levels[this->level()]->face_orientations.get_orientation(
5436 this->present_index, face);
5441template <
int structdim,
int dim,
int spacedim>
5447 ExcMessage(
"This function can only be used on objects "
5448 "that are cells, but not on faces or edges "
5449 "that bound cells."));
5454 if constexpr (structdim == 3)
5455 return this->tria->
levels[this->level()]->face_orientations.get_flip(
5456 this->present_index, face);
5464template <
int structdim,
int dim,
int spacedim>
5467 const unsigned int face)
const
5471 ExcMessage(
"This function can only be used on objects "
5472 "that are cells, but not on faces or edges "
5473 "that bound cells."));
5478 if constexpr (structdim == 3)
5479 return this->tria->
levels[this->level()]->face_orientations.get_rotation(
5480 this->present_index, face);
5489template <
int structdim,
int dim,
int spacedim>
5492 const unsigned int line)
const
5499 if constexpr (structdim == 1)
5501 else if constexpr (structdim == 2 && dim == 2)
5508 return combined_orientation;
5510 else if constexpr (structdim == 2 && dim == 3)
5512 return this->tria->
faces->get_line_orientation(this->present_index, line);
5514 else if constexpr (structdim == 3 && dim == 3)
5519 const auto [face_index, line_index] =
5521 const auto line_within_face_index =
5530 this->quad(face_index)->line_orientation(line_within_face_index));
5541template <
int structdim,
int dim,
int spacedim>
5544 const unsigned int line,
5550 ExcMessage(
"In 1d lines are cells and thus do not need to have their "
5551 "orientations set."));
5553 ExcMessage(
"In 2d lines are faces, and, for compatibility with other "
5554 "dimensions, their orientations should be set via "
5555 "set_combined_face_orientation()."));
5561 if constexpr (dim == 3)
5566 this->tria->
faces->set_line_orientation(this->present_index, line,
value);
5572template <
int structdim,
int dim,
int spacedim>
5575 const unsigned int face_no,
5581 ExcMessage(
"This function can only be used on objects that are cells "
5582 "and not on objects which bound cells."));
5588 this->tria->
levels[this->level()]
5589 ->face_orientations.set_combined_orientation(this->present_index,
5591 combined_orientation);
5596template <
int structdim,
int dim,
int spacedim>
5603 this->objects().used[this->present_index] =
true;
5608template <
int structdim,
int dim,
int spacedim>
5615 this->objects().used[this->present_index] =
false;
5619template <
int structdim,
int dim,
int spacedim>
5629 const auto &objects = this->objects();
5630 const unsigned int n_sets_of_two = objects.children_per_object / 2;
5631 return objects.children[n_sets_of_two * this->present_index + i / 2] + i % 2;
5636template <
int structdim,
int dim,
int spacedim>
5639 const unsigned int i)
const
5646 return child_index(i);
5650 static_cast<std::uint8_t
>(refinement_case()));
5656 return child_index(i);
5658 (child(i % 2)->refinement_case() ==
5660 return child(i % 2)->child_index(i / 2);
5662 (child(i / 2)->refinement_case() ==
5664 return child(i / 2)->child_index(i % 2);
5669 "This cell has no grandchildren equivalent to isotropic refinement"));
5681template <
int structdim,
int dim,
int spacedim>
5693 this->objects().children[this->present_index] != -1 ?
5702 Assert(
static_cast<unsigned int>(this->present_index) <
5703 this->objects().refinement_cases.size(),
5706 this->objects().refinement_cases.size()));
5709 this->objects().refinement_cases[this->present_index]));
5715template <
int structdim,
int dim,
int spacedim>
5722 this->tria, (dim == structdim ? this->level() + 1 : 0), child_index(i));
5732template <
int structdim,
int dim,
int spacedim>
5737 const auto n_children = this->n_children();
5738 for (
unsigned int child_n = 0; child_n < n_children; ++child_n)
5739 if (this->child(child_n) == child)
5743 ExcMessage(
"The given child is not a child of the current object."));
5749template <
int structdim,
int dim,
int spacedim>
5752 const unsigned int i)
const
5764 static_cast<std::uint8_t
>(refinement_case()));
5772 (child(i % 2)->refinement_case() ==
5774 return child(i % 2)->child(i / 2);
5776 (child(i / 2)->refinement_case() ==
5778 return child(i / 2)->child(i % 2);
5783 "This cell has no grandchildren equivalent to isotropic refinement"));
5797template <
int structdim,
int dim,
int spacedim>
5807 const auto &objects = this->objects();
5808 const unsigned int n_sets_of_two = objects.children_per_object / 2;
5809 return (objects.children[n_sets_of_two * this->present_index] != -1);
5814template <
int structdim,
int dim,
int spacedim>
5827template <
int structdim,
int dim,
int spacedim>
5835 Assert(
static_cast<unsigned int>(this->present_index) <
5836 this->objects().refinement_cases.size(),
5839 this->objects().refinement_cases.size()));
5841 this->objects().refinement_cases[this->present_index] = refinement_case;
5845template <
int structdim,
int dim,
int spacedim>
5852 Assert(
static_cast<unsigned int>(this->present_index) <
5853 this->objects().refinement_cases.size(),
5856 this->objects().refinement_cases.size()));
5858 this->objects().refinement_cases[this->present_index] =
5864template <
int structdim,
int dim,
int spacedim>
5867 const int index)
const
5874 auto &objects = this->objects();
5875 const unsigned int n_sets_of_two = objects.children_per_object / 2;
5881 (i == 0 && !this->has_children() && (index >= 0)) ||
5884 (i > 0 && this->has_children() && (index >= 0) &&
5885 objects.children[n_sets_of_two * this->present_index + i / 2] == -1),
5888 objects.children[n_sets_of_two * this->present_index + i / 2] =
index;
5893template <
int structdim,
int dim,
int spacedim>
5899 const auto &objects = this->objects();
5900 const unsigned int n_sets_of_two = objects.children_per_object / 2;
5901 for (
unsigned int i = 0; i < n_sets_of_two; ++i)
5902 set_children(2 * i, -1);
5907template <
int structdim,
int dim,
int spacedim>
5912 return this->objects().user_flags[this->present_index];
5917template <
int structdim,
int dim,
int spacedim>
5922 this->objects().user_flags[this->present_index] =
true;
5927template <
int structdim,
int dim,
int spacedim>
5932 this->objects().user_flags[this->present_index] =
false;
5937template <
int structdim,
int dim,
int spacedim>
5943 if (this->has_children())
5944 for (
unsigned int c = 0; c < this->n_children(); ++c)
5945 this->child(c)->recursively_set_user_flag();
5950template <
int structdim,
int dim,
int spacedim>
5956 if (this->has_children())
5957 for (
unsigned int c = 0; c < this->n_children(); ++c)
5958 this->child(c)->recursively_clear_user_flag();
5963template <
int structdim,
int dim,
int spacedim>
5968 this->objects().clear_user_data(this->present_index);
5973template <
int structdim,
int dim,
int spacedim>
5978 this->objects().user_pointer(this->present_index) = p;
5983template <
int structdim,
int dim,
int spacedim>
5988 this->objects().user_pointer(this->present_index) =
nullptr;
5993template <
int structdim,
int dim,
int spacedim>
5998 return this->objects().user_pointer(this->present_index);
6003template <
int structdim,
int dim,
int spacedim>
6008 set_user_pointer(p);
6010 if (this->has_children())
6011 for (
unsigned int c = 0; c < this->n_children(); ++c)
6012 this->child(c)->recursively_set_user_pointer(p);
6017template <
int structdim,
int dim,
int spacedim>
6021 clear_user_pointer();
6023 if (this->has_children())
6024 for (
unsigned int c = 0; c < this->n_children(); ++c)
6025 this->child(c)->recursively_clear_user_pointer();
6030template <
int structdim,
int dim,
int spacedim>
6033 const unsigned int p)
const
6036 this->objects().user_index(this->present_index) = p;
6041template <
int structdim,
int dim,
int spacedim>
6046 this->objects().user_index(this->present_index) = 0;
6051template <
int structdim,
int dim,
int spacedim>
6056 return this->objects().user_index(this->present_index);
6061template <
int structdim,
int dim,
int spacedim>
6064 const unsigned int p)
const
6068 if (this->has_children())
6069 for (
unsigned int c = 0; c < this->n_children(); ++c)
6070 this->child(c)->recursively_set_user_index(p);
6075template <
int structdim,
int dim,
int spacedim>
6081 if (this->has_children())
6082 for (
unsigned int c = 0; c < this->n_children(); ++c)
6083 this->child(c)->recursively_clear_user_index();
6088template <
int structdim,
int dim,
int spacedim>
6092 if (!this->has_children())
6095 unsigned int max_depth = 1;
6096 for (
unsigned int c = 0; c < n_children(); ++c)
6097 max_depth =
std::max(max_depth, child(c)->max_refinement_depth() + 1);
6103template <
int structdim,
int dim,
int spacedim>
6107 if (!this->has_children())
6111 unsigned int sum = 0;
6112 for (
unsigned int c = 0; c < n_children(); ++c)
6113 sum += this->child(c)->n_active_descendants();
6120template <
int structdim,
int dim,
int spacedim>
6127 return this->objects()
6128 .boundary_or_material_id[this->present_index]
6134template <
int structdim,
int dim,
int spacedim>
6142 ExcMessage(
"You are trying to set the boundary_id to an invalid "
6143 "value (numbers::internal_face_boundary_id is reserved)."));
6144 Assert(this->at_boundary(),
6145 ExcMessage(
"You are trying to set the boundary_id of an "
6146 "internal object, which is not allowed!"));
6148 this->objects().boundary_or_material_id[this->present_index].boundary_id =
6154template <
int structdim,
int dim,
int spacedim>
6162 this->objects().boundary_or_material_id[this->present_index].boundary_id =
6168template <
int structdim,
int dim,
int spacedim>
6173 set_boundary_id(boundary_ind);
6183 for (
unsigned int i = 0; i < this->n_lines(); ++i)
6184 this->line(i)->set_boundary_id(boundary_ind);
6194template <
int structdim,
int dim,
int spacedim>
6204template <
int structdim,
int dim,
int spacedim>
6213template <
int structdim,
int dim,
int spacedim>
6219 return this->objects().manifold_id[this->present_index];
6224template <
int structdim,
int dim,
int spacedim>
6231 this->objects().manifold_id[this->present_index] = manifold_ind;
6235template <
int structdim,
int dim,
int spacedim>
6240 set_manifold_id(manifold_ind);
6242 if (this->has_children())
6243 for (
unsigned int c = 0; c < this->n_children(); ++c)
6244 this->child(c)->set_all_manifold_ids(manifold_ind);
6260 for (
unsigned int i = 0; i < this->n_lines(); ++i)
6261 this->line(i)->set_manifold_id(manifold_ind);
6270template <
int structdim,
int dim,
int spacedim>
6274 boost::container::small_vector<Point<spacedim>,
6281 vertices(this->n_vertices());
6283 for (
unsigned int v = 0; v < vertices.size(); ++v)
6284 vertices[v] = this->vertex(v);
6286 return internal::TriaAccessorImplementation::diameter<structdim, spacedim>(
6292template <
int dim,
int spacedim>
6297 return internal::TriaAccessorImplementation::diameter<dim, spacedim>(
6299 this->tria, this->level(), this->index())));
6304template <
int structdim,
int dim,
int spacedim>
6305std::pair<Point<spacedim>,
double>
6312 return std::make_pair((this->vertex(1) + this->vertex(0)) * 0.5,
6313 (this->vertex(1) - this->vertex(0)).
norm() * 0.5);
6321 std::vector<bool> is_initial_guess_vertex(this->n_vertices());
6324 std::fill(is_initial_guess_vertex.begin(),
6325 is_initial_guess_vertex.end(),
6338 if (p30.norm() > p21.norm())
6340 center = this->vertex(0) + 0.5 * p30;
6341 radius = p30.norm() / 2.;
6342 is_initial_guess_vertex[3] =
true;
6343 is_initial_guess_vertex[0] =
true;
6347 center = this->vertex(1) + 0.5 * p21;
6348 radius = p21.norm() / 2.;
6349 is_initial_guess_vertex[2] =
true;
6350 is_initial_guess_vertex[1] =
true;
6360 const std::vector<double> diagonals = {p70.norm(),
6364 const std::vector<double>::const_iterator it =
6365 std::max_element(diagonals.begin(), diagonals.end());
6366 if (it == diagonals.begin())
6368 center = this->vertex(0) + 0.5 * p70;
6369 is_initial_guess_vertex[7] =
true;
6370 is_initial_guess_vertex[0] =
true;
6372 else if (it == diagonals.begin() + 1)
6374 center = this->vertex(1) + 0.5 * p61;
6375 is_initial_guess_vertex[6] =
true;
6376 is_initial_guess_vertex[1] =
true;
6378 else if (it == diagonals.begin() + 2)
6380 center = this->vertex(5) + 0.5 * p25;
6381 is_initial_guess_vertex[2] =
true;
6382 is_initial_guess_vertex[5] =
true;
6386 center = this->vertex(4) + 0.5 * p34;
6387 is_initial_guess_vertex[3] =
true;
6388 is_initial_guess_vertex[4] =
true;
6395 return std::pair<Point<spacedim>,
double>();
6401 for (
const unsigned int v : this->vertex_indices())
6402 if (!is_initial_guess_vertex[v])
6404 const double distance = center.
distance(this->vertex(v));
6411 center = this->vertex(v) + pCV * (
radius / distance);
6419 bool all_vertices_within_ball =
true;
6423 for (
const unsigned int v : this->vertex_indices())
6424 if (center.
distance(this->vertex(v)) >
6425 radius + 100. * std::numeric_limits<double>::epsilon())
6427 all_vertices_within_ball =
false;
6433 return std::make_pair(center,
radius);
6437template <
int structdim,
int dim,
int spacedim>
6444 return (this->vertex(1) - this->vertex(0)).norm();
6448 double min = std::numeric_limits<double>::max();
6449 for (
const unsigned int i : this->vertex_indices())
6450 for (
unsigned int j = i + 1; j < this->n_vertices(); ++j)
6452 (this->vertex(i) - this->vertex(j)) *
6453 (this->vertex(i) - this->vertex(j)));
6463template <
int structdim,
int dim,
int spacedim>
6476 bool is_translation =
true;
6479 for (
unsigned int i = 1; i < this->n_vertices(); ++i)
6482 (o->vertex(i) - this->vertex(i)) - dist;
6485 is_translation =
false;
6489 return is_translation;
6494template <
int structdim,
int dim,
int spacedim>
6503template <
int structdim,
int dim,
int spacedim>
6507 return this->reference_cell().
n_lines();
6512template <
int structdim,
int dim,
int spacedim>
6517 ExcMessage(
"This function can only be used on objects "
6518 "that are cells, but not on faces or edges "
6519 "that bound cells."));
6521 return this->reference_cell().
n_faces();
6526template <
int structdim,
int dim,
int spacedim>
6527std_cxx20::ranges::iota_view<unsigned int, unsigned int>
6530 return std_cxx20::ranges::iota_view<unsigned int, unsigned int>(0U,
6536template <
int structdim,
int dim,
int spacedim>
6537std_cxx20::ranges::iota_view<unsigned int, unsigned int>
6540 return std_cxx20::ranges::iota_view<unsigned int, unsigned int>(0U,
6546template <
int structdim,
int dim,
int spacedim>
6547std_cxx20::ranges::iota_view<unsigned int, unsigned int>
6550 return std_cxx20::ranges::iota_view<unsigned int, unsigned int>(0U,
6558template <
int dim,
int spacedim>
6561 const unsigned int vertex_index)
6568template <
int dim,
int spacedim>
6573 const AccessorData *)
6580template <
int dim,
int spacedim>
6581template <
int structdim2,
int dim2,
int spacedim2>
6592template <
int dim,
int spacedim>
6593template <
int structdim2,
int dim2,
int spacedim2>
6604template <
int dim,
int spacedim>
6614template <
int dim,
int spacedim>
6621 return (global_vertex_index < other.global_vertex_index);
6626template <
int dim,
int spacedim>
6638template <
int dim,
int spacedim>
6647template <
int dim,
int spacedim>
6656template <
int dim,
int spacedim>
6665template <
int dim,
int spacedim>
6670 if (global_vertex_index >= tria->
n_vertices())
6676template <
int dim,
int spacedim>
6682 if (global_vertex_index != 0)
6691template <
int dim,
int spacedim>
6703template <
int dim,
int spacedim>
6707 return !(*
this == t);
6712template <
int dim,
int spacedim>
6721template <
int dim,
int spacedim>
6731template <
int dim,
int spacedim>
6732inline typename ::internal::TriangulationImplementation::
6733 Iterators<dim, spacedim>::line_iterator
6736 return typename ::internal::TriangulationImplementation::
6737 Iterators<dim, spacedim>::line_iterator();
6742template <
int dim,
int spacedim>
6752template <
int dim,
int spacedim>
6753inline typename ::internal::TriangulationImplementation::
6754 Iterators<dim, spacedim>::quad_iterator
6757 return typename ::internal::TriangulationImplementation::
6758 Iterators<dim, spacedim>::quad_iterator();
6763template <
int dim,
int spacedim>
6773template <
int dim,
int spacedim>
6782template <
int dim,
int spacedim>
6791template <
int dim,
int spacedim>
6800template <
int dim,
int spacedim>
6809template <
int dim,
int spacedim>
6812 const unsigned int )
6819template <
int dim,
int spacedim>
6828template <
int dim,
int spacedim>
6837template <
int dim,
int spacedim>
6846template <
int dim,
int spacedim>
6855template <
int dim,
int spacedim>
6864template <
int dim,
int spacedim>
6873template <
int dim,
int spacedim>
6882template <
int dim,
int spacedim>
6891template <
int dim,
int spacedim>
6901template <
int dim,
int spacedim>
6910template <
int dim,
int spacedim>
6919template <
int dim,
int spacedim>
6928template <
int dim,
int spacedim>
6937template <
int dim,
int spacedim>
6946template <
int dim,
int spacedim>
6957template <
int spacedim>
6960 const VertexKind vertex_kind,
6961 const unsigned int vertex_index)
6963 , vertex_kind(vertex_kind)
6969template <
int spacedim>
6974 const AccessorData *)
6976 , vertex_kind(interior_vertex)
6990 "This constructor can not be called for face iterators in 1d, "
6991 "except to default-construct iterator objects."));
6996template <
int spacedim>
6997template <
int structdim2,
int dim2,
int spacedim2>
7001 , vertex_kind(interior_vertex)
7009template <
int spacedim>
7010template <
int structdim2,
int dim2,
int spacedim2>
7014 , vertex_kind(interior_vertex)
7022template <
int spacedim>
7027 vertex_kind = t.vertex_kind;
7033template <
int spacedim>
7046template <
int spacedim>
7053 return (global_vertex_index < other.global_vertex_index);
7058template <
int spacedim>
7066template <
int spacedim>
7075template <
int spacedim>
7084template <
int spacedim>
7093template <
int spacedim>
7101template <
int spacedim>
7110template <
int spacedim>
7125template <
int spacedim>
7129 return !(*
this == t);
7134template <
int spacedim>
7145template <
int spacedim>
7157template <
int spacedim>
7166template <
int spacedim>
7167inline typename ::internal::TriangulationImplementation::
7168 Iterators<1, spacedim>::line_iterator
7175template <
int spacedim>
7184template <
int spacedim>
7185inline typename ::internal::TriangulationImplementation::
7186 Iterators<1, spacedim>::quad_iterator
7194template <
int spacedim>
7204template <
int spacedim>
7213template <
int spacedim>
7217 return vertex_kind != interior_vertex;
7221template <
int spacedim>
7225 switch (vertex_kind)
7231 this->vertex_index()) !=
7245template <
int spacedim>
7254template <
int spacedim>
7266template <
int spacedim>
7269 const unsigned int )
7275template <
int spacedim>
7284template <
int spacedim>
7293template <
int spacedim>
7302template <
int spacedim>
7311template <
int spacedim>
7320template <
int spacedim>
7329template <
int spacedim>
7338template <
int spacedim>
7347template <
int spacedim>
7357template <
int spacedim>
7365template <
int spacedim>
7373template <
int spacedim>
7380template <
int spacedim>
7388template <
int spacedim>
7397template <
int spacedim>
7403 ExcMessage(
"You can't set the boundary_id of a face of a cell that is "
7404 "not actually at the boundary."));
7411template <
int spacedim>
7420template <
int spacedim>
7430template <
int spacedim>
7439template <
int spacedim>
7448template <
int spacedim>
7457template <
int spacedim>
7466template <
int spacedim>
7475template <
int spacedim>
7476std_cxx20::ranges::iota_view<unsigned int, unsigned int>
7479 return std_cxx20::ranges::iota_view<unsigned int, unsigned int>(0U,
7485template <
int spacedim>
7486std_cxx20::ranges::iota_view<unsigned int, unsigned int>
7489 return std_cxx20::ranges::iota_view<unsigned int, unsigned int>(0U,
7496template <
int dim,
int spacedim>
7501 const AccessorData *local_data)
7507template <
int dim,
int spacedim>
7516template <
int dim,
int spacedim>
7522 this->child_index(i));
7532template <
int dim,
int spacedim>
7533inline boost::container::small_vector<TriaIterator<CellAccessor<dim, spacedim>>,
7537 boost::container::small_vector<TriaIterator<CellAccessor<dim, spacedim>>,
7539 child_iterators(this->n_children());
7541 for (
unsigned int i = 0; i < this->n_children(); ++i)
7542 child_iterators[i] = this->child(i);
7544 return child_iterators;
7549template <
int dim,
int spacedim>
7554 if constexpr (dim == 1)
7557 VertexKind vertex_kind = VertexKind::interior_vertex;
7558 if (i == 0 && at_boundary(0))
7559 vertex_kind = VertexKind::left_vertex;
7560 if (i == 1 && at_boundary(1))
7561 vertex_kind = VertexKind::right_vertex;
7564 this->vertex_index(i));
7567 else if constexpr (dim == 2)
7568 return this->line(i);
7569 else if constexpr (dim == 3)
7570 return this->quad(i);
7580template <
int dim,
int spacedim>
7585 for (
const unsigned int face_n : this->face_indices())
7586 if (this->face(face_n) == face)
7590 ExcMessage(
"The given face is not a face of the current cell."));
7596template <
int dim,
int spacedim>
7597inline boost::container::small_vector<
7607 boost::container::small_vector<
7615 face_iterators(this->n_faces());
7617 for (
const unsigned int i : this->face_indices())
7618 face_iterators[i] = this->face(i);
7620 return face_iterators;
7625template <
int dim,
int spacedim>
7632 return this->vertex_index(i);
7635 return this->line_index(i);
7638 return this->quad_index(i);
7647template <
int dim,
int spacedim>
7652 return this->tria->
levels[this->level()]->neighbor_index(this->present_index,
7658template <
int dim,
int spacedim>
7663 return this->tria->
levels[this->level()]->neighbor_level(this->present_index,
7669template <
int dim,
int spacedim>
7678 this->is_active() ||
7679 !this->tria->
levels[this->level()]->refine_flags[this->present_index],
7680 ExcRefineCellNotActive());
7682 this->tria->
levels[this->level()]->refine_flags[this->present_index]);
7687template <
int dim,
int spacedim>
7692 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7693 Assert(!coarsen_flag_set(), ExcCellFlaggedForCoarsening());
7695 this->tria->
levels[this->level()]->refine_flags[this->present_index] =
7701template <
int dim,
int spacedim>
7705 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7706 this->tria->
levels[this->level()]->refine_flags[this->present_index] =
7711template <
int dim,
int spacedim>
7716 if (this->tria->
levels[this->level()]->refine_choice.size() == 0)
7718 return this->tria->
levels[this->level()]->refine_choice[this->present_index];
7722template <
int dim,
int spacedim>
7725 const std::uint8_t refinement_choice)
const
7727 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7728 if (this->tria->
levels[this->level()]->refine_choice.size() != 0)
7729 this->tria->
levels[this->level()]->refine_choice[this->present_index] =
7734template <
int dim,
int spacedim>
7738 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7739 if (this->tria->
levels[this->level()]->refine_choice.size() != 0)
7740 this->tria->
levels[this->level()]->refine_choice[this->present_index] =
7745template <
int dim,
int spacedim>
7748 const unsigned int face_no,
7762 face_refinement_case,
7764 this->face_orientation(face_no),
7765 this->face_flip(face_no),
7766 this->face_rotation(face_no)));
7767 set_refine_flag(new_ref_case);
7769 return new_ref_case != old_ref_case;
7774template <
int dim,
int spacedim>
7777 const unsigned int line_no)
const
7785 old_ref_case = refine_flag_set(),
7789 set_refine_flag(new_ref_case);
7791 return new_ref_case != old_ref_case;
7796template <
int dim,
int spacedim>
7803 if constexpr (dim == 1)
7805 else if constexpr (dim == 2)
7806 return ((face(face_no)->has_children()) ?
7809 else if constexpr (dim == 3)
7811 switch (
static_cast<std::uint8_t
>(face(face_no)->refinement_case()))
7816 if (face(face_no)->child(0)->has_children())
7818 Assert(face(face_no)->child(0)->refinement_case() ==
7821 if (face(face_no)->child(1)->has_children())
7823 Assert(face(face_no)->child(1)->refinement_case() ==
7833 if (face(face_no)->child(1)->has_children())
7835 Assert(face(face_no)->child(1)->refinement_case() ==
7844 if (face(face_no)->child(0)->has_children())
7846 Assert(face(face_no)->child(0)->refinement_case() ==
7849 if (face(face_no)->child(1)->has_children())
7851 Assert(face(face_no)->child(1)->refinement_case() ==
7861 if (face(face_no)->child(1)->has_children())
7863 Assert(face(face_no)->child(1)->refinement_case() ==
7885template <
int dim,
int spacedim>
7894 this->is_active() ||
7895 !this->tria->
levels[this->level()]->coarsen_flags[this->present_index],
7896 ExcRefineCellNotActive());
7897 return this->tria->
levels[this->level()]->coarsen_flags[this->present_index];
7902template <
int dim,
int spacedim>
7906 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7907 Assert(!refine_flag_set(), ExcCellFlaggedForRefinement());
7909 this->tria->
levels[this->level()]->coarsen_flags[this->present_index] =
true;
7914template <
int dim,
int spacedim>
7918 Assert(this->used() && this->is_active(), ExcRefineCellNotActive());
7919 this->tria->
levels[this->level()]->coarsen_flags[this->present_index] =
false;
7924template <
int dim,
int spacedim>
7929 neighbor_level(face_no),
7930 neighbor_index(face_no));
7940template <
int dim,
int spacedim>
7944 return !this->has_children();
7949template <
int dim,
int spacedim>
7953 Assert(this->is_active(),
7954 ExcMessage(
"is_locally_owned() can only be called on active cells!"));
7955# ifndef DEAL_II_WITH_MPI
7972template <
int dim,
int spacedim>
7976# ifndef DEAL_II_WITH_MPI
7987 this->level_subdomain_id() == locally_owned_subdomain);
7993template <
int dim,
int spacedim>
7997 Assert(this->is_active(),
7998 ExcMessage(
"is_ghost() can only be called on active cells!"));
7999 if (this->has_children())
8002# ifndef DEAL_II_WITH_MPI
8015 subdomain_id != locally_owned_subdomain &&
8022template <
int dim,
int spacedim>
8026# ifndef DEAL_II_WITH_MPI
8038 subdomain_id != locally_owned_subdomain &&
8046template <
int dim,
int spacedim>
8050 Assert(this->is_active(),
8051 ExcMessage(
"is_artificial() can only be called on active cells!"));
8052# ifndef DEAL_II_WITH_MPI
8068template <
int dim,
int spacedim>
8072# ifndef DEAL_II_WITH_MPI
8083template <
int dim,
int spacedim>
8088 return this->tria->
levels[this->level()]
8089 ->cells.boundary_or_material_id[this->present_index]
8095template <
int dim,
int spacedim>
8100 Assert(this->is_active(),
8101 ExcMessage(
"subdomain_id() can only be called on active cells!"));
8102 return this->tria->
levels[this->level()]->subdomain_ids[this->present_index];
8107template <
int dim,
int spacedim>
8112 return this->tria->
levels[this->level()]
8113 ->level_subdomain_ids[this->present_index];
8118template <
int dim,
int spacedim>
8122 const unsigned int n2 = neighbor_of_neighbor_internal(neighbor);
8128 return neighbor_of_coarser_neighbor(neighbor).first;
8133template <
int dim,
int spacedim>
8142template <
int dim,
int spacedim>
8147 return this->tria->
levels[this->level()]
8148 ->active_cell_indices[this->present_index];
8153template <
int dim,
int spacedim>
8158 Assert(this->is_active(),
8160 "global_active_cell_index() can only be called on active cells!"));
8162 return this->tria->
levels[this->level()]
8163 ->global_active_cell_indices[this->present_index];
8168template <
int dim,
int spacedim>
8172 return this->tria->
levels[this->level()]
8173 ->global_level_cell_indices[this->present_index];
8178template <
int dim,
int spacedim>
8183 if constexpr (dim == spacedim)
8185 else if constexpr (dim == spacedim - 1)
8186 return this->tria->
levels[this->level()]
8187 ->direction_flags[this->present_index];
8191 ExcMessage(
"This function cannot be called if dim<spacedim-1."));
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
boost::container::small_vector< TriaIterator< CellAccessor< dim, spacedim > >, ReferenceCells::max_n_children< dim >()> child_iterators() 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
std::set< TriaActiveIterator< CellAccessor< dim, spacedim > > > get_cells_adjacent_to_line(const unsigned int i) const
void set_refine_choice(const std::uint8_t refinement_choice=static_cast< char >(IsotropicRefinementChoice::isotropic_refinement)) 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
constexpr unsigned int n_vertices() const
std::array< unsigned int, 2 > standard_vertex_to_face_and_vertex_index(const unsigned int vertex) const
constexpr unsigned int n_faces() const
unsigned int standard_to_real_face_line(const unsigned int line, const unsigned int face, const types::geometric_orientation face_orientation) const
constexpr unsigned int n_lines() 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_line_to_face_and_line_index(const unsigned int line) 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
friend class TriaRawIterator
::internal::TriangulationImplementation::TriaObjects & objects() const
TriaAccessorBase & operator=(const TriaAccessorBase &)
const Triangulation< dim, spacedim > * tria
bool operator==(const TriaAccessorBase &) const
static TriaIterator< TriaAccessor< 0, 1, spacedim > > isotropic_child(const unsigned int)
Return an invalid object.
static unsigned int line_index(const unsigned int i)
std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices() const
unsigned int global_vertex_index
static unsigned int child_iterator_to_index(const TriaIterator< TriaAccessor< 0, 1, spacedim > > &)
Return an invalid unsigned integer.
static unsigned int max_refinement_depth()
static unsigned int quad_index(const unsigned int i)
static typename::internal::TriangulationImplementation::Iterators< 1, spacedim >::quad_iterator quad(const unsigned int i)
const Manifold< 1, spacedim > & get_manifold() const
TriaAccessor(const InvalidAccessor< structdim2, dim2, spacedim2 > &)
TriaAccessor(const Triangulation< 1, spacedim > *tria, const VertexKind vertex_kind, const unsigned int vertex_index)
static TriaIterator< TriaAccessor< 0, 1, spacedim > > child(const unsigned int)
Return an invalid object.
unsigned int n_lines() const
const Triangulation< 1, spacedim > & get_triangulation() const
static bool has_children()
bool operator!=(const TriaAccessor &) const
TriaAccessor(const Triangulation< 1, spacedim > *tria=nullptr, const int=0, const int=0, const AccessorData *=nullptr)
static unsigned int n_active_descendants()
static int isotropic_child_index(const unsigned int i)
Returns -1.
types::boundary_id boundary_id() const
static typename::internal::TriangulationImplementation::Iterators< 1, spacedim >::line_iterator line(const unsigned int)
static RefinementCase< 0 > refinement_case()
std_cxx20::ranges::iota_view< unsigned int, unsigned int > line_indices() const
unsigned int vertex_index(const unsigned int i=0) const
void copy_from(const TriaAccessor &)
void set_all_boundary_ids(const types::boundary_id) const
static IteratorState::IteratorStates state()
Point< spacedim > center() const
static int child_index(const unsigned int i)
Returns -1.
types::manifold_id manifold_id() const
static constexpr unsigned int space_dimension
static unsigned int n_children()
TriaAccessor(const TriaAccessor< structdim2, dim2, spacedim2 > &)
void set_boundary_id(const types::boundary_id) const
Point< spacedim > & vertex(const unsigned int i=0) const
static const unsigned int structure_dimension
unsigned int n_vertices() const
void set_manifold_id(const types::manifold_id)
static constexpr unsigned int dimension
void copy_from(const TriaAccessorBase< 0, 1, spacedim > &)
ReferenceCell< 0 > reference_cell() const
bool operator==(const TriaAccessor &) const
const Triangulation< 1, spacedim > * tria
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
void set_user_index(const unsigned int p) const
TriaAccessor(TriaAccessor &&)=default
void clear_user_pointer() const
unsigned int n_active_descendants() const
void recursively_set_user_index(const unsigned int p) const
TriaIterator< TriaAccessor< 0, dim, spacedim > > vertex_iterator(const unsigned int i) const
void clear_user_data() const
Point< structdim > real_to_unit_cell_affine_approximation(const Point< spacedim > &point) const
void recursively_clear_user_index() const
unsigned int line_index(const unsigned int i) const
const Manifold< dim, spacedim > & get_manifold() const
void recursively_set_user_pointer(void *p) 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
void recursively_clear_user_flag() const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > line_indices() const
Point< spacedim > barycenter() const
BoundingBox< spacedim > bounding_box() const
void set_bounding_object_indices(const std::initializer_list< unsigned int > &new_indices) const
void clear_user_flag() 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 recursively_set_user_flag() const
void set_boundary_id(const types::boundary_id) const
bool is_translation_of(const TriaIterator< TriaAccessor< structdim, dim, spacedim > > &o) const
bool user_flag_set() const
void set_used_flag() const
types::manifold_id manifold_id() const
void set_user_flag() const
TriaAccessor(const TriaAccessor &)=default
void clear_used_flag() const
std::pair< Point< spacedim >, double > enclosing_ball() const
unsigned int vertex_index(const unsigned int i) const
void * user_pointer() 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
ReferenceCell< structdim > reference_cell() const
void set_refinement_case(const RefinementCase< structdim > &ref_case) const
void clear_user_index() const
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
unsigned int max_refinement_depth() const
Point< spacedim > & vertex(const unsigned int i) const
void set_line_orientation(const unsigned int line, const types::geometric_orientation orientation) const
unsigned int quad_index(const unsigned int i) const
TriaAccessor & operator=(const TriaAccessor &)=delete
unsigned int user_index() const
int child_index(const unsigned int i) const
void set_user_pointer(void *p) const
void recursively_clear_user_pointer() const
RefinementCase< structdim > refinement_case() const
typename::internal::TriangulationImplementation::Iterators< dim, spacedim >::line_iterator line(const unsigned int i) const
TriaAccessor(const Triangulation< dim, spacedim > *parent=nullptr, const int level=-1, const int index=-1, const AccessorData *local_data=nullptr)
typename TriaAccessorBase< structdim, dim, spacedim >::AccessorData AccessorData
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 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
std::unique_ptr< std::map< unsigned int, types::manifold_id > > vertex_to_manifold_id_map_1d
std::unique_ptr<::internal::TriangulationImplementation::TriaFaces< dim > > faces
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::vector< std::unique_ptr< ::internal::TriangulationImplementation::TriaLevel< dim, spacedim > > > levels
bool vertex_used(const unsigned int index) const
unsigned int n_vertices() const
static void set_level(const int level)
LevelAccessor(const int level)
void set_level(const int level)
LevelAccessor(const int level)
#define DEAL_II_DEPRECATED
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
#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.
void set_combined_face_orientation(const unsigned int face_no, const types::geometric_orientation combined_orientation) const
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.
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< dim > &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)
* * * * std::vector< Number > ThermoPlasticMaterial< dim, ViscoplasticYieldLaw, Number >::get_state_parameters const
constexpr unsigned int max_n_children()
constexpr ReferenceCell< 3 > Hexahedron
constexpr ReferenceCell< 2 > Quadrilateral
ReferenceCell< dim > n_vertices_to_reference_cell(const unsigned int n_vertices)
constexpr ReferenceCell< 1 > Line
constexpr ReferenceCell< 2 > Triangle
constexpr unsigned int max_n_vertices()
constexpr ReferenceCell< 3 > Tetrahedron
constexpr unsigned int max_n_faces()
constexpr ReferenceCell< 3 > Pyramid
constexpr ReferenceCell< 3 > Wedge
constexpr ReferenceCell< 0 > Vertex
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 types::geometric_orientation invalid_geometric_orientation
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
::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
std::uint8_t 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)