16 #ifndef dealii__tria_h 17 #define dealii__tria_h 20 #include <deal.II/base/config.h> 21 #include <deal.II/base/point.h> 22 #include <deal.II/base/subscriptor.h> 23 #include <deal.II/base/smartpointer.h> 24 #include <deal.II/base/geometry_info.h> 25 #include <deal.II/base/iterator_range.h> 26 #include <deal.II/base/std_cxx11/function.h> 27 #include <deal.II/base/std_cxx11/unique_ptr.h> 28 #include <deal.II/grid/tria_iterator_selector.h> 31 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
32 #include <boost/signals2.hpp> 33 #include <boost/serialization/vector.hpp> 34 #include <boost/serialization/map.hpp> 35 #ifdef DEAL_II_WITH_CXX11 36 # include <boost/serialization/unique_ptr.hpp> 38 # include <boost/serialization/scoped_ptr.hpp> 40 #include <boost/serialization/split_member.hpp> 41 DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
50 DEAL_II_NAMESPACE_OPEN
52 template <
int dim,
int spacedim>
class Boundary;
54 template <
int dim,
int spacedim>
class Manifold;
58 template<
typename CellIterator>
struct PeriodicFacePair;
62 template <
int spacedim>
class TriaAccessor<0,1,spacedim>;
90 template <
int dim,
int spacedim>
class DoFHandler;
131 template <
int structdim>
273 bool check_consistency (
const unsigned int dim)
const;
357 std::size_t memory_consumption ()
const;
363 template <
class Archive>
364 void serialize (Archive &ar,
365 const unsigned int version);
415 std::size_t memory_consumption ()
const;
421 template <
class Archive>
422 void serialize (Archive &ar,
423 const unsigned int version);
474 std::size_t memory_consumption ()
const;
480 template <
class Archive>
481 void serialize (Archive &ar,
482 const unsigned int version);
1244 template <
int dim,
int spacedim=dim>
1315 limit_level_difference_at_vertices = 0x1,
1336 eliminate_unrefined_islands = 0x2,
1352 patch_level_1 = 0x4,
1373 coarsest_level_1 = 0x8,
1398 allow_anisotropic_smoothing = 0x10,
1431 eliminate_refined_inner_islands = 0x100,
1436 eliminate_refined_boundary_islands = 0x200,
1442 do_not_produce_unrefined_islands = 0x400,
1448 smoothing_on_refinement = (limit_level_difference_at_vertices |
1449 eliminate_unrefined_islands),
1454 smoothing_on_coarsening = (eliminate_refined_inner_islands |
1455 eliminate_refined_boundary_islands |
1456 do_not_produce_unrefined_islands),
1463 maximum_smoothing = 0xffff ^ allow_anisotropic_smoothing
1504 typedef typename IteratorSelector::vertex_iterator vertex_iterator;
1505 typedef typename IteratorSelector::active_vertex_iterator active_vertex_iterator;
1507 typedef typename IteratorSelector::line_iterator line_iterator;
1508 typedef typename IteratorSelector::active_line_iterator active_line_iterator;
1510 typedef typename IteratorSelector::quad_iterator quad_iterator;
1511 typedef typename IteratorSelector::active_quad_iterator active_quad_iterator;
1513 typedef typename IteratorSelector::hex_iterator hex_iterator;
1514 typedef typename IteratorSelector::active_hex_iterator active_hex_iterator;
1548 std::list<typename Triangulation<dim,spacedim>::cell_iterator>
1555 static const unsigned int dimension = dim;
1560 static const unsigned int space_dimension = spacedim;
1577 const bool check_for_distorted_cells =
false);
1596 #ifdef DEAL_II_WITH_CXX11 1622 virtual void clear ();
1629 virtual void set_mesh_smoothing (
const MeshSmoothing mesh_smoothing);
1797 std::vector<types::boundary_id> get_boundary_ids()
const;
1810 std::vector<types::manifold_id> get_manifold_ids()
const;
1884 virtual void create_triangulation (
const std::vector<
Point<spacedim> > &vertices,
1896 virtual void create_triangulation_compatibility (
1907 void flip_all_direction_flags();
1920 void set_all_refine_flags ();
1936 void refine_global (
const unsigned int times = 1);
1969 virtual void execute_coarsening_and_refinement ();
2000 virtual bool prepare_coarsening_and_refinement ();
2045 template<
typename T>
2048 typedef T result_type;
2050 template<
typename InputIterator>
2051 T operator()(InputIterator first, InputIterator last)
const 2053 return std::accumulate (first, last, T());
2109 boost::signals2::signal<void (const typename Triangulation<dim, spacedim>::cell_iterator &cell)> pre_coarsening_on_cell;
2117 boost::signals2::signal<void (const typename Triangulation<dim, spacedim>::cell_iterator &cell)> post_refinement_on_cell;
2125 boost::signals2::signal<void (const Triangulation<dim, spacedim> &destination_tria)> copy;
2175 boost::signals2::signal<
unsigned int (
const cell_iterator &,
2198 void save_refine_flags (std::ostream &out)
const;
2203 void save_refine_flags (std::vector<bool> &v)
const;
2208 void load_refine_flags (std::istream &in);
2213 void load_refine_flags (
const std::vector<bool> &v);
2218 void save_coarsen_flags (std::ostream &out)
const;
2223 void save_coarsen_flags (std::vector<bool> &v)
const;
2228 void load_coarsen_flags (std::istream &out);
2233 void load_coarsen_flags (
const std::vector<bool> &v);
2239 bool get_anisotropic_refinement_flag()
const;
2254 void clear_user_flags ();
2261 void save_user_flags (std::ostream &out)
const;
2268 void save_user_flags (std::vector<bool> &v)
const;
2274 void load_user_flags (std::istream &in);
2280 void load_user_flags (
const std::vector<bool> &v);
2286 void clear_user_flags_line ();
2292 void save_user_flags_line (std::ostream &out)
const;
2299 void save_user_flags_line (std::vector<bool> &v)
const;
2305 void load_user_flags_line (std::istream &in);
2311 void load_user_flags_line (
const std::vector<bool> &v);
2317 void clear_user_flags_quad ();
2323 void save_user_flags_quad (std::ostream &out)
const;
2330 void save_user_flags_quad (std::vector<bool> &v)
const;
2336 void load_user_flags_quad (std::istream &in);
2342 void load_user_flags_quad (
const std::vector<bool> &v);
2349 void clear_user_flags_hex ();
2355 void save_user_flags_hex (std::ostream &out)
const;
2362 void save_user_flags_hex (std::vector<bool> &v)
const;
2368 void load_user_flags_hex (std::istream &in);
2374 void load_user_flags_hex (
const std::vector<bool> &v);
2381 void clear_user_data ();
2388 void save_user_indices (std::vector<unsigned int> &v)
const;
2394 void load_user_indices (
const std::vector<unsigned int> &v);
2401 void save_user_pointers (std::vector<void *> &v)
const;
2407 void load_user_pointers (
const std::vector<void *> &v);
2414 void save_user_indices_line (std::vector<unsigned int> &v)
const;
2420 void load_user_indices_line (
const std::vector<unsigned int> &v);
2427 void save_user_indices_quad (std::vector<unsigned int> &v)
const;
2433 void load_user_indices_quad (
const std::vector<unsigned int> &v);
2440 void save_user_indices_hex (std::vector<unsigned int> &v)
const;
2446 void load_user_indices_hex (
const std::vector<unsigned int> &v);
2452 void save_user_pointers_line (std::vector<void *> &v)
const;
2458 void load_user_pointers_line (
const std::vector<void *> &v);
2465 void save_user_pointers_quad (std::vector<void *> &v)
const;
2471 void load_user_pointers_quad (
const std::vector<void *> &v);
2478 void save_user_pointers_hex (std::vector<void *> &v)
const;
2484 void load_user_pointers_hex (
const std::vector<void *> &v);
2498 cell_iterator begin (
const unsigned int level = 0)
const;
2512 active_cell_iterator begin_active(
const unsigned int level = 0)
const;
2518 cell_iterator end ()
const;
2524 cell_iterator end (
const unsigned int level)
const;
2531 active_cell_iterator end_active (
const unsigned int level)
const;
2537 cell_iterator last ()
const;
2542 active_cell_iterator last_active ()
const;
2647 face_iterator begin_face ()
const;
2652 active_face_iterator begin_active_face()
const;
2658 face_iterator end_face ()
const;
2676 vertex_iterator begin_vertex()
const;
2683 active_vertex_iterator begin_active_vertex()
const;
2690 vertex_iterator end_vertex()
const;
2713 unsigned int n_lines ()
const;
2718 unsigned int n_lines (
const unsigned int level)
const;
2723 unsigned int n_active_lines ()
const;
2728 unsigned int n_active_lines (
const unsigned int level)
const;
2733 unsigned int n_quads ()
const;
2738 unsigned int n_quads (
const unsigned int level)
const;
2743 unsigned int n_active_quads ()
const;
2748 unsigned int n_active_quads (
const unsigned int level)
const;
2753 unsigned int n_hexs()
const;
2759 unsigned int n_hexs(
const unsigned int level)
const;
2764 unsigned int n_active_hexs()
const;
2770 unsigned int n_active_hexs(
const unsigned int level)
const;
2776 unsigned int n_cells ()
const;
2782 unsigned int n_cells (
const unsigned int level)
const;
2788 unsigned int n_active_cells ()
const;
2804 unsigned int n_active_cells (
const unsigned int level)
const;
2811 unsigned int n_faces ()
const;
2818 unsigned int n_active_faces ()
const;
2837 unsigned int n_levels ()
const;
2846 unsigned int n_global_levels ()
const;
2858 bool has_hanging_nodes()
const;
2867 unsigned int n_vertices ()
const;
2877 const std::vector<Point<spacedim> > &
2878 get_vertices ()
const;
2884 unsigned int n_used_vertices ()
const;
2889 bool vertex_used (
const unsigned int index)
const;
2895 const std::vector<bool> &
2896 get_used_vertices ()
const;
2909 unsigned int max_adjacent_cells ()
const;
2929 get_triangulation ();
2936 get_triangulation ()
const;
2957 unsigned int n_raw_lines ()
const;
2968 unsigned int n_raw_lines (
const unsigned int level)
const;
2979 unsigned int n_raw_quads ()
const;
2990 unsigned int n_raw_quads (
const unsigned int level)
const;
3001 unsigned int n_raw_hexs ()
const;
3012 unsigned int n_raw_hexs (
const unsigned int level)
const;
3023 unsigned int n_raw_cells (
const unsigned int level)
const;
3035 unsigned int n_raw_faces ()
const;
3049 virtual std::size_t memory_consumption ()
const;
3059 template <
class Archive>
3060 void save (Archive &ar,
3061 const unsigned int version)
const;
3078 template <
class Archive>
3079 void load (Archive &ar,
3080 const unsigned int version);
3105 const std::map<std::pair<cell_iterator, unsigned int>,std::pair<std::pair<cell_iterator, unsigned int>, std::bitset<3> > > &
3106 get_periodic_face_map()
const;
3109 BOOST_SERIALIZATION_SPLIT_MEMBER()
3123 << "The given level " << arg1
3124 << " is not in the valid range!");
3133 << "You are trying to perform an operation on a triangulation "
3134 << "that is only allowed if the triangulation is currently empty. "
3135 << "However, it currently stores " << arg1 << " vertices and has "
3136 << "cells on " << arg2 << " levels.");
3155 << "You tried to do something on level " << arg1
3156 << ", but this level is empty.");
3173 << "The given boundary_id " << arg1
3200 static
void write_bool_vector (const
unsigned int magic_number1,
3201 const
std::vector<
bool> &v,
3202 const
unsigned int magic_number2,
3209 static
void read_bool_vector (const
unsigned int magic_number1,
3210 std::vector<
bool> &v,
3211 const
unsigned int magic_number2,
3217 void update_periodic_face_map ();
3227 std::vector<
GridTools::PeriodicFacePair<cell_iterator> > periodic_face_pairs_level_0;
3232 std::map<
std::pair<cell_iterator,
unsigned int>,
std::pair<
std::pair<cell_iterator,
unsigned int>,
std::bitset<3> > > periodic_face_map;
3249 typedef typename IteratorSelector::raw_vertex_iterator raw_vertex_iterator;
3250 typedef typename IteratorSelector::raw_line_iterator raw_line_iterator;
3251 typedef typename IteratorSelector::raw_quad_iterator raw_quad_iterator;
3252 typedef typename IteratorSelector::raw_hex_iterator raw_hex_iterator;
3258 raw_cell_iterator begin_raw (const
unsigned int level = 0) const;
3264 raw_cell_iterator end_raw (const
unsigned int level) const;
3282 begin_raw_line (const
unsigned int level = 0) const;
3288 begin_line (const
unsigned int level = 0) const;
3293 active_line_iterator
3294 begin_active_line(const
unsigned int level = 0) const;
3300 line_iterator end_line () const;
3317 begin_raw_quad (const
unsigned int level = 0) const;
3323 begin_quad (const
unsigned int level = 0) const;
3328 active_quad_iterator
3329 begin_active_quad (const
unsigned int level = 0) const;
3352 begin_raw_hex (const
unsigned int level = 0) const;
3358 begin_hex (const
unsigned int level = 0) const;
3364 begin_active_hex (const
unsigned int level = 0) const;
3391 void clear_despite_subscriptions ();
3399 void reset_active_cell_indices ();
3414 DistortedCellList execute_refinement ();
3422 void execute_coarsening ();
3428 void fix_coarsen_flags ();
3452 std::vector<
bool> vertices_used;
3464 bool anisotropic_refinement;
3471 const
bool check_for_distorted_cells;
3482 ::
internal::Triangulation::NumberCache<dim> number_cache;
3525 friend class TriaAccessor<0, 1, spacedim>;
3529 friend struct ::
internal::TriaAccessor::Implementation;
3533 friend struct ::
internal::Triangulation::Implementation;
3536 friend class ::
internal::Triangulation::TriaObjects;
3540 #ifdef DEAL_II_WITH_CXX11 3541 #ifndef DEAL_II_MSVC 3542 static_assert (dim<=spacedim,
3543 "The dimension <dim> of a Triangulation must be less than or " 3544 "equal to the space dimension <spacedim> in which it lives.");
3554 template <
int structdim>
3558 for (
unsigned int i=0; i<GeometryInfo<structdim>::vertices_per_cell; ++i)
3573 template <
class Archive>
3574 void NumberCache<1>::serialize (Archive &ar,
3578 ar &n_lines &n_lines_level;
3579 ar &n_active_lines &n_active_lines_level;
3583 template <
class Archive>
3584 void NumberCache<2>::serialize (Archive &ar,
3585 const unsigned int version)
3587 this->NumberCache<1>::serialize (ar, version);
3589 ar &n_quads &n_quads_level;
3590 ar &n_active_quads &n_active_quads_level;
3594 template <
class Archive>
3595 void NumberCache<3>::serialize (Archive &ar,
3596 const unsigned int version)
3598 this->NumberCache<2>::serialize (ar, version);
3600 ar &n_hexes &n_hexes_level;
3601 ar &n_active_hexes &n_active_hexes_level;
3608 template <
int dim,
int spacedim>
3613 Assert (index < vertices_used.size(),
3615 return vertices_used[index];
3620 template <
int dim,
int spacedim>
3624 return number_cache.n_levels;
3627 template <
int dim,
int spacedim>
3631 return number_cache.n_levels;
3635 template <
int dim,
int spacedim>
3640 return vertices.size();
3645 template <
int dim,
int spacedim>
3647 const std::vector<Point<spacedim> > &
3654 template <
int dim,
int spacedim>
3655 template <
class Archive>
3658 const unsigned int)
const 3668 ar &anisotropic_refinement;
3671 ar &check_for_distorted_cells;
3675 ar &vertex_to_boundary_id_map_1d;
3676 ar &vertex_to_manifold_id_map_1d;
3682 template <
int dim,
int spacedim>
3683 template <
class Archive>
3699 ar &anisotropic_refinement;
3706 for (
unsigned int l=0; l<levels.size(); ++l)
3707 levels[l]->active_cell_indices.resize (levels[l]->refine_flags.size());
3708 reset_active_cell_indices ();
3712 bool my_check_for_distorted_cells;
3713 ar &my_check_for_distorted_cells;
3715 Assert (my_check_for_distorted_cells == check_for_distorted_cells,
3716 ExcMessage (
"The triangulation loaded into here must have the " 3717 "same setting with regard to reporting distorted " 3718 "cell as the one previously stored."));
3722 ar &vertex_to_boundary_id_map_1d;
3723 ar &vertex_to_manifold_id_map_1d;
3777 DEAL_II_NAMESPACE_CLOSE
3783 #include <deal.II/grid/tria_accessor.h> std::vector< CellData< 1 > > boundary_lines
TriaActiveIterator< CellAccessor< dim, spacedim > > active_cell_iterator
boost::signals2::signal< void()> any_change
static const unsigned int invalid_unsigned_int
#define DeclException2(Exception2, type1, type2, outsequence)
const std::vector< Point< spacedim > > & get_vertices() const
virtual unsigned int n_global_levels() const
std::list< typename Triangulation< dim, spacedim >::cell_iterator > distorted_cells
unsigned char material_id
boost::signals2::signal< void()> clear
boost::signals2::signal< unsigned int(const cell_iterator &, const CellStatus), CellWeightSum< unsigned int > > cell_weight
std::vector< unsigned int > n_active_lines_level
std::vector< unsigned int > n_hexes_level
boost::signals2::signal< void()> mesh_movement
std::vector< unsigned int > n_quads_level
types::boundary_id boundary_id
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
static::ExceptionBase & ExcFacesHaveNoLevel()
std::vector< unsigned int > n_active_quads_level
unsigned int n_levels() const
unsigned int n_active_quads() const
static::ExceptionBase & ExcMessage(std::string arg1)
unsigned int n_raw_lines() const
boost::signals2::signal< void()> pre_refinement
#define DeclException1(Exception1, type1, outsequence)
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
unsigned int global_dof_index
#define Assert(cond, exc)
unsigned int n_raw_quads() const
boost::signals2::signal< void()> create
static const StraightBoundary< dim, spacedim > straight_boundary
void load(Archive &ar, const unsigned int version)
#define DeclException0(Exception0)
types::material_id material_id
::internal::Triangulation::Iterators< dim, spacedim > IteratorSelector
unsigned int subdomain_id
boost::signals2::signal< void()> post_refinement
bool vertex_used(const unsigned int index) const
types::manifold_id manifold_id
const types::manifold_id invalid_manifold_id
std::vector< unsigned int > n_active_hexes_level
void save(Archive &ar, const unsigned int version) const
unsigned int n_active_quads
std::vector< CellData< 2 > > boundary_quads
unsigned int n_quads() const
unsigned int n_raw_hexs() const
unsigned char boundary_id
unsigned int max_adjacent_cells() const
unsigned int n_vertices() const
unsigned int n_active_hexes
unsigned int n_active_lines
std::vector< unsigned int > n_lines_level