15#ifndef dealii_multigrid_h
16#define dealii_multigrid_h
34#include <boost/signals2.hpp>
43 "The name 'signals' is already defined. You are most likely using the QT library \
44and using the 'signals' keyword. You can either #include the Qt headers (or any conflicting headers) \
45*after* the deal.II headers or you can define the 'QT_NO_KEYWORDS' macro and use the 'Q_SIGNALS' macro."
89 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
100 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
108 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
119 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
127 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
135 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
142 boost::signals2::signal<void(
const bool before,
const unsigned int level)>
164template <
typename VectorType>
315 boost::signals2::connection
317 const std::function<
void(
const bool,
const unsigned int)> &slot);
322 boost::signals2::connection
324 const std::function<
void(
const bool,
const unsigned int)> &slot);
329 boost::signals2::connection
331 const std::function<
void(
const bool,
const unsigned int)> &slot);
336 boost::signals2::connection
338 const std::function<
void(
const bool,
const unsigned int)> &slot);
343 boost::signals2::connection
345 const std::function<
void(
const bool,
const unsigned int)> &slot);
350 boost::signals2::connection
352 const std::function<
void(
const bool,
const unsigned int)> &slot);
357 boost::signals2::connection
359 const std::function<
void(
const bool,
const unsigned int)> &slot);
485 template <
int dim,
typename OtherVectorType,
typename TransferType>
504template <
int dim,
typename VectorType,
typename TransferType>
536 template <
typename OtherVectorType>
538 vmult(OtherVectorType &dst,
const OtherVectorType &src)
const;
544 template <
typename OtherVectorType>
546 vmult_add(OtherVectorType &dst,
const OtherVectorType &src)
const;
553 template <
typename OtherVectorType>
555 Tvmult(OtherVectorType &dst,
const OtherVectorType &src)
const;
562 template <
typename OtherVectorType>
564 Tvmult_add(OtherVectorType &dst,
const OtherVectorType &src)
const;
593 boost::signals2::connection
599 boost::signals2::connection
618 std::vector<ObserverPointer<const DoFHandler<dim>,
660template <
typename VectorType>
666 const unsigned int min_level,
667 const unsigned int max_level,
670 , matrix(&matrix, typeid(*this).name())
671 , coarse(&coarse, typeid(*this).name())
672 , transfer(&transfer, typeid(*this).name())
673 , pre_smooth(&pre_smooth, typeid(*this).name())
674 , post_smooth(&post_smooth, typeid(*this).name())
675 , edge_out(nullptr, typeid(*this).name())
676 , edge_in(nullptr, typeid(*this).name())
677 , edge_down(nullptr, typeid(*this).name())
678 , edge_up(nullptr, typeid(*this).name())
681 maxlevel = matrix.get_maxlevel();
683 maxlevel = max_level;
684 reinit(min_level, maxlevel);
689template <
typename VectorType>
698template <
typename VectorType>
711 namespace PreconditionMGImplementation
715 typename TransferType,
716 typename OtherVectorType>
717 std::enable_if_t<TransferType::supports_dof_handler_vector>
720 const TransferType &transfer,
721 OtherVectorType &dst,
722 const OtherVectorType &src,
723 const bool uses_dof_handler_vector,
724 const typename ::mg::Signals &signals,
727 signals.transfer_to_mg(
true);
728 if (uses_dof_handler_vector)
729 transfer.copy_to_mg(dof_handler_vector, multigrid.
defect, src);
731 transfer.copy_to_mg(*dof_handler_vector[0], multigrid.
defect, src);
732 signals.transfer_to_mg(
false);
736 signals.transfer_to_global(
true);
737 if (uses_dof_handler_vector)
738 transfer.copy_from_mg(dof_handler_vector, dst, multigrid.
solution);
740 transfer.copy_from_mg(*dof_handler_vector[0], dst, multigrid.
solution);
741 signals.transfer_to_global(
false);
746 typename TransferType,
747 typename OtherVectorType>
751 const TransferType &transfer,
752 OtherVectorType &dst,
753 const OtherVectorType &src,
754 const bool uses_dof_handler_vector,
755 const typename ::mg::Signals &signals,
758 (void)uses_dof_handler_vector;
761 signals.transfer_to_mg(
true);
762 transfer.copy_to_mg(*dof_handler_vector[0], multigrid.
defect, src);
763 signals.transfer_to_mg(
false);
767 signals.transfer_to_global(
true);
768 transfer.copy_from_mg(*dof_handler_vector[0], dst, multigrid.
solution);
769 signals.transfer_to_global(
false);
774 typename TransferType,
775 typename OtherVectorType>
776 std::enable_if_t<TransferType::supports_dof_handler_vector>
777 vmult_add(
const std::vector<
const DoFHandler<dim> *> &dof_handler_vector,
779 const TransferType &transfer,
780 OtherVectorType &dst,
781 const OtherVectorType &src,
782 const bool uses_dof_handler_vector,
783 const typename ::mg::Signals &signals,
786 signals.transfer_to_mg(
true);
787 if (uses_dof_handler_vector)
788 transfer.copy_to_mg(dof_handler_vector, multigrid.
defect, src);
790 transfer.copy_to_mg(*dof_handler_vector[0], multigrid.
defect, src);
791 signals.transfer_to_mg(
false);
795 signals.transfer_to_global(
true);
796 if (uses_dof_handler_vector)
797 transfer.copy_from_mg_add(dof_handler_vector, dst, multigrid.
solution);
799 transfer.copy_from_mg_add(*dof_handler_vector[0],
802 signals.transfer_to_global(
false);
807 typename TransferType,
808 typename OtherVectorType>
810 vmult_add(
const std::vector<
const DoFHandler<dim> *> &dof_handler_vector,
812 const TransferType &transfer,
813 OtherVectorType &dst,
814 const OtherVectorType &src,
815 const bool uses_dof_handler_vector,
816 const typename ::mg::Signals &signals,
819 (void)uses_dof_handler_vector;
822 signals.transfer_to_mg(
true);
823 transfer.copy_to_mg(*dof_handler_vector[0], multigrid.
defect, src);
824 signals.transfer_to_mg(
false);
828 signals.transfer_to_global(
true);
829 transfer.copy_from_mg_add(*dof_handler_vector[0],
832 signals.transfer_to_global(
false);
837template <
int dim,
typename VectorType,
typename TransferType>
841 const TransferType &transfer)
842 : dof_handler_vector(1, &dof_handler)
843 , dof_handler_vector_raw(1, &dof_handler)
845 , transfer(&transfer)
846 , uses_dof_handler_vector(false)
849template <
int dim,
typename VectorType,
typename TransferType>
853 const TransferType &transfer)
854 : dof_handler_vector(dof_handler.
size())
855 , dof_handler_vector_raw(dof_handler.
size())
857 , transfer(&transfer)
858 , uses_dof_handler_vector(true)
860 for (
unsigned int i = 0; i < dof_handler.size(); ++i)
867template <
int dim,
typename VectorType,
typename TransferType>
874template <
int dim,
typename VectorType,
typename TransferType>
875template <
typename OtherVectorType>
878 OtherVectorType &dst,
879 const OtherVectorType &src)
const
881 internal::PreconditionMGImplementation::vmult(dof_handler_vector_raw,
886 uses_dof_handler_vector,
892template <
int dim,
typename VectorType,
typename TransferType>
895 const unsigned int block)
const
898 return dof_handler_vector[block]->locally_owned_dofs();
902template <
int dim,
typename VectorType,
typename TransferType>
905 const unsigned int block)
const
908 return dof_handler_vector[block]->locally_owned_dofs();
913template <
int dim,
typename VectorType,
typename TransferType>
928template <
int dim,
typename VectorType,
typename TransferType>
929boost::signals2::connection
931 const std::function<
void(
bool)> &slot)
933 return this->signals.transfer_to_mg.connect(slot);
938template <
int dim,
typename VectorType,
typename TransferType>
939boost::signals2::connection
941 const std::function<
void(
bool)> &slot)
943 return this->signals.transfer_to_global.connect(slot);
948template <
int dim,
typename VectorType,
typename TransferType>
949template <
typename OtherVectorType>
952 OtherVectorType &dst,
953 const OtherVectorType &src)
const
955 internal::PreconditionMGImplementation::vmult_add(dof_handler_vector_raw,
960 uses_dof_handler_vector,
966template <
int dim,
typename VectorType,
typename TransferType>
967template <
typename OtherVectorType>
971 const OtherVectorType &)
const
977template <
int dim,
typename VectorType,
typename TransferType>
978template <
typename OtherVectorType>
982 const OtherVectorType &)
const
988template <
int dim,
typename VectorType,
typename TransferType>
992 return *this->multigrid;
996template <
int dim,
typename VectorType,
typename TransferType>
1000 return *this->multigrid;
ObserverPointer< const MGMatrixBase< VectorType > > edge_out
MGLevelObject< VectorType > defect2
void set_edge_flux_matrices(const MGMatrixBase< VectorType > &edge_down, const MGMatrixBase< VectorType > &edge_up)
MGLevelObject< VectorType > solution
ObserverPointer< const MGSmootherBase< VectorType >, Multigrid< VectorType > > post_smooth
boost::signals2::connection connect_edge_prolongation(const std::function< void(const bool, const unsigned int)> &slot)
ObserverPointer< const MGMatrixBase< VectorType > > edge_in
void set_maxlevel(const unsigned int)
unsigned int get_minlevel() const
void set_edge_matrices(const MGMatrixBase< VectorType > &edge_out, const MGMatrixBase< VectorType > &edge_in)
boost::signals2::connection connect_residual_step(const std::function< void(const bool, const unsigned int)> &slot)
void level_step(const unsigned int level, Cycle cycle)
unsigned int get_maxlevel() const
ObserverPointer< const MGCoarseGridBase< VectorType >, Multigrid< VectorType > > coarse
ObserverPointer< const MGSmootherBase< VectorType >, Multigrid< VectorType > > pre_smooth
const VectorType const_vector_type
boost::signals2::connection connect_post_smoother_step(const std::function< void(const bool, const unsigned int)> &slot)
boost::signals2::connection connect_coarse_solve(const std::function< void(const bool, const unsigned int)> &slot)
ObserverPointer< const MGMatrixBase< VectorType >, Multigrid< VectorType > > matrix
boost::signals2::connection connect_prolongation(const std::function< void(const bool, const unsigned int)> &slot)
void set_edge_in_matrix(const MGMatrixBase< VectorType > &edge_in)
MGLevelObject< VectorType > t
void set_minlevel(const unsigned int level, bool relative=false)
void level_v_step(const unsigned int level)
Multigrid(const MGMatrixBase< VectorType > &matrix, const MGCoarseGridBase< VectorType > &coarse, const MGTransferBase< VectorType > &transfer, const MGSmootherBase< VectorType > &pre_smooth, const MGSmootherBase< VectorType > &post_smooth, const unsigned int minlevel=0, const unsigned int maxlevel=numbers::invalid_unsigned_int, Cycle cycle=v_cycle)
MGLevelObject< VectorType > defect
ObserverPointer< const MGMatrixBase< VectorType >, Multigrid< VectorType > > edge_down
boost::signals2::connection connect_restriction(const std::function< void(const bool, const unsigned int)> &slot)
void reinit(const unsigned int minlevel, const unsigned int maxlevel)
ObserverPointer< const MGMatrixBase< VectorType >, Multigrid< VectorType > > edge_up
boost::signals2::connection connect_pre_smoother_step(const std::function< void(const bool, const unsigned int)> &slot)
ObserverPointer< const MGTransferBase< VectorType >, Multigrid< VectorType > > transfer
std::vector< const DoFHandler< dim > * > dof_handler_vector_raw
void Tvmult(OtherVectorType &dst, const OtherVectorType &src) const
IndexSet locally_owned_domain_indices(const unsigned int block=0) const
ObserverPointer< Multigrid< VectorType >, PreconditionMG< dim, VectorType, TransferType > > multigrid
const Multigrid< VectorType > & get_multigrid() const
boost::signals2::connection connect_transfer_to_global(const std::function< void(bool)> &slot)
boost::signals2::connection connect_transfer_to_mg(const std::function< void(bool)> &slot)
PreconditionMG(const DoFHandler< dim > &dof_handler, Multigrid< VectorType > &mg, const TransferType &transfer)
ObserverPointer< const TransferType, PreconditionMG< dim, VectorType, TransferType > > transfer
MPI_Comm get_mpi_communicator() const
const bool uses_dof_handler_vector
void vmult_add(OtherVectorType &dst, const OtherVectorType &src) const
IndexSet locally_owned_range_indices(const unsigned int block=0) const
std::vector< ObserverPointer< const DoFHandler< dim >, PreconditionMG< dim, VectorType, TransferType > > > dof_handler_vector
PreconditionMG(const std::vector< const DoFHandler< dim > * > &dof_handler, Multigrid< VectorType > &mg, const TransferType &transfer)
Multigrid< VectorType > & get_multigrid()
void Tvmult_add(OtherVectorType &dst, const OtherVectorType &src) const
void vmult(OtherVectorType &dst, const OtherVectorType &src) const
Triangulation< dim, spacedim > & get_triangulation()
virtual MPI_Comm get_mpi_communicator() const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
#define DEAL_II_NOT_IMPLEMENTED()
Tpetra::Vector< Number, LO, GO, NodeType< MemorySpace > > VectorType
constexpr unsigned int invalid_unsigned_int
boost::signals2::signal< void(const bool before, const unsigned int level)> prolongation
boost::signals2::signal< void(const bool before, const unsigned int level)> pre_smoother_step
boost::signals2::signal< void(const bool before, const unsigned int level)> coarse_solve
boost::signals2::signal< void(const bool before, const unsigned int level)> edge_prolongation
boost::signals2::signal< void(const bool before, const unsigned int level)> post_smoother_step
boost::signals2::signal< void(const bool before)> transfer_to_global
boost::signals2::signal< void(const bool before, const unsigned int level)> residual_step
boost::signals2::signal< void(const bool before, const unsigned int level)> restriction
boost::signals2::signal< void(const bool before)> transfer_to_mg