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/grid/tria_iterator_selector.h> 28 #include <deal.II/grid/tria_faces.h> 29 #include <deal.II/grid/tria_levels.h> 32 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
33 #include <boost/signals2.hpp> 34 #include <boost/serialization/vector.hpp> 35 #include <boost/serialization/map.hpp> 36 #include <boost/serialization/split_member.hpp> 44 DEAL_II_NAMESPACE_OPEN
46 template <
int dim,
int spacedim>
class Boundary;
48 template <
int dim,
int spacedim>
class Manifold;
51 template <
int spacedim>
class TriaAccessor<0,1,spacedim>;
77 template <
int dim,
int spacedim>
class DoFHandler;
80 template <
int dim,
int spacedim>
class DoFHandler;
104 template <
int structdim>
196 bool check_consistency (
const unsigned int dim)
const;
280 std::size_t memory_consumption ()
const;
286 template <
class Archive>
287 void serialize (Archive &ar,
288 const unsigned int version);
338 std::size_t memory_consumption ()
const;
344 template <
class Archive>
345 void serialize (Archive &ar,
346 const unsigned int version);
397 std::size_t memory_consumption ()
const;
403 template <
class Archive>
404 void serialize (Archive &ar,
405 const unsigned int version);
1155 template <
int dim,
int spacedim=dim>
1226 limit_level_difference_at_vertices = 0x1,
1247 eliminate_unrefined_islands = 0x2,
1263 patch_level_1 = 0x4,
1284 coarsest_level_1 = 0x8,
1309 allow_anisotropic_smoothing = 0x10,
1342 eliminate_refined_inner_islands = 0x100,
1347 eliminate_refined_boundary_islands = 0x200,
1353 do_not_produce_unrefined_islands = 0x400,
1359 smoothing_on_refinement = (limit_level_difference_at_vertices |
1360 eliminate_unrefined_islands),
1365 smoothing_on_coarsening = (eliminate_refined_inner_islands |
1366 eliminate_refined_boundary_islands |
1367 do_not_produce_unrefined_islands),
1374 maximum_smoothing = 0xffff ^ allow_anisotropic_smoothing
1415 typedef typename IteratorSelector::vertex_iterator vertex_iterator;
1416 typedef typename IteratorSelector::active_vertex_iterator active_vertex_iterator;
1418 typedef typename IteratorSelector::line_iterator line_iterator;
1419 typedef typename IteratorSelector::active_line_iterator active_line_iterator;
1421 typedef typename IteratorSelector::quad_iterator quad_iterator;
1422 typedef typename IteratorSelector::active_quad_iterator active_quad_iterator;
1424 typedef typename IteratorSelector::hex_iterator hex_iterator;
1425 typedef typename IteratorSelector::active_hex_iterator active_hex_iterator;
1459 std::list<typename Triangulation<dim,spacedim>::cell_iterator>
1467 static const unsigned int dimension = dim;
1472 static const unsigned int space_dimension = spacedim;
1489 const bool check_for_distorted_cells =
false);
1519 virtual void clear ();
1526 virtual void set_mesh_smoothing (
const MeshSmoothing mesh_smoothing);
1689 std::vector<types::boundary_id> get_boundary_ids()
const;
1709 std::vector<
types::manifold_id> get_manifold_ids() const;
1738 virtual
void copy_triangulation (const
Triangulation<dim, spacedim> &old_tria);
1783 virtual
void create_triangulation (const
std::vector<
Point<spacedim> > &vertices,
1795 virtual
void create_triangulation_compatibility (
1796 const
std::vector<
Point<spacedim> > &vertices,
1806 void flip_all_direction_flags();
1819 void set_all_refine_flags ();
1835 void refine_global (const
unsigned int times = 1);
1868 virtual
void execute_coarsening_and_refinement ();
1899 virtual
bool prepare_coarsening_and_refinement ();
1944 template<
typename T>
1947 typedef T result_type;
1949 template<
typename InputIterator>
1950 T operator()(InputIterator first, InputIterator last)
const 1958 while (first != last)
2010 boost::signals2::signal<void (const typename Triangulation<dim, spacedim>::cell_iterator &cell)> pre_coarsening_on_cell;
2018 boost::signals2::signal<void (const typename Triangulation<dim, spacedim>::cell_iterator &cell)> post_refinement_on_cell;
2026 boost::signals2::signal<void (const Triangulation<dim, spacedim> &destination_tria)> copy;
2070 boost::signals2::signal<
unsigned int (
const cell_iterator &,
2093 void save_refine_flags (std::ostream &out)
const;
2098 void save_refine_flags (std::vector<bool> &v)
const;
2103 void load_refine_flags (std::istream &in);
2108 void load_refine_flags (
const std::vector<bool> &v);
2113 void save_coarsen_flags (std::ostream &out)
const;
2118 void save_coarsen_flags (std::vector<bool> &v)
const;
2123 void load_coarsen_flags (std::istream &out);
2128 void load_coarsen_flags (
const std::vector<bool> &v);
2134 bool get_anisotropic_refinement_flag()
const;
2149 void clear_user_flags ();
2156 void save_user_flags (std::ostream &out)
const;
2163 void save_user_flags (std::vector<bool> &v)
const;
2169 void load_user_flags (std::istream &in);
2175 void load_user_flags (
const std::vector<bool> &v);
2181 void clear_user_flags_line ();
2187 void save_user_flags_line (std::ostream &out)
const;
2194 void save_user_flags_line (std::vector<bool> &v)
const;
2200 void load_user_flags_line (std::istream &in);
2206 void load_user_flags_line (
const std::vector<bool> &v);
2212 void clear_user_flags_quad ();
2218 void save_user_flags_quad (std::ostream &out)
const;
2225 void save_user_flags_quad (std::vector<bool> &v)
const;
2231 void load_user_flags_quad (std::istream &in);
2237 void load_user_flags_quad (
const std::vector<bool> &v);
2244 void clear_user_flags_hex ();
2250 void save_user_flags_hex (std::ostream &out)
const;
2257 void save_user_flags_hex (std::vector<bool> &v)
const;
2263 void load_user_flags_hex (std::istream &in);
2269 void load_user_flags_hex (
const std::vector<bool> &v);
2276 void clear_user_data ();
2283 void save_user_indices (std::vector<unsigned int> &v)
const;
2289 void load_user_indices (
const std::vector<unsigned int> &v);
2296 void save_user_pointers (std::vector<void *> &v)
const;
2302 void load_user_pointers (
const std::vector<void *> &v);
2309 void save_user_indices_line (std::vector<unsigned int> &v)
const;
2315 void load_user_indices_line (
const std::vector<unsigned int> &v);
2322 void save_user_indices_quad (std::vector<unsigned int> &v)
const;
2328 void load_user_indices_quad (
const std::vector<unsigned int> &v);
2335 void save_user_indices_hex (std::vector<unsigned int> &v)
const;
2341 void load_user_indices_hex (
const std::vector<unsigned int> &v);
2347 void save_user_pointers_line (std::vector<void *> &v)
const;
2353 void load_user_pointers_line (
const std::vector<void *> &v);
2360 void save_user_pointers_quad (std::vector<void *> &v)
const;
2366 void load_user_pointers_quad (
const std::vector<void *> &v);
2373 void save_user_pointers_hex (std::vector<void *> &v)
const;
2379 void load_user_pointers_hex (
const std::vector<void *> &v);
2393 cell_iterator begin (
const unsigned int level = 0)
const;
2407 active_cell_iterator begin_active(
const unsigned int level = 0)
const;
2413 cell_iterator end ()
const;
2419 cell_iterator end (
const unsigned int level)
const;
2426 active_cell_iterator end_active (
const unsigned int level)
const;
2432 cell_iterator last ()
const;
2437 active_cell_iterator last_active ()
const;
2542 face_iterator begin_face ()
const;
2547 active_face_iterator begin_active_face()
const;
2553 face_iterator end_face ()
const;
2571 vertex_iterator begin_vertex()
const;
2578 active_vertex_iterator begin_active_vertex()
const;
2585 vertex_iterator end_vertex()
const;
2608 unsigned int n_lines ()
const;
2613 unsigned int n_lines (
const unsigned int level)
const;
2618 unsigned int n_active_lines ()
const;
2623 unsigned int n_active_lines (
const unsigned int level)
const;
2628 unsigned int n_quads ()
const;
2633 unsigned int n_quads (
const unsigned int level)
const;
2638 unsigned int n_active_quads ()
const;
2643 unsigned int n_active_quads (
const unsigned int level)
const;
2648 unsigned int n_hexs()
const;
2654 unsigned int n_hexs(
const unsigned int level)
const;
2659 unsigned int n_active_hexs()
const;
2665 unsigned int n_active_hexs(
const unsigned int level)
const;
2671 unsigned int n_cells ()
const;
2677 unsigned int n_cells (
const unsigned int level)
const;
2683 unsigned int n_active_cells ()
const;
2699 unsigned int n_active_cells (
const unsigned int level)
const;
2706 unsigned int n_faces ()
const;
2713 unsigned int n_active_faces ()
const;
2732 unsigned int n_levels ()
const;
2741 unsigned int n_global_levels ()
const;
2753 bool has_hanging_nodes()
const;
2762 unsigned int n_vertices ()
const;
2772 const std::vector<Point<spacedim> > &
2773 get_vertices ()
const;
2779 unsigned int n_used_vertices ()
const;
2784 bool vertex_used (
const unsigned int index)
const;
2790 const std::vector<bool> &
2791 get_used_vertices ()
const;
2804 unsigned int max_adjacent_cells ()
const;
2824 get_triangulation ();
2831 get_triangulation ()
const;
2852 unsigned int n_raw_lines ()
const;
2863 unsigned int n_raw_lines (
const unsigned int level)
const;
2874 unsigned int n_raw_quads ()
const;
2885 unsigned int n_raw_quads (
const unsigned int level)
const;
2896 unsigned int n_raw_hexs ()
const;
2907 unsigned int n_raw_hexs (
const unsigned int level)
const;
2918 unsigned int n_raw_cells (
const unsigned int level)
const;
2930 unsigned int n_raw_faces ()
const;
2944 virtual std::size_t memory_consumption ()
const;
2954 template <
class Archive>
2955 void save (Archive &ar,
2956 const unsigned int version)
const;
2973 template <
class Archive>
2974 void load (Archive &ar,
2975 const unsigned int version);
2977 BOOST_SERIALIZATION_SPLIT_MEMBER()
2991 << "The given level " << arg1
2992 << " is not in the valid range!");
3001 << "You are trying to perform an operation on a triangulation "
3002 << "that is only allowed if the triangulation is currently empty. "
3003 << "However, it currently stores " << arg1 << " vertices and has "
3004 << "cells on " << arg2 << " levels.");
3010 DeclException0 (ExcGridReadError);
3015 DeclException0 (ExcFacesHaveNoLevel);
3023 << "You tried to do something on level " << arg1
3024 << ", but this level is empty.");
3030 DeclException0 (ExcNonOrientableTriangulation);
3041 << "The given boundary_id " << arg1
3068 static
void write_bool_vector (const
unsigned int magic_number1,
3069 const
std::vector<
bool> &v,
3070 const
unsigned int magic_number2,
3077 static
void read_bool_vector (const
unsigned int magic_number1,
3078 std::vector<
bool> &v,
3079 const
unsigned int magic_number2,
3098 typedef typename IteratorSelector::raw_vertex_iterator raw_vertex_iterator;
3099 typedef typename IteratorSelector::raw_line_iterator raw_line_iterator;
3100 typedef typename IteratorSelector::raw_quad_iterator raw_quad_iterator;
3101 typedef typename IteratorSelector::raw_hex_iterator raw_hex_iterator;
3107 raw_cell_iterator begin_raw (const
unsigned int level = 0) const;
3113 raw_cell_iterator end_raw (const
unsigned int level) const;
3131 begin_raw_line (const
unsigned int level = 0) const;
3137 begin_line (const
unsigned int level = 0) const;
3142 active_line_iterator
3143 begin_active_line(const
unsigned int level = 0) const;
3149 line_iterator end_line () const;
3166 begin_raw_quad (const
unsigned int level = 0) const;
3172 begin_quad (const
unsigned int level = 0) const;
3177 active_quad_iterator
3178 begin_active_quad (const
unsigned int level = 0) const;
3201 begin_raw_hex (const
unsigned int level = 0) const;
3207 begin_hex (const
unsigned int level = 0) const;
3213 begin_active_hex (const
unsigned int level = 0) const;
3240 void clear_despite_subscriptions ();
3248 void reset_active_cell_indices ();
3263 DistortedCellList execute_refinement ();
3271 void execute_coarsening ();
3277 void fix_coarsen_flags ();
3301 std::vector<
bool> vertices_used;
3313 bool anisotropic_refinement;
3320 const
bool check_for_distorted_cells;
3331 ::
internal::Triangulation::NumberCache<dim> number_cache;
3347 std::map<
unsigned int,
types::boundary_id> *vertex_to_boundary_id_map_1d;
3369 std::map<
unsigned int,
types::manifold_id> *vertex_to_manifold_id_map_1d;
3374 friend class TriaAccessor<0, 1, spacedim>;
3378 friend struct ::
internal::TriaAccessor::Implementation;
3382 friend struct ::
internal::Triangulation::Implementation;
3385 friend class ::
internal::Triangulation::TriaObjects;
3392 template <
int structdim>
3396 for (
unsigned int i=0; i<GeometryInfo<structdim>::vertices_per_cell; ++i)
3409 namespace Triangulation
3411 template <
class Archive>
3416 ar &n_lines &n_lines_level;
3417 ar &n_active_lines &n_active_lines_level;
3421 template <
class Archive>
3423 const unsigned int version)
3427 ar &n_quads &n_quads_level;
3428 ar &n_active_quads &n_active_quads_level;
3432 template <
class Archive>
3434 const unsigned int version)
3438 ar &n_hexes &n_hexes_level;
3439 ar &n_active_hexes &n_active_hexes_level;
3446 template <
int dim,
int spacedim>
3451 Assert (index < vertices_used.size(),
3452 ExcIndexRange(index, 0, vertices_used.size()));
3453 return vertices_used[index];
3458 template <
int dim,
int spacedim>
3462 return number_cache.n_levels;
3465 template <
int dim,
int spacedim>
3469 return number_cache.n_levels;
3473 template <
int dim,
int spacedim>
3478 return vertices.size();
3483 template <
int dim,
int spacedim>
3485 const std::vector<Point<spacedim> > &
3492 template <
int dim,
int spacedim>
3493 template <
class Archive>
3496 const unsigned int)
const 3506 ar &anisotropic_refinement;
3509 ar &check_for_distorted_cells;
3513 ar &vertex_to_boundary_id_map_1d;
3514 ar &vertex_to_manifold_id_map_1d;
3520 template <
int dim,
int spacedim>
3521 template <
class Archive>
3537 ar &anisotropic_refinement;
3544 for (
unsigned int l=0; l<levels.size(); ++l)
3545 levels[l]->active_cell_indices.resize (levels[l]->refine_flags.size());
3546 reset_active_cell_indices ();
3550 bool my_check_for_distorted_cells;
3551 ar &my_check_for_distorted_cells;
3553 Assert (my_check_for_distorted_cells == check_for_distorted_cells,
3554 ExcMessage (
"The triangulation loaded into here must have the " 3555 "same setting with regard to reporting distorted " 3556 "cell as the one previously stored."));
3560 ar &vertex_to_boundary_id_map_1d;
3561 ar &vertex_to_manifold_id_map_1d;
3625 DEAL_II_NAMESPACE_CLOSE
3631 #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
unsigned int n_vertices() const
static const unsigned int invalid_unsigned_int
unsigned int n_raw_hexs() const
std::list< typename Triangulation< dim, spacedim >::cell_iterator > distorted_cells
unsigned char material_id
boost::signals2::signal< void()> clear
::ExceptionBase & ExcMessage(std::string arg1)
boost::signals2::signal< unsigned int(const cell_iterator &, const CellStatus), CellWeightSum< unsigned int > > cell_weight
std::vector< unsigned int > n_active_lines_level
DeclException1(ExcGridHasInvalidCell, int,<< "Something went wrong when making cell "<< arg1<< ". Read the docs and the source code "<< "for more information.")
std::vector< unsigned int > n_hexes_level
std::vector< unsigned int > n_quads_level
std::vector< unsigned int > n_active_quads_level
void serialize(Archive &ar, const unsigned int version)
unsigned int n_levels() const
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
boost::signals2::signal< void()> pre_refinement
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
unsigned int global_dof_index
unsigned int n_raw_quads() const
#define Assert(cond, exc)
boost::signals2::signal< void()> create
static const StraightBoundary< dim, spacedim > straight_boundary
unsigned int max_adjacent_cells() const
void load(Archive &ar, const unsigned int version)
unsigned int n_quads() const
const std::vector< Point< spacedim > > & get_vertices() const
unsigned int n_raw_lines() const
::internal::Triangulation::Iterators< dim, spacedim > IteratorSelector
void save(Archive &ar, const unsigned int version) const
unsigned int subdomain_id
boost::signals2::signal< void()> post_refinement
DeclException2(ExcLineInexistant, int, int,<< "While trying to assign a boundary indicator to a line: "<< "the line with end vertices "<< arg1<< " and "<< arg2<< " does not exist.")
unsigned int n_active_quads() const
types::manifold_id manifold_id
const types::manifold_id invalid_manifold_id
std::vector< unsigned int > n_active_hexes_level
void serialize(Archive &ar, const unsigned int version)
unsigned int n_active_quads
virtual unsigned int n_global_levels() const
std::vector< CellData< 2 > > boundary_quads
void serialize(Archive &ar, const unsigned int version)
unsigned char boundary_id
bool vertex_used(const unsigned int index) const
unsigned int n_active_hexes
const Manifold< dim, spacedim > & get_manifold(const types::manifold_id number) const
unsigned int n_active_lines
std::vector< unsigned int > n_lines_level