17 #include <deal.II/base/logstream.h> 18 #include <deal.II/base/memory_consumption.h> 19 #include <deal.II/base/utilities.h> 21 #include <deal.II/distributed/tria_base.h> 23 #include <deal.II/grid/grid_tools.h> 24 #include <deal.II/grid/tria.h> 25 #include <deal.II/grid/tria_accessor.h> 26 #include <deal.II/grid/tria_iterator.h> 28 #include <deal.II/lac/sparsity_pattern.h> 29 #include <deal.II/lac/sparsity_tools.h> 30 #include <deal.II/lac/vector_memory.h> 38 DEAL_II_NAMESPACE_OPEN
42 template <
int dim,
int spacedim>
44 MPI_Comm mpi_communicator,
45 const typename ::Triangulation<dim, spacedim>::MeshSmoothing
47 const bool check_for_distorted_cells)
49 check_for_distorted_cells)
50 , mpi_communicator(mpi_communicator)
51 , my_subdomain(
Utilities::MPI::this_mpi_process(this->mpi_communicator))
52 , n_subdomains(
Utilities::MPI::n_mpi_processes(this->mpi_communicator))
54 #ifndef DEAL_II_WITH_MPI 56 ExcMessage(
"You compiled deal.II without MPI support, for " 57 "which parallel::Triangulation is not available."));
64 template <
int dim,
int spacedim>
67 const ::Triangulation<dim, spacedim> &other_tria)
69 #ifndef DEAL_II_WITH_MPI 72 ExcMessage(
"You compiled deal.II without MPI support, for " 73 "which parallel::Triangulation is not available."));
77 if (const ::parallel::Triangulation<dim, spacedim> *other_tria_x =
78 dynamic_cast<const ::parallel::Triangulation<dim, spacedim> *
>(
85 ::internal::GrowingVectorMemoryImplementation::
86 release_all_unused_memory();
93 template <
int dim,
int spacedim>
109 template <
int dim,
int spacedim>
114 ::internal::GrowingVectorMemoryImplementation::
115 release_all_unused_memory();
118 template <
int dim,
int spacedim>
124 template <
int dim,
int spacedim>
131 template <
int dim,
int spacedim>
138 template <
int dim,
int spacedim>
145 template <
int dim,
int spacedim>
146 const std::vector<unsigned int> &
153 template <
int dim,
int spacedim>
160 #ifdef DEAL_II_WITH_MPI 161 template <
int dim,
int spacedim>
195 if (cell->is_ghost())
211 unsigned int send_value =
214 MPI_Allgather(&send_value,
234 template <
int dim,
int spacedim>
252 cell->level_subdomain_id());
262 std::vector<MPI_Request> requests(
264 unsigned int dummy = 0;
265 unsigned int req_counter = 0;
267 for (std::set<types::subdomain_id>::iterator it =
272 ierr = MPI_Isend(&dummy,
278 &requests[req_counter]);
282 for (std::set<types::subdomain_id>::iterator it =
288 ierr = MPI_Recv(&dummy,
298 if (requests.size() > 0)
301 MPI_Waitall(requests.size(), requests.data(), MPI_STATUSES_IGNORE);
317 template <
int dim,
int spacedim>
324 template <
int dim,
int spacedim>
333 template <
int dim,
int spacedim>
342 template <
int dim,
int spacedim>
343 const std::set<types::subdomain_id> &
351 template <
int dim,
int spacedim>
352 const std::set<types::subdomain_id> &
360 template <
int dim,
int spacedim>
361 std::map<unsigned int, std::set<::types::subdomain_id>>
371 std::vector<bool> vertex_of_own_cell(this->
n_vertices(),
false);
374 if (cell->is_locally_owned())
375 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_cell; ++v)
376 vertex_of_own_cell[cell->vertex_index(v)] =
true;
378 std::map<unsigned int, std::set<::types::subdomain_id>> result;
380 if (cell->is_ghost())
383 for (
unsigned int v = 0; v < GeometryInfo<dim>::vertices_per_cell;
386 if (vertex_of_own_cell[cell->vertex_index(v)])
387 result[cell->vertex_index(v)].insert(owner);
399 #include "tria_base.inst" 401 DEAL_II_NAMESPACE_CLOSE
types::global_dof_index n_global_active_cells
virtual void copy_triangulation(const Triangulation< dim, spacedim > &other_tria)
virtual ~Triangulation() override
unsigned int n_global_levels
types::subdomain_id locally_owned_subdomain() const override
cell_iterator end() const
types::subdomain_id my_subdomain
std::set< types::subdomain_id > ghost_owners
IteratorRange< active_cell_iterator > active_cell_iterators() const
const std::vector< unsigned int > & n_locally_owned_active_cells_per_processor() const
void fill_level_ghost_owners()
Triangulation(MPI_Comm mpi_communicator, const typename::Triangulation< dim, spacedim >::MeshSmoothing smooth_grid=(::Triangulation< dim, spacedim >::none), const bool check_for_distorted_cells=false)
MPI_Comm mpi_communicator
cell_iterator begin(const unsigned int level=0) const
std::set< types::subdomain_id > level_ghost_owners
unsigned long long int global_dof_index
unsigned int n_levels() const
const std::set< types::subdomain_id > & level_ghost_owners() const
virtual MPI_Comm get_communicator() const
virtual void copy_triangulation(const ::Triangulation< dim, spacedim > &old_tria) override
const std::map< std::pair< cell_iterator, unsigned int >, std::pair< std::pair< cell_iterator, unsigned int >, std::bitset< 3 > > > & get_periodic_face_map() const
std::vector< unsigned int > n_locally_owned_active_cells
static::ExceptionBase & ExcMessage(std::string arg1)
unsigned int subdomain_id
#define Assert(cond, exc)
virtual void update_number_cache()
virtual std::map< unsigned int, std::set<::types::subdomain_id > > compute_vertices_with_ghost_neighbors() const
virtual std::size_t memory_consumption() const override
virtual unsigned int n_global_levels() const override
unsigned int n_locally_owned_active_cells() const
unsigned int n_mpi_processes(const MPI_Comm &mpi_communicator)
const types::subdomain_id artificial_subdomain_id
#define AssertThrowMPI(error_code)
static::ExceptionBase & ExcNotImplemented()
virtual types::global_dof_index n_global_active_cells() const override
active_cell_iterator begin_active(const unsigned int level=0) const
const std::set< types::subdomain_id > & ghost_owners() const
unsigned int n_vertices() const
T max(const T &t, const MPI_Comm &mpi_communicator)
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
types::subdomain_id n_subdomains
static::ExceptionBase & ExcInternalError()
virtual std::size_t memory_consumption() const