00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__mg_transfer_component_h
00013 #define __deal2__mg_transfer_component_h
00014
00015 #include <deal.II/base/config.h>
00016
00017 #include <deal.II/lac/block_vector.h>
00018 #include <deal.II/lac/constraint_matrix.h>
00019 #ifdef DEAL_PREFER_MATRIX_EZ
00020 # include <deal.II/lac/sparse_matrix_ez.h>
00021 # include <deal.II/lac/block_sparse_matrix_ez.h>
00022 #else
00023 # include <deal.II/lac/sparsity_pattern.h>
00024 # include <deal.II/lac/block_sparsity_pattern.h>
00025 #endif
00026 #include <deal.II/lac/vector_memory.h>
00027
00028 #include <deal.II/multigrid/mg_base.h>
00029 #include <deal.II/base/mg_level_object.h>
00030
00031
00032
00033 #include <deal.II/dofs/dof_handler.h>
00034
00035 #include <deal.II/base/std_cxx1x/shared_ptr.h>
00036
00037
00038 DEAL_II_NAMESPACE_OPEN
00039
00040
00041 template <int dim, int spacedim> class MGDoFHandler;
00042
00043
00044
00045
00046
00049
00059 class MGTransferComponentBase
00060 {
00061 public:
00065 std::size_t memory_consumption () const;
00066
00067
00068 protected:
00085 template <int dim, int spacedim>
00086 void build_matrices (const DoFHandler<dim,spacedim>& dof,
00087 const MGDoFHandler<dim,spacedim>& mg_dof);
00088
00100 std::vector<bool> selected;
00101
00113 std::vector<bool> mg_selected;
00114
00120 std::vector<unsigned int> target_component;
00121
00127 std::vector<unsigned int> mg_target_component;
00128
00132 mutable std::vector<std::vector<unsigned int> > sizes;
00133
00137 std::vector<unsigned int> component_start;
00138
00143 std::vector<std::vector<unsigned int> > mg_component_start;
00144
00149 DeclException0(ExcMatricesNotBuilt);
00150
00151 private:
00152 std::vector<std_cxx1x::shared_ptr<BlockSparsityPattern> > prolongation_sparsities;
00153
00154 protected:
00155
00164 std::vector<std_cxx1x::shared_ptr<BlockSparseMatrix<double> > > prolongation_matrices;
00165
00172 std::vector<std::vector<std::pair<unsigned int, unsigned int> > >
00173 copy_to_and_from_indices;
00174
00181 std::vector<std::set<unsigned int> > boundary_indices;
00182 };
00183
00184
00185
00186
00187
00200 template <typename number>
00201 class MGTransferSelect : public MGTransferBase<Vector<number> >,
00202 private MGTransferComponentBase
00203 {
00204 public:
00212 MGTransferSelect ();
00213
00217 MGTransferSelect (const ConstraintMatrix& constraints);
00218
00222 virtual ~MGTransferSelect ();
00223
00224
00266 template <int dim, int spacedim>
00267 void build_matrices (const DoFHandler<dim,spacedim> &dof,
00268 const MGDoFHandler<dim,spacedim> &mg_dof,
00269 unsigned int selected,
00270 unsigned int mg_selected,
00271 const std::vector<unsigned int>& target_component
00272 = std::vector<unsigned int>(),
00273 const std::vector<unsigned int>& mg_target_component
00274 = std::vector<unsigned int>(),
00275 const std::vector<std::set<unsigned int> >& boundary_indices
00276 = std::vector<std::set<unsigned int> >()
00277 );
00278
00283 void select (const unsigned int component,
00284 const unsigned int mg_component = numbers::invalid_unsigned_int);
00285
00286 virtual void prolongate (const unsigned int to_level,
00287 Vector<number> &dst,
00288 const Vector<number> &src) const;
00289
00290 virtual void restrict_and_add (const unsigned int from_level,
00291 Vector<number> &dst,
00292 const Vector<number> &src) const;
00293
00298 template <int dim, typename number2, int spacedim>
00299 void
00300 copy_to_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00301 MGLevelObject<Vector<number> > &dst,
00302 const Vector<number2> &src) const;
00303
00313 template <int dim, typename number2, int spacedim>
00314 void
00315 copy_from_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00316 Vector<number2> &dst,
00317 const MGLevelObject<Vector<number> > &src) const;
00318
00327 template <int dim, typename number2, int spacedim>
00328 void
00329 copy_from_mg_add (const MGDoFHandler<dim,spacedim> &mg_dof,
00330 Vector<number2> &dst,
00331 const MGLevelObject<Vector<number> > &src) const;
00332
00337 template <int dim, typename number2, int spacedim>
00338 void
00339 copy_to_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00340 MGLevelObject<Vector<number> > &dst,
00341 const BlockVector<number2> &src) const;
00342
00353 template <int dim, typename number2, int spacedim>
00354 void
00355 copy_from_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00356 BlockVector<number2> &dst,
00357 const MGLevelObject<Vector<number> > &src) const;
00358
00367 template <int dim, typename number2, int spacedim>
00368 void
00369 copy_from_mg_add (const MGDoFHandler<dim,spacedim> &mg_dof,
00370 BlockVector<number2> &dst,
00371 const MGLevelObject<Vector<number> > &src) const;
00372
00376 std::size_t memory_consumption () const;
00377
00378 private:
00383 template <int dim, class OutVector, int spacedim>
00384 void
00385 do_copy_from_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00386 OutVector &dst,
00387 const MGLevelObject<Vector<number> > &src) const;
00388
00393 template <int dim, class OutVector, int spacedim>
00394 void
00395 do_copy_from_mg_add (const MGDoFHandler<dim,spacedim> &mg_dof,
00396 OutVector &dst,
00397 const MGLevelObject<Vector<number> > &src) const;
00398
00403 template <int dim, class InVector, int spacedim>
00404 void
00405 do_copy_to_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00406 MGLevelObject<Vector<number> > &dst,
00407 const InVector &src) const;
00411 unsigned int selected_component;
00415 unsigned int mg_selected_component;
00416
00427 std::vector<std::vector<bool> > interface_dofs;
00428
00433 public:
00434 SmartPointer<const ConstraintMatrix> constraints;
00435 };
00436
00439
00440 template <typename number>
00441 inline void
00442 MGTransferSelect<number>::select(const unsigned int component,
00443 const unsigned int mg_component)
00444 {
00445 selected_component = component;
00446 mg_selected_component = (mg_component == numbers::invalid_unsigned_int)
00447 ? component
00448 : mg_component;
00449 }
00450
00451 DEAL_II_NAMESPACE_CLOSE
00452
00453 #endif
00454