1 #ifndef TWO_LEVEL_SCHWARZ_HH
2 #define TWO_LEVEL_SCHWARZ_HH
4 #if HAVE_SUITESPARSE_UMFPACK
6 #include <dune/common/timer.hh>
17 template<
class GFS,
class M,
class X,
class Y>
18 class TwoLevelOverlappingAdditiveSchwarz
19 :
public Dune::Preconditioner<X,Y>
24 typedef Dune::BlockVector<Dune::FieldVector<double,1> > COARSE_V;
25 typedef Dune::BCRSMatrix<Dune::FieldMatrix<double,1,1> > COARSE_M;
28 virtual Dune::SolverCategory::Category category()
const
30 return Dune::SolverCategory::overlapping;
40 TwoLevelOverlappingAdditiveSchwarz (
const GFS& gfs,
const M& AF, std::shared_ptr<
CoarseSpace<X> > coarse_space,
bool coarse_space_active =
true,
int verbosity = 0)
41 : verbosity_(verbosity),
42 coarse_space_active_(coarse_space_active),
44 solverf_(
Dune::PDELab::Backend::
native(AF),false),
45 coarse_space_(coarse_space),
46 coarse_solver_ (*coarse_space_->get_coarse_system()),
47 coarse_defect_(coarse_space_->basis_size(), coarse_space_->basis_size()),
48 prolongated_(gfs_, 0.0)
56 virtual void pre (X& x, Y& b)
64 virtual void apply (X& v,
const Y& d)
68 Dune::InverseOperatorResult result;
69 solverf_.apply(v,b,result);
71 if (!coarse_space_active_) {
75 gfs_.gridView().communicate(adddh,Dune::All_All_Interface,Dune::ForwardCommunication);
79 gfs_.gridView().comm().barrier();
80 Dune::Timer timer_coarse_solve;
82 coarse_space_->restrict (d, coarse_defect_);
85 Dune::InverseOperatorResult result;
86 COARSE_V v0(coarse_space_->basis_size(),coarse_space_->basis_size());
87 coarse_solver_.apply(v0, coarse_defect_, result);
90 coarse_space_->prolongate(v0, prolongated_);
93 coarse_time_ += timer_coarse_solve.elapsed();
97 gfs_.gridView().communicate(result_addh,Dune::All_All_Interface,Dune::ForwardCommunication);
106 virtual void post (X& x) {
107 if (verbosity_ > 0) std::cout <<
"Coarse time CT=" << coarse_time_ << std::endl;
108 if (verbosity_ > 0) std::cout <<
"Coarse time per apply CTA=" << coarse_time_ / apply_calls_ << std::endl;
113 bool coarse_space_active_;
115 double coarse_time_ = 0.0;
116 int apply_calls_ = 0;
119 Dune::UMFPack<ISTLM> solverf_;
120 std::shared_ptr<CoarseSpace<X> > coarse_space_;
121 Dune::UMFPack<COARSE_M> coarse_solver_;