20 #include <deal.II/base/config.h> 22 #include <deal.II/base/geometry_info.h> 23 #include <deal.II/base/iterator_range.h> 24 #include <deal.II/base/point.h> 25 #include <deal.II/base/smartpointer.h> 26 #include <deal.II/base/subscriptor.h> 28 #include <deal.II/grid/tria_iterator_selector.h> 30 #include <boost/serialization/map.hpp> 31 #include <boost/serialization/split_member.hpp> 32 #include <boost/serialization/unique_ptr.hpp> 33 #include <boost/serialization/vector.hpp> 34 #include <boost/signals2.hpp> 45 DEAL_II_NAMESPACE_OPEN
47 template <
int dim,
int spacedim>
52 template <
typename CellIterator>
53 struct PeriodicFacePair;
56 template <
int,
int,
int>
58 template <
int spacedim>
60 template <
int,
int,
int>
65 namespace TriangulationImplementation
83 namespace TriaAccessorImplementation
91 template <
int dim,
int spacedim>
133 template <
int structdim>
277 check_consistency(
const unsigned int dim)
const;
290 namespace TriangulationImplementation
360 memory_consumption()
const;
366 template <
class Archive>
368 serialize(Archive &ar,
const unsigned int version);
419 memory_consumption()
const;
425 template <
class Archive>
427 serialize(Archive &ar,
const unsigned int version);
479 memory_consumption()
const;
485 template <
class Archive>
487 serialize(Archive &ar,
const unsigned int version);
1276 template <
int dim,
int spacedim = dim>
1284 using IteratorSelector =
1285 ::internal::TriangulationImplementation::Iterators<dim, spacedim>;
1341 limit_level_difference_at_vertices = 0x1,
1362 eliminate_unrefined_islands = 0x2,
1378 patch_level_1 = 0x4,
1399 coarsest_level_1 = 0x8,
1424 allow_anisotropic_smoothing = 0x10,
1457 eliminate_refined_inner_islands = 0x100,
1462 eliminate_refined_boundary_islands = 0x200,
1468 do_not_produce_unrefined_islands = 0x400,
1474 smoothing_on_refinement =
1475 (limit_level_difference_at_vertices | eliminate_unrefined_islands),
1480 smoothing_on_coarsening =
1481 (eliminate_refined_inner_islands | eliminate_refined_boundary_islands |
1482 do_not_produce_unrefined_islands),
1489 maximum_smoothing = 0xffff ^ allow_anisotropic_smoothing
1581 using line_iterator =
typename IteratorSelector::line_iterator;
1582 using active_line_iterator =
typename IteratorSelector::active_line_iterator;
1584 using quad_iterator =
typename IteratorSelector::quad_iterator;
1585 using active_quad_iterator =
typename IteratorSelector::active_quad_iterator;
1587 using hex_iterator =
typename IteratorSelector::hex_iterator;
1588 using active_hex_iterator =
typename IteratorSelector::active_hex_iterator;
1622 std::list<typename Triangulation<dim, spacedim>::cell_iterator>
1629 static const unsigned int dimension = dim;
1634 static const unsigned int space_dimension = spacedim;
1651 const bool check_for_distorted_cells =
false);
1710 get_mesh_smoothing() const;
1736 set_manifold(const
types::manifold_id number,
1737 const
Manifold<dim, spacedim> &manifold_object);
1756 set_manifold(const
types::manifold_id number);
1771 reset_manifold(const
types::manifold_id manifold_number);
1785 reset_all_manifolds();
1796 set_all_manifold_ids(const
types::manifold_id number);
1807 set_all_manifold_ids_on_boundary(const
types::manifold_id number);
1819 set_all_manifold_ids_on_boundary(const
types::boundary_id b_id,
1820 const
types::manifold_id number);
1832 get_manifold(const
types::manifold_id number) const;
1846 get_boundary_ids() const;
1860 get_manifold_ids() const;
1889 copy_triangulation(const
Triangulation<dim, spacedim> &other_tria);
1935 create_triangulation(const
std::vector<
Point<spacedim>> &vertices,
1948 create_triangulation_compatibility(
1949 const
std::vector<
Point<spacedim>> &vertices,
1960 flip_all_direction_flags();
1974 set_all_refine_flags();
1991 refine_global(const
unsigned int times = 1);
2025 execute_coarsening_and_refinement();
2057 prepare_coarsening_and_refinement();
2102 template <
typename T>
2105 using result_type = T;
2107 template <
typename InputIterator>
2109 operator()(InputIterator first, InputIterator last)
const 2111 return std::accumulate(first, last, T());
2167 boost::signals2::signal<void(
2177 boost::signals2::signal<void(
2187 boost::signals2::signal<void(
2303 save_refine_flags(std::ostream &out)
const;
2309 save_refine_flags(std::vector<bool> &v)
const;
2315 load_refine_flags(std::istream &in);
2321 load_refine_flags(
const std::vector<bool> &v);
2327 save_coarsen_flags(std::ostream &out)
const;
2333 save_coarsen_flags(std::vector<bool> &v)
const;
2339 load_coarsen_flags(std::istream &out);
2345 load_coarsen_flags(
const std::vector<bool> &v);
2352 get_anisotropic_refinement_flag()
const;
2376 save_user_flags(std::ostream &out)
const;
2384 save_user_flags(std::vector<bool> &v)
const;
2391 load_user_flags(std::istream &in);
2398 load_user_flags(
const std::vector<bool> &v);
2405 clear_user_flags_line();
2412 save_user_flags_line(std::ostream &out)
const;
2420 save_user_flags_line(std::vector<bool> &v)
const;
2427 load_user_flags_line(std::istream &in);
2434 load_user_flags_line(
const std::vector<bool> &v);
2441 clear_user_flags_quad();
2448 save_user_flags_quad(std::ostream &out)
const;
2456 save_user_flags_quad(std::vector<bool> &v)
const;
2463 load_user_flags_quad(std::istream &in);
2470 load_user_flags_quad(
const std::vector<bool> &v);
2478 clear_user_flags_hex();
2485 save_user_flags_hex(std::ostream &out)
const;
2493 save_user_flags_hex(std::vector<bool> &v)
const;
2500 load_user_flags_hex(std::istream &in);
2507 load_user_flags_hex(
const std::vector<bool> &v);
2523 save_user_indices(std::vector<unsigned int> &v)
const;
2530 load_user_indices(
const std::vector<unsigned int> &v);
2538 save_user_pointers(std::vector<void *> &v)
const;
2545 load_user_pointers(
const std::vector<void *> &v);
2553 save_user_indices_line(std::vector<unsigned int> &v)
const;
2560 load_user_indices_line(
const std::vector<unsigned int> &v);
2568 save_user_indices_quad(std::vector<unsigned int> &v)
const;
2575 load_user_indices_quad(
const std::vector<unsigned int> &v);
2583 save_user_indices_hex(std::vector<unsigned int> &v)
const;
2590 load_user_indices_hex(
const std::vector<unsigned int> &v);
2597 save_user_pointers_line(std::vector<void *> &v)
const;
2604 load_user_pointers_line(
const std::vector<void *> &v);
2612 save_user_pointers_quad(std::vector<void *> &v)
const;
2619 load_user_pointers_quad(
const std::vector<void *> &v);
2627 save_user_pointers_hex(std::vector<void *> &v)
const;
2634 load_user_pointers_hex(
const std::vector<void *> &v);
2649 begin(
const unsigned int level = 0)
const;
2668 begin_active(
const unsigned int level = 0)
const;
2682 end(
const unsigned int level)
const;
2690 end_active(
const unsigned int level)
const;
2703 last_active()
const;
2720 cell_iterators()
const;
2758 active_cell_iterators()
const;
2776 cell_iterators_on_level(
const unsigned int level)
const;
2794 active_cell_iterators_on_level(
const unsigned int level)
const;
2817 begin_active_face()
const;
2842 begin_vertex()
const;
2850 begin_active_vertex()
const;
2888 n_lines(
const unsigned int level)
const;
2894 n_active_lines()
const;
2900 n_active_lines(
const unsigned int level)
const;
2912 n_quads(
const unsigned int level)
const;
2918 n_active_quads()
const;
2924 n_active_quads(
const unsigned int level)
const;
2937 n_hexs(
const unsigned int level)
const;
2943 n_active_hexs()
const;
2950 n_active_hexs(
const unsigned int level)
const;
2964 n_cells(
const unsigned int level)
const;
2971 n_active_cells()
const;
2981 n_global_active_cells()
const;
2989 n_active_cells(
const unsigned int level)
const;
3005 n_active_faces()
const;
3033 virtual unsigned int 3034 n_global_levels()
const;
3046 has_hanging_nodes()
const;
3066 const std::vector<Point<spacedim>> &
3067 get_vertices()
const;
3074 n_used_vertices()
const;
3080 vertex_used(
const unsigned int index)
const;
3086 const std::vector<bool> &
3087 get_used_vertices()
const;
3101 max_adjacent_cells()
const;
3110 locally_owned_subdomain()
const;
3122 get_triangulation();
3129 get_triangulation()
const;
3151 n_raw_lines()
const;
3163 n_raw_lines(
const unsigned int level)
const;
3175 n_raw_quads()
const;
3187 n_raw_quads(
const unsigned int level)
const;
3199 n_raw_hexs(
const unsigned int level)
const;
3211 n_raw_cells(
const unsigned int level)
const;
3224 n_raw_faces()
const;
3239 memory_consumption()
const;
3249 template <
class Archive>
3251 save(Archive &ar,
const unsigned int version)
const;
3268 template <
class Archive>
3270 load(Archive &ar,
const unsigned int version);
3296 std::pair<cell_iterator, unsigned int>,
3297 std::pair<std::pair<cell_iterator, unsigned int>, std::bitset<3>>> &
3298 get_periodic_face_map()
const;
3301 BOOST_SERIALIZATION_SPLIT_MEMBER()
3315 << "The given level " << arg1
3316 << " is not in the valid range!");
3324 ExcTriangulationNotEmpty,
3327 << "You are trying to perform an operation on a triangulation "
3328 << "that is only allowed if the triangulation is currently empty. "
3329 << "However, it currently stores " << arg1 << " vertices and has "
3330 << "cells on " << arg2 << " levels.");
3349 << "You tried to do something on level " << arg1
3350 << ", but this level is empty.");
3367 << "The given boundary_id " << arg1
3395 write_bool_vector(const
unsigned int magic_number1,
3396 const
std::vector<
bool> &v,
3397 const
unsigned int magic_number2,
3398 std::ostream & out);
3405 read_bool_vector(const
unsigned int magic_number1,
3406 std::vector<
bool> &v,
3407 const
unsigned int magic_number2,
3415 update_periodic_face_map();
3426 periodic_face_pairs_level_0;
3433 std::pair<
std::pair<cell_iterator,
unsigned int>,
std::bitset<3>>>
3463 begin_raw(const
unsigned int level = 0) const;
3470 end_raw(const
unsigned int level) const;
3488 begin_raw_line(const
unsigned int level = 0) const;
3494 begin_line(const
unsigned int level = 0) const;
3499 active_line_iterator
3500 begin_active_line(const
unsigned int level = 0) const;
3524 begin_raw_quad(const
unsigned int level = 0) const;
3530 begin_quad(const
unsigned int level = 0) const;
3535 active_quad_iterator
3536 begin_active_quad(const
unsigned int level = 0) const;
3559 begin_raw_hex(const
unsigned int level = 0) const;
3565 begin_hex(const
unsigned int level = 0) const;
3571 begin_active_hex(const
unsigned int level = 0) const;
3599 clear_despite_subscriptions();
3608 reset_active_cell_indices();
3624 execute_refinement();
3633 execute_coarsening();
3640 fix_coarsen_flags();
3646 std::vector<
std::unique_ptr<
3647 ::
internal::TriangulationImplementation::TriaLevel<dim>>>
3655 std::unique_ptr<::
internal::TriangulationImplementation::TriaFaces<dim>>
3667 std::vector<
bool> vertices_used;
3679 bool anisotropic_refinement;
3686 const
bool check_for_distorted_cells;
3697 ::
internal::TriangulationImplementation::NumberCache<dim> number_cache;
3713 std::unique_ptr<
std::map<
unsigned int,
types::boundary_id>>
3714 vertex_to_boundary_id_map_1d;
3736 std::unique_ptr<
std::map<
unsigned int,
types::manifold_id>>
3737 vertex_to_manifold_id_map_1d;
3740 template <
int,
int,
int>
3742 template <
int,
int,
int>
3743 friend class TriaAccessor;
3744 friend class TriaAccessor<0, 1, spacedim>;
3748 friend struct ::
internal::TriaAccessorImplementation::Implementation;
3752 friend struct ::
internal::TriangulationImplementation::Implementation;
3755 friend class ::
internal::TriangulationImplementation::TriaObjects;
3759 #ifndef DEAL_II_MSVC 3760 static_assert(dim <= spacedim,
3761 "The dimension <dim> of a Triangulation must be less than or " 3762 "equal to the space dimension <spacedim> in which it lives.");
3770 template <
int structdim>
3773 for (
unsigned int i = 0; i < GeometryInfo<structdim>::vertices_per_cell; ++i)
3786 namespace TriangulationImplementation
3788 template <
class Archive>
3790 NumberCache<1>::serialize(Archive &ar,
const unsigned int)
3793 ar &n_lines &n_lines_level;
3794 ar &n_active_lines &n_active_lines_level;
3798 template <
class Archive>
3800 NumberCache<2>::serialize(Archive &ar,
const unsigned int version)
3802 this->NumberCache<1>::serialize(ar, version);
3804 ar &n_quads &n_quads_level;
3805 ar &n_active_quads &n_active_quads_level;
3809 template <
class Archive>
3811 NumberCache<3>::serialize(Archive &ar,
const unsigned int version)
3813 this->NumberCache<2>::serialize(ar, version);
3815 ar &n_hexes &n_hexes_level;
3816 ar &n_active_hexes &n_active_hexes_level;
3823 template <
int dim,
int spacedim>
3827 Assert(index < vertices_used.size(),
3829 return vertices_used[index];
3834 template <
int dim,
int spacedim>
3838 return number_cache.n_levels;
3841 template <
int dim,
int spacedim>
3845 return number_cache.n_levels;
3849 template <
int dim,
int spacedim>
3853 return vertices.size();
3858 template <
int dim,
int spacedim>
3859 inline const std::vector<Point<spacedim>> &
3866 template <
int dim,
int spacedim>
3867 template <
class Archive>
3875 unsigned int n_levels = levels.size();
3877 for (
unsigned int i = 0; i < levels.size(); ++i)
3883 bool faces_is_nullptr = (faces.get() ==
nullptr);
3884 ar & faces_is_nullptr;
3885 if (!faces_is_nullptr)
3891 ar &anisotropic_refinement;
3894 ar &check_for_distorted_cells;
3898 ar &vertex_to_boundary_id_map_1d;
3899 ar &vertex_to_manifold_id_map_1d;
3905 template <
int dim,
int spacedim>
3906 template <
class Archive>
3919 levels.resize(size);
3920 for (
unsigned int i = 0; i < levels.size(); ++i)
3922 std::unique_ptr<internal::TriangulationImplementation::TriaLevel<dim>>
3925 levels[i] = std::move(level);
3929 bool faces_is_nullptr =
true;
3930 ar & faces_is_nullptr;
3931 if (!faces_is_nullptr)
3937 ar &anisotropic_refinement;
3944 for (
unsigned int l = 0; l < levels.size(); ++l)
3945 levels[l]->active_cell_indices.resize(levels[l]->refine_flags.size());
3946 reset_active_cell_indices();
3950 bool my_check_for_distorted_cells;
3951 ar & my_check_for_distorted_cells;
3953 Assert(my_check_for_distorted_cells == check_for_distorted_cells,
3954 ExcMessage(
"The triangulation loaded into here must have the " 3955 "same setting with regard to reporting distorted " 3956 "cell as the one previously stored."));
3960 ar &vertex_to_boundary_id_map_1d;
3961 ar &vertex_to_manifold_id_map_1d;
4069 DEAL_II_NAMESPACE_CLOSE
4075 #include <deal.II/grid/tria_accessor.h> std::vector< CellData< 1 > > boundary_lines
boost::signals2::signal< void(const Triangulation< dim, spacedim > &destination_tria)> copy
boost::signals2::signal< void()> post_refinement
std::vector< unsigned int > n_quads_level
static const unsigned int invalid_unsigned_int
boost::signals2::signal< void(const typename Triangulation< dim, spacedim >::cell_iterator &cell)> pre_coarsening_on_cell
#define DeclException2(Exception2, type1, type2, outsequence)
const std::vector< Point< spacedim > > & get_vertices() const
virtual unsigned int n_global_levels() const
unsigned int n_active_lines
boost::signals2::signal< void()> pre_distributed_refinement
types::boundary_id boundary_id
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
static::ExceptionBase & ExcFacesHaveNoLevel()
unsigned long long int global_dof_index
unsigned int n_levels() const
unsigned int n_active_quads
unsigned int n_active_quads() const
static::ExceptionBase & ExcMessage(std::string arg1)
unsigned int n_raw_hexs(const unsigned int level) const
boost::signals2::signal< void()> pre_refinement
unsigned int n_raw_lines() const
unsigned int subdomain_id
#define DeclException1(Exception1, type1, outsequence)
unsigned int n_active_hexes
#define Assert(cond, exc)
unsigned int n_raw_quads() const
boost::signals2::signal< void()> clear
::internal::TriangulationImplementation::Iterators< dim, spacedim > IteratorSelector
void load(Archive &ar, const unsigned int version)
std::list< typename Triangulation< dim, spacedim >::cell_iterator > distorted_cells
#define DeclException0(Exception0)
boost::signals2::signal< void(const typename Triangulation< dim, spacedim >::cell_iterator &cell)> post_refinement_on_cell
types::material_id material_id
boost::signals2::signal< void()> mesh_movement
boost::signals2::signal< void()> pre_distributed_save
boost::signals2::signal< void()> create
bool vertex_used(const unsigned int index) const
types::manifold_id manifold_id
std::vector< unsigned int > n_lines_level
const types::manifold_id invalid_manifold_id
std::vector< unsigned int > n_active_hexes_level
void save(Archive &ar, const unsigned int version) const
std::vector< CellData< 2 > > boundary_quads
boost::signals2::signal< unsigned int(const cell_iterator &, const CellStatus), CellWeightSum< unsigned int > > cell_weight
unsigned int n_quads() const
std::vector< unsigned int > n_active_lines_level
std::vector< unsigned int > n_active_quads_level
unsigned int max_adjacent_cells() const
boost::signals2::signal< void()> post_distributed_load
unsigned int n_vertices() const
std::vector< unsigned int > n_hexes_level
boost::signals2::signal< void()> any_change
boost::signals2::signal< void()> post_distributed_refinement