16 #ifndef dealii__tria_accessor_h 17 #define dealii__tria_accessor_h 20 #include <deal.II/base/config.h> 21 #include <deal.II/base/exceptions.h> 22 #include <deal.II/base/geometry_info.h> 23 #include <deal.II/base/point.h> 24 #include <deal.II/grid/tria_iterator_base.h> 25 #include <deal.II/grid/tria_iterator_selector.h> 26 #include <deal.II/grid/cell_id.h> 31 DEAL_II_NAMESPACE_OPEN
38 template <
int dim,
int spacedim>
class Boundary;
39 template <
int dim,
int spacedim>
class Manifold;
73 type (
const int level)
75 Assert (level == 0, ExcInternalError());
87 void operator ++ ()
const 89 Assert (
false, ExcInternalError());
92 void operator -- ()
const 94 Assert (
false, ExcInternalError());
112 template <
int structdim,
int dim,
int spacedim>
class TriaAccessor;
113 template <
int dim,
int spacedim>
class TriaAccessor<0, dim, spacedim>;
114 template <
int spacedim>
class TriaAccessor<0, 1, spacedim>;
166 <<
"You can only set the child index if the cell has no " 167 <<
"children, or clear it. The given " 168 <<
"index was " << arg1 <<
" (-1 means: clear children)");
213 <<
"You can only set the child index of an even numbered child." 214 <<
"The number of the child given was " << arg1 <<
".");
244 template <
int structdim,
int dim,
int spacedim=dim>
253 static const unsigned int space_dimension = spacedim;
260 static const unsigned int dimension = dim;
267 static const unsigned int structure_dimension = structdim;
281 const int level = -1,
282 const int index = -1,
283 const AccessorData * = 0);
448 typename ::internal::TriaAccessor::PresentLevelType<structdim,dim>::type
present_level;
490 template <
int structdim,
int dim,
int spacedim=dim>
507 const int level = -1,
508 const int index = -1,
509 const AccessorData *local_data = 0);
524 template <
typename OtherAccessor>
541 void operator ++ ()
const;
542 void operator -- ()
const;
554 bool has_children ()
const;
574 template <
int structdim,
int dim,
int spacedim>
589 const int level = -1,
590 const int index = -1,
605 template <
int structdim2,
int dim2,
int spacedim2>
612 template <
int structdim2,
int dim2,
int spacedim2>
634 typename ::internal::Triangulation::Iterators<dim,spacedim>::vertex_iterator
635 vertex_iterator (
const unsigned int i)
const;
652 unsigned int vertex_index (
const unsigned int i)
const;
696 typename ::internal::Triangulation::Iterators<dim,spacedim>::line_iterator
697 line (
const unsigned int i)
const;
705 unsigned int line_index (
const unsigned int i)
const;
710 typename ::internal::Triangulation::Iterators<dim,spacedim>::quad_iterator
711 quad (
const unsigned int i)
const;
719 unsigned int quad_index (
const unsigned int i)
const;
742 bool face_orientation (
const unsigned int face)
const;
753 bool face_flip (
const unsigned int face)
const;
764 bool face_rotation (
const unsigned int face)
const;
776 bool line_orientation (
const unsigned int line)
const;
791 bool has_children ()
const;
797 unsigned int n_children()
const;
812 unsigned int number_of_children ()
const;
827 unsigned int max_refinement_depth ()
const;
833 child (
const unsigned int i)
const;
844 isotropic_child (
const unsigned int i)
const;
856 int child_index (
const unsigned int i)
const;
863 int isotropic_child_index (
const unsigned int i)
const;
924 void set_boundary_id (const
types::boundary_id) const;
964 void set_all_boundary_ids (const
types::boundary_id) const;
972 void set_all_boundary_indicators (const
types::boundary_id) const DEAL_II_DEPRECATED;
981 bool at_boundary () const;
988 const
Boundary<dim,spacedim> &get_boundary () const;
999 const
Manifold<dim,spacedim> &get_manifold () const;
1021 types::manifold_id manifold_id () const;
1040 void set_manifold_id (const
types::manifold_id) const;
1055 void set_all_manifold_ids (const
types::manifold_id) const;
1073 bool user_flag_set () const;
1080 void set_user_flag () const;
1087 void clear_user_flag () const;
1094 void recursively_set_user_flag () const;
1101 void recursively_clear_user_flag () const;
1108 void clear_user_data () const;
1121 void set_user_pointer (
void *p) const;
1128 void clear_user_pointer () const;
1145 void *user_pointer () const;
1168 void recursively_set_user_pointer (
void *p) const;
1176 void recursively_clear_user_pointer () const;
1187 void set_user_index (const
unsigned int p) const;
1194 void clear_user_index () const;
1207 unsigned int user_index () const;
1226 void recursively_set_user_index (const
unsigned int p) const;
1236 void recursively_clear_user_index () const;
1255 double diameter () const;
1266 double extent_in_direction (const
unsigned int axis) const;
1271 double minimum_vertex_distance () const;
1286 Point<spacedim> intermediate_point(const
Point<structdim> &coordinates) const;
1306 Point<spacedim> center (const
bool respect_manifold=false,
1307 const
bool use_laplace_transformation=false) const;
1312 Point<spacedim> barycenter () const;
1339 double measure () const;
1377 void set_line_orientation (const
unsigned int line,
1378 const
bool orientation) const;
1390 void set_face_orientation (const
unsigned int face,
1391 const
bool orientation) const;
1399 void set_face_flip (const
unsigned int face,
1400 const
bool flip) const;
1408 void set_face_rotation (const
unsigned int face,
1409 const
bool rotation) const;
1414 void set_used_flag () const;
1419 void clear_used_flag () const;
1429 void set_refinement_case (const
RefinementCase<structdim> &ref_case) const;
1438 void clear_refinement_case () const;
1446 void set_children (const
unsigned int i, const
int index) const;
1452 void clear_children () const;
1469 friend struct ::
internal::Triangulation::Implementation;
1470 friend struct ::
internal::TriaAccessor::Implementation;
1491 template<
int dim,
int spacedim>
1492 class TriaAccessor<0, dim, spacedim>
1500 static const unsigned int space_dimension = spacedim;
1507 static const unsigned int dimension = dim;
1514 static const unsigned int structure_dimension = 0;
1526 const unsigned int vertex_index);
1534 const int level = 0,
1535 const int index = 0,
1536 const AccessorData * = 0);
1541 template <
int structdim2,
int dim2,
int spacedim2>
1547 template <
int structdim2,
int dim2,
int spacedim2>
1559 static int level ();
1576 void operator ++ ();
1581 void operator -- ();
1585 bool operator == (
const TriaAccessor &)
const;
1590 bool operator != (
const TriaAccessor &)
const;
1619 unsigned int vertex_index (
const unsigned int i = 0)
const;
1632 typename ::internal::Triangulation::Iterators<dim,spacedim>::line_iterator
1633 static line (
const unsigned int);
1638 static unsigned int line_index (
const unsigned int i);
1644 typename ::internal::Triangulation::Iterators<dim,spacedim>::quad_iterator
1645 quad (
const unsigned int i);
1650 static unsigned int quad_index (
const unsigned int i);
1667 double diameter ()
const;
1676 double extent_in_direction (
const unsigned int axis)
const;
1686 const bool use_laplace_transformation=
false)
const;
1696 double measure ()
const;
1711 static bool face_orientation (
const unsigned int face);
1716 static bool face_flip (
const unsigned int face);
1721 static bool face_rotation (
const unsigned int face);
1726 static bool line_orientation (
const unsigned int line);
1742 static bool has_children ();
1748 static unsigned int n_children();
1754 static unsigned int number_of_children ();
1759 static unsigned int max_refinement_depth ();
1766 child (
const unsigned int);
1773 isotropic_child (
const unsigned int);
1785 int child_index (
const unsigned int i);
1791 int isotropic_child_index (
const unsigned int i);
1809 void copy_from (
const TriaAccessor &);
1824 template <
typename Accessor>
friend class TriaIterator;
1839 template <
int spacedim>
1848 static const unsigned int space_dimension = spacedim;
1855 static const unsigned int dimension = 1;
1862 static const unsigned int structure_dimension = 0;
1893 const unsigned int vertex_index);
1903 const AccessorData * = 0);
1908 template <
int structdim2,
int dim2,
int spacedim2>
1914 template <
int structdim2,
int dim2,
int spacedim2>
1921 void copy_from (
const TriaAccessor &);
1934 static int level ();
1952 void operator ++ ()
const;
1958 void operator -- ()
const;
1962 bool operator == (
const TriaAccessor &)
const;
1967 bool operator != (
const TriaAccessor &)
const;
1995 unsigned int vertex_index (
const unsigned int i = 0)
const;
2014 typename ::internal::Triangulation::Iterators<1,spacedim>::line_iterator
2015 static line (
const unsigned int);
2023 static unsigned int line_index (
const unsigned int i);
2029 typename ::internal::Triangulation::Iterators<1,spacedim>::quad_iterator
2030 quad (
const unsigned int i);
2038 static unsigned int quad_index (
const unsigned int i);
2049 bool at_boundary ()
const;
2094 static bool face_orientation (
const unsigned int face);
2099 static bool face_flip (
const unsigned int face);
2104 static bool face_rotation (
const unsigned int face);
2109 static bool line_orientation (
const unsigned int line);
2125 static bool has_children ();
2131 static unsigned int n_children();
2137 static unsigned int number_of_children ();
2142 static unsigned int max_refinement_depth ();
2149 child (
const unsigned int);
2156 isotropic_child (
const unsigned int);
2168 int child_index (
const unsigned int i);
2174 int isotropic_child_index (
const unsigned int i);
2308 template <
int dim,
int spacedim=dim>
2333 const int level = -1,
2334 const int index = -1,
2335 const AccessorData *local_data = 0);
2354 template <
int structdim2,
int dim2,
int spacedim2>
2361 template <
int structdim2,
int dim2,
int spacedim2>
2380 child (
const unsigned int i)
const;
2386 face (
const unsigned int i)
const;
2398 face_index (
const unsigned int i)
const;
2448 neighbor_child_on_subface (
const unsigned int face_no,
2449 const unsigned int subface_no)
const;
2473 neighbor (
const unsigned int i)
const;
2479 int neighbor_index (
const unsigned int i)
const;
2485 int neighbor_level (
const unsigned int i)
const;
2498 unsigned int neighbor_of_neighbor (
const unsigned int neighbor)
const;
2510 bool neighbor_is_coarser (
const unsigned int neighbor)
const;
2526 std::pair<unsigned int, unsigned int>
2527 neighbor_of_coarser_neighbor (
const unsigned int neighbor)
const;
2535 unsigned int neighbor_face_no (
const unsigned int neighbor)
const;
2553 bool at_boundary (
const unsigned int i)
const;
2563 bool at_boundary ()
const;
2572 bool has_boundary_lines ()
const;
2610 void clear_refine_flag ()
const;
2619 bool flag_for_face_refinement (
const unsigned int face_no,
2627 bool flag_for_line_refinement (
const unsigned int line_no)
const;
2642 bool coarsen_flag_set ()
const;
2648 void set_coarsen_flag ()
const;
2653 void clear_coarsen_flag ()
const;
2790 bool direction_flag ()
const;
2817 unsigned int active_cell_index ()
const;
2826 int parent_index ()
const;
2855 bool active ()
const;
2876 bool is_locally_owned ()
const;
2882 bool is_locally_owned_on_level ()
const;
2907 bool is_ghost ()
const;
2935 bool is_artificial ()
const;
2960 void set_neighbor (
const unsigned int i,
3012 unsigned int neighbor_of_neighbor_internal (
const unsigned int neighbor)
const;
3019 template<
int dim_,
int spacedim_ >
3029 void set_active_cell_index (
const unsigned int active_cell_index);
3034 void set_parent (
const unsigned int parent_index);
3042 void set_direction_flag (
const bool new_direction_flag)
const;
3056 friend struct ::internal::Triangulation::Implementation;
3065 template <
int structdim,
int dim,
int spacedim>
3066 template <
typename OtherAccessor>
3071 ExcMessage (
"You are attempting an illegal conversion between " 3072 "iterator/accessor types. The constructor you call " 3073 "only exists to make certain template constructs " 3074 "easier to write as dimension independent code but " 3075 "the conversion is not valid in the current context."));
3080 template <
int structdim,
int dim,
int spacedim>
3081 template <
int structdim2,
int dim2,
int spacedim2>
3086 ExcMessage (
"You are attempting an illegal conversion between " 3087 "iterator/accessor types. The constructor you call " 3088 "only exists to make certain template constructs " 3089 "easier to write as dimension independent code but " 3090 "the conversion is not valid in the current context."));
3095 template <
int dim,
int spacedim>
3096 template <
int structdim2,
int dim2,
int spacedim2>
3101 ExcMessage (
"You are attempting an illegal conversion between " 3102 "iterator/accessor types. The constructor you call " 3103 "only exists to make certain template constructs " 3104 "easier to write as dimension independent code but " 3105 "the conversion is not valid in the current context."));
3110 template <
int structdim,
int dim,
int spacedim>
3111 template <
int structdim2,
int dim2,
int spacedim2>
3116 ExcMessage (
"You are attempting an illegal conversion between " 3117 "iterator/accessor types. The constructor you call " 3118 "only exists to make certain template constructs " 3119 "easier to write as dimension independent code but " 3120 "the conversion is not valid in the current context."));
3125 template <
int dim,
int spacedim>
3126 template <
int structdim2,
int dim2,
int spacedim2>
3131 ExcMessage (
"You are attempting an illegal conversion between " 3132 "iterator/accessor types. The constructor you call " 3133 "only exists to make certain template constructs " 3134 "easier to write as dimension independent code but " 3135 "the conversion is not valid in the current context."));
3138 template <
int dim,
int spacedim>
3142 std::vector<unsigned char> id(this->level(), -1);
3143 unsigned int coarse_index;
3146 while (ptr.
level()>0)
3150 for (
unsigned int c=0; c<ptr.
parent()->n_children(); ++c)
3159 Assert(v != (
unsigned char)-1, ExcInternalError());
3160 id[ptr.
level()-1] = v;
3166 coarse_index = ptr.
index();
3168 return CellId(coarse_index,
id);
3186 DEAL_II_NAMESPACE_CLOSE
3189 # include "tria_accessor.templates.h"
TriaAccessor< dim, dim, spacedim >::AccessorData AccessorData
unsigned int global_vertex_index
unsigned char material_id
const Triangulation< dim, spacedim > * tria
TriaAccessorBase< structdim, dim, spacedim >::AccessorData AccessorData
::ExceptionBase & ExcMessage(std::string arg1)
DeclException1(ExcGridHasInvalidCell, int,<< "Something went wrong when making cell "<< arg1<< ". Read the docs and the source code "<< "for more information.")
void copy_from(const TriaAccessorBase &)
void set_all_manifold_ids(const types::manifold_id) const
const Triangulation< 1, spacedim > * tria
TriaIterator< CellAccessor< dim, spacedim > > parent() const
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
TriaAccessorBase< structdim, dim, spacedim >::AccessorData AccessorData
#define Assert(cond, exc)
TriaAccessor(const Triangulation< dim, spacedim > *parent=0, const int level=-1, const int index=-1, const AccessorData *local_data=0)
const Triangulation< dim, spacedim > * tria
#define DeclException0(Exception0)
typename ::internal::TriaAccessor::PresentLevelType< structdim, dim >::type present_level
unsigned int subdomain_id
bool point_inside(const Point< spacedim > &p) const
CellAccessor(const Triangulation< dim, spacedim > *parent=0, const int level=-1, const int index=-1, const AccessorData *local_data=0)
Triangulation< dim, spacedim > Container
InvalidAccessor(const Triangulation< dim, spacedim > *parent=0, const int level=-1, const int index=-1, const AccessorData *local_data=0)
unsigned char boundary_id
unsigned int global_vertex_index