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>;
1342 limit_level_difference_at_vertices = 0x1,
1363 eliminate_unrefined_islands = 0x2,
1379 patch_level_1 = 0x4,
1403 coarsest_level_1 = 0x8,
1428 allow_anisotropic_smoothing = 0x10,
1461 eliminate_refined_inner_islands = 0x100,
1466 eliminate_refined_boundary_islands = 0x200,
1472 do_not_produce_unrefined_islands = 0x400,
1478 smoothing_on_refinement =
1479 (limit_level_difference_at_vertices | eliminate_unrefined_islands),
1484 smoothing_on_coarsening =
1485 (eliminate_refined_inner_islands | eliminate_refined_boundary_islands |
1486 do_not_produce_unrefined_islands),
1493 maximum_smoothing = 0xffff ^ allow_anisotropic_smoothing
1685 std::list<typename Triangulation<dim, spacedim>::cell_iterator>
1692 static const unsigned int dimension = dim;
1697 static const unsigned int space_dimension = spacedim;
1714 const bool check_for_distorted_cells =
false);
1773 get_mesh_smoothing()
const;
1848 reset_all_manifolds();
1908 std::vector<types::boundary_id>
1909 get_boundary_ids()
const;
1922 std::vector<types::manifold_id>
1923 get_manifold_ids()
const;
2013 create_triangulation_compatibility(
2025 flip_all_direction_flags();
2039 set_all_refine_flags();
2056 refine_global(
const unsigned int times = 1);
2090 execute_coarsening_and_refinement();
2122 prepare_coarsening_and_refinement();
2167 template <
typename T>
2170 using result_type = T;
2172 template <
typename InputIterator>
2174 operator()(InputIterator first, InputIterator last)
const 2176 return std::accumulate(first, last, T());
2240 boost::signals2::signal<void(
2250 boost::signals2::signal<void(
2260 boost::signals2::signal<void(
2410 save_refine_flags(std::ostream &out)
const;
2416 save_refine_flags(std::vector<bool> &v)
const;
2422 load_refine_flags(std::istream &in);
2428 load_refine_flags(
const std::vector<bool> &v);
2434 save_coarsen_flags(std::ostream &out)
const;
2440 save_coarsen_flags(std::vector<bool> &v)
const;
2446 load_coarsen_flags(std::istream &out);
2452 load_coarsen_flags(
const std::vector<bool> &v);
2459 get_anisotropic_refinement_flag()
const;
2483 save_user_flags(std::ostream &out)
const;
2491 save_user_flags(std::vector<bool> &v)
const;
2498 load_user_flags(std::istream &in);
2505 load_user_flags(
const std::vector<bool> &v);
2512 clear_user_flags_line();
2519 save_user_flags_line(std::ostream &out)
const;
2527 save_user_flags_line(std::vector<bool> &v)
const;
2534 load_user_flags_line(std::istream &in);
2541 load_user_flags_line(
const std::vector<bool> &v);
2548 clear_user_flags_quad();
2555 save_user_flags_quad(std::ostream &out)
const;
2563 save_user_flags_quad(std::vector<bool> &v)
const;
2570 load_user_flags_quad(std::istream &in);
2577 load_user_flags_quad(
const std::vector<bool> &v);
2585 clear_user_flags_hex();
2592 save_user_flags_hex(std::ostream &out)
const;
2600 save_user_flags_hex(std::vector<bool> &v)
const;
2607 load_user_flags_hex(std::istream &in);
2614 load_user_flags_hex(
const std::vector<bool> &v);
2630 save_user_indices(std::vector<unsigned int> &v)
const;
2637 load_user_indices(
const std::vector<unsigned int> &v);
2645 save_user_pointers(std::vector<void *> &v)
const;
2652 load_user_pointers(
const std::vector<void *> &v);
2660 save_user_indices_line(std::vector<unsigned int> &v)
const;
2667 load_user_indices_line(
const std::vector<unsigned int> &v);
2675 save_user_indices_quad(std::vector<unsigned int> &v)
const;
2682 load_user_indices_quad(
const std::vector<unsigned int> &v);
2690 save_user_indices_hex(std::vector<unsigned int> &v)
const;
2697 load_user_indices_hex(
const std::vector<unsigned int> &v);
2704 save_user_pointers_line(std::vector<void *> &v)
const;
2711 load_user_pointers_line(
const std::vector<void *> &v);
2719 save_user_pointers_quad(std::vector<void *> &v)
const;
2726 load_user_pointers_quad(
const std::vector<void *> &v);
2734 save_user_pointers_hex(std::vector<void *> &v)
const;
2741 load_user_pointers_hex(
const std::vector<void *> &v);
2770 begin(
const unsigned int level = 0)
const;
2803 begin_active(
const unsigned int level = 0)
const;
2831 end(
const unsigned int level)
const;
2853 end_active(
const unsigned int level)
const;
2866 last_active()
const;
2883 cell_iterators()
const;
2921 active_cell_iterators()
const;
2939 cell_iterators_on_level(
const unsigned int level)
const;
2957 active_cell_iterators_on_level(
const unsigned int level)
const;
2980 begin_active_face()
const;
3008 active_face_iterators()
const;
3026 begin_vertex()
const;
3034 begin_active_vertex()
const;
3072 n_lines(
const unsigned int level)
const;
3078 n_active_lines()
const;
3084 n_active_lines(
const unsigned int level)
const;
3096 n_quads(
const unsigned int level)
const;
3102 n_active_quads()
const;
3108 n_active_quads(
const unsigned int level)
const;
3121 n_hexs(
const unsigned int level)
const;
3127 n_active_hexs()
const;
3134 n_active_hexs(
const unsigned int level)
const;
3148 n_cells(
const unsigned int level)
const;
3155 n_active_cells()
const;
3165 n_global_active_cells()
const;
3173 n_active_cells(
const unsigned int level)
const;
3189 n_active_faces()
const;
3217 virtual unsigned int 3218 n_global_levels()
const;
3230 has_hanging_nodes()
const;
3250 const std::vector<Point<spacedim>> &
3251 get_vertices()
const;
3258 n_used_vertices()
const;
3264 vertex_used(
const unsigned int index)
const;
3270 const std::vector<bool> &
3271 get_used_vertices()
const;
3285 max_adjacent_cells()
const;
3294 locally_owned_subdomain()
const;
3306 get_triangulation();
3313 get_triangulation()
const;
3335 n_raw_lines()
const;
3347 n_raw_lines(
const unsigned int level)
const;
3359 n_raw_quads()
const;
3371 n_raw_quads(
const unsigned int level)
const;
3383 n_raw_hexs(
const unsigned int level)
const;
3395 n_raw_cells(
const unsigned int level)
const;
3409 n_raw_faces()
const;
3424 memory_consumption()
const;
3434 template <
class Archive>
3436 save(Archive &ar,
const unsigned int version)
const;
3453 template <
class Archive>
3455 load(Archive &ar,
const unsigned int version);
3481 std::pair<cell_iterator, unsigned int>,
3482 std::pair<std::pair<cell_iterator, unsigned int>, std::bitset<3>>> &
3483 get_periodic_face_map()
const;
3486 BOOST_SERIALIZATION_SPLIT_MEMBER()
3501 << "You are requesting information from refinement level "
3503 << " of a triangulation, but this triangulation only has "
3504 << arg2 << " refinement levels. The given level " << arg1
3505 << " must be *less* than " << arg2 << ".");
3513 ExcTriangulationNotEmpty,
3516 << "You are trying to perform an operation on a triangulation "
3517 << "that is only allowed if the triangulation is currently empty. "
3518 << "However, it currently stores " << arg1 << " vertices and has "
3519 << "cells on " << arg2 << " levels.");
3538 << "You tried to do something on level " << arg1
3539 << ", but this level is empty.");
3556 << "The given boundary_id " << arg1
3584 write_bool_vector(const
unsigned int magic_number1,
3585 const
std::vector<
bool> &v,
3586 const
unsigned int magic_number2,
3587 std::ostream & out);
3594 read_bool_vector(const
unsigned int magic_number1,
3595 std::vector<
bool> &v,
3596 const
unsigned int magic_number2,
3604 update_periodic_face_map();
3615 periodic_face_pairs_level_0;
3622 std::pair<
std::pair<cell_iterator,
unsigned int>,
std::bitset<3>>>
3652 begin_raw(const
unsigned int level = 0) const;
3659 end_raw(const
unsigned int level) const;
3677 begin_raw_line(const
unsigned int level = 0) const;
3697 begin_line(const
unsigned int level = 0) const;
3717 begin_active_line(const
unsigned int level = 0) const;
3755 begin_raw_quad(const
unsigned int level = 0) const;
3775 begin_quad(const
unsigned int level = 0) const;
3795 begin_active_quad(const
unsigned int level = 0) const;
3832 begin_raw_hex(const
unsigned int level = 0) const;
3852 begin_hex(const
unsigned int level = 0) const;
3872 begin_active_hex(const
unsigned int level = 0) const;
3900 clear_despite_subscriptions();
3909 reset_active_cell_indices();
3925 execute_refinement();
3934 execute_coarsening();
3941 fix_coarsen_flags();
3947 std::vector<
std::unique_ptr<
3948 ::
internal::TriangulationImplementation::TriaLevel<dim>>>
3956 std::unique_ptr<::
internal::TriangulationImplementation::TriaFaces<dim>>
3968 std::vector<
bool> vertices_used;
3980 bool anisotropic_refinement;
3987 const
bool check_for_distorted_cells;
3998 ::
internal::TriangulationImplementation::NumberCache<dim> number_cache;
4014 std::unique_ptr<
std::map<
unsigned int,
types::boundary_id>>
4015 vertex_to_boundary_id_map_1d;
4037 std::unique_ptr<
std::map<
unsigned int,
types::manifold_id>>
4038 vertex_to_manifold_id_map_1d;
4041 template <
int,
int,
int>
4043 template <
int,
int,
int>
4044 friend class TriaAccessor;
4045 friend class TriaAccessor<0, 1, spacedim>;
4049 friend struct ::
internal::TriaAccessorImplementation::Implementation;
4053 friend struct ::
internal::TriangulationImplementation::Implementation;
4056 friend class ::
internal::TriangulationImplementation::TriaObjects;
4060 #ifndef DEAL_II_MSVC 4061 static_assert(dim <= spacedim,
4062 "The dimension <dim> of a Triangulation must be less than or " 4063 "equal to the space dimension <spacedim> in which it lives.");
4071 template <
int structdim>
4074 for (
unsigned int i = 0; i < GeometryInfo<structdim>::vertices_per_cell; ++i)
4087 namespace TriangulationImplementation
4089 template <
class Archive>
4091 NumberCache<1>::serialize(Archive &ar,
const unsigned int)
4094 ar &n_lines &n_lines_level;
4095 ar &n_active_lines &n_active_lines_level;
4099 template <
class Archive>
4101 NumberCache<2>::serialize(Archive &ar,
const unsigned int version)
4103 this->NumberCache<1>::serialize(ar, version);
4105 ar &n_quads &n_quads_level;
4106 ar &n_active_quads &n_active_quads_level;
4110 template <
class Archive>
4112 NumberCache<3>::serialize(Archive &ar,
const unsigned int version)
4114 this->NumberCache<2>::serialize(ar, version);
4116 ar &n_hexes &n_hexes_level;
4117 ar &n_active_hexes &n_active_hexes_level;
4124 template <
int dim,
int spacedim>
4128 Assert(index < vertices_used.size(),
4130 return vertices_used[index];
4135 template <
int dim,
int spacedim>
4139 return number_cache.n_levels;
4142 template <
int dim,
int spacedim>
4146 return number_cache.n_levels;
4150 template <
int dim,
int spacedim>
4154 return vertices.size();
4159 template <
int dim,
int spacedim>
4160 inline const std::vector<Point<spacedim>> &
4167 template <
int dim,
int spacedim>
4168 template <
class Archive>
4176 unsigned int n_levels = levels.size();
4178 for (
unsigned int i = 0; i < levels.size(); ++i)
4184 bool faces_is_nullptr = (faces.get() ==
nullptr);
4185 ar & faces_is_nullptr;
4186 if (!faces_is_nullptr)
4192 ar &anisotropic_refinement;
4195 ar &check_for_distorted_cells;
4199 ar &vertex_to_boundary_id_map_1d;
4200 ar &vertex_to_manifold_id_map_1d;
4206 template <
int dim,
int spacedim>
4207 template <
class Archive>
4220 levels.resize(size);
4221 for (
unsigned int i = 0; i < levels.size(); ++i)
4223 std::unique_ptr<internal::TriangulationImplementation::TriaLevel<dim>>
4226 levels[i] = std::move(level);
4230 bool faces_is_nullptr =
true;
4231 ar & faces_is_nullptr;
4232 if (!faces_is_nullptr)
4238 ar &anisotropic_refinement;
4245 for (
unsigned int l = 0; l < levels.size(); ++l)
4246 levels[l]->active_cell_indices.resize(levels[l]->refine_flags.size());
4247 reset_active_cell_indices();
4251 bool my_check_for_distorted_cells;
4252 ar & my_check_for_distorted_cells;
4254 Assert(my_check_for_distorted_cells == check_for_distorted_cells,
4255 ExcMessage(
"The triangulation loaded into here must have the " 4256 "same setting with regard to reporting distorted " 4257 "cell as the one previously stored."));
4261 ar &vertex_to_boundary_id_map_1d;
4262 ar &vertex_to_manifold_id_map_1d;
4370 DEAL_II_NAMESPACE_CLOSE
4376 #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
unsigned int n_vertices() const
std::vector< unsigned int > n_quads_level
const types::manifold_id flat_manifold_id
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)
boost::signals2::signal< void()> post_distributed_repartition
typename IteratorSelector::line_iterator line_iterator
unsigned int n_active_lines
typename IteratorSelector::hex_iterator hex_iterator
typename IteratorSelector::active_line_iterator active_line_iterator
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 int n_levels() const
unsigned int n_active_quads
static ::ExceptionBase & ExcMessage(std::string arg1)
boost::signals2::signal< void()> pre_refinement
unsigned int subdomain_id
#define DeclException1(Exception1, type1, outsequence)
unsigned int n_active_hexes
unsigned int n_raw_quads() const
#define Assert(cond, exc)
boost::signals2::signal< void()> clear
::internal::TriangulationImplementation::Iterators< dim, dim > IteratorSelector
unsigned int n_raw_hexs(const unsigned int level) const
unsigned int max_adjacent_cells() const
void load(Archive &ar, const unsigned int version)
std::list< typename Triangulation< dim, spacedim >::cell_iterator > distorted_cells
unsigned int n_quads() const
#define DeclException0(Exception0)
boost::signals2::signal< void(const typename Triangulation< dim, spacedim >::cell_iterator &cell)> post_refinement_on_cell
typename IteratorSelector::active_quad_iterator active_quad_iterator
types::material_id material_id
const std::vector< Point< spacedim > > & get_vertices() const
boost::signals2::signal< void()> mesh_movement
unsigned int n_raw_lines() const
boost::signals2::signal< void()> pre_distributed_save
void save(Archive &ar, const unsigned int version) const
typename IteratorSelector::quad_iterator quad_iterator
boost::signals2::signal< void()> create
unsigned int n_active_quads() const
types::manifold_id manifold_id
std::vector< unsigned int > n_lines_level
boost::signals2::signal< void()> pre_partition
typename IteratorSelector::active_hex_iterator active_hex_iterator
unsigned int global_dof_index
boost::signals2::signal< void()> post_distributed_save
std::vector< unsigned int > n_active_hexes_level
virtual unsigned int n_global_levels() const
std::vector< CellData< 2 > > boundary_quads
boost::signals2::signal< unsigned int(const cell_iterator &, const CellStatus), CellWeightSum< unsigned int > > cell_weight
boost::signals2::signal< void()> pre_distributed_load
std::vector< unsigned int > n_active_lines_level
std::vector< unsigned int > n_active_quads_level
boost::signals2::signal< void()> post_distributed_load
std::vector< unsigned int > n_hexes_level
boost::signals2::signal< void()> pre_distributed_repartition
bool vertex_used(const unsigned int index) const
boost::signals2::signal< void()> any_change
boost::signals2::signal< void()> post_distributed_refinement