From: Martin Kronbichler Date: Fri, 8 May 2009 14:35:46 +0000 (+0000) Subject: Use ILU preconditioner instead of IC - which makes CG converge in less iterations... X-Git-Tag: v8.0.0~7704 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa87d7416aedcd9c60a0ca6947739d06a9063276;p=dealii.git Use ILU preconditioner instead of IC - which makes CG converge in less iterations. This allows us to use the ILU preconditioner as Schur complement approximation instead of an InverseMatrix class. git-svn-id: https://svn.dealii.org/trunk@18825 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/examples/step-32/step-32.cc b/deal.II/examples/step-32/step-32.cc index 4d50744277..d67948f38e 100644 --- a/deal.II/examples/step-32/step-32.cc +++ b/deal.II/examples/step-32/step-32.cc @@ -179,76 +179,22 @@ namespace EquationData namespace LinearSolvers { - template - class InverseMatrix : public Subscriptor - { - public: - InverseMatrix (const Matrix &m, - const Preconditioner &preconditioner); - - - template - void vmult (VectorType &dst, - const VectorType &src) const; - - private: - const SmartPointer matrix; - const Preconditioner &preconditioner; - }; - - - template - InverseMatrix:: - InverseMatrix (const Matrix &m, - const Preconditioner &preconditioner) - : - matrix (&m), - preconditioner (preconditioner) - {} - - - - template - template - void - InverseMatrix:: - vmult (VectorType &dst, - const VectorType &src) const - { - SolverControl solver_control (src.size(), 1e-7*src.l2_norm()); - SolverCG cg (solver_control); - - dst = 0; - - try - { - cg.solve (*matrix, dst, src, preconditioner); - } - catch (std::exception &e) - { - Assert (false, ExcMessage(e.what())); - } - } - - - template class BlockSchurPreconditioner : public Subscriptor { public: BlockSchurPreconditioner ( - const TrilinosWrappers::BlockSparseMatrix &S, - const InverseMatrix &Mpinv, - const PreconditionerA &Apreconditioner); + const TrilinosWrappers::BlockSparseMatrix &S, + const PreconditionerMp &Mppreconditioner, + const PreconditionerA &Apreconditioner); void vmult (TrilinosWrappers::MPI::BlockVector &dst, const TrilinosWrappers::MPI::BlockVector &src) const; private: const SmartPointer stokes_matrix; - const SmartPointer > m_inverse; - const PreconditionerA &a_preconditioner; + const PreconditionerMp &mp_preconditioner; + const PreconditionerA &a_preconditioner; mutable TrilinosWrappers::MPI::Vector tmp; }; @@ -256,12 +202,12 @@ namespace LinearSolvers template BlockSchurPreconditioner:: - BlockSchurPreconditioner(const TrilinosWrappers::BlockSparseMatrix &S, - const InverseMatrix &Mpinv, - const PreconditionerA &Apreconditioner) + BlockSchurPreconditioner(const TrilinosWrappers::BlockSparseMatrix &S, + const PreconditionerMp &Mppreconditioner, + const PreconditionerA &Apreconditioner) : stokes_matrix (&S), - m_inverse (&Mpinv), + mp_preconditioner (Mppreconditioner), a_preconditioner (Apreconditioner), tmp (stokes_matrix->block(1,1).row_partitioner()) {} @@ -276,7 +222,7 @@ namespace LinearSolvers a_preconditioner.vmult (dst.block(0), src.block(0)); stokes_matrix->block(1,0).residual(tmp, dst.block(0), src.block(1)); tmp *= -1; - m_inverse->vmult (dst.block(1), tmp); + mp_preconditioner.vmult (dst.block(1), tmp); } } @@ -361,8 +307,8 @@ class BoussinesqFlowProblem unsigned int timestep_number; std_cxx1x::shared_ptr Amg_preconditioner; - std_cxx1x::shared_ptr Mp_preconditioner; - std_cxx1x::shared_ptr T_preconditioner; + std_cxx1x::shared_ptr Mp_preconditioner; + std_cxx1x::shared_ptr T_preconditioner; bool rebuild_stokes_matrix; bool rebuild_stokes_preconditioner; @@ -403,7 +349,7 @@ BoussinesqFlowProblem::BoussinesqFlowProblem () rebuild_stokes_preconditioner (true), rebuild_temperature_matrices (true), rebuild_temperature_preconditioner (true), - computing_timer (pcout, TimerOutput::summary, + computing_timer (pcout, TimerOutput::every_call_and_summary, TimerOutput::wall_times) {} @@ -868,8 +814,8 @@ BoussinesqFlowProblem::build_stokes_preconditioner () Amg_preconditioner->initialize(stokes_preconditioner_matrix.block(0,0), amg_data); - Mp_preconditioner = std_cxx1x::shared_ptr - (new TrilinosWrappers::PreconditionIC()); + Mp_preconditioner = std_cxx1x::shared_ptr + (new TrilinosWrappers::PreconditionILU()); Mp_preconditioner->initialize (stokes_preconditioner_matrix.block(1,1)); @@ -1116,8 +1062,8 @@ void BoussinesqFlowProblem::assemble_temperature_system (const double maxim if (rebuild_temperature_preconditioner == true) { - T_preconditioner = std_cxx1x::shared_ptr - (new TrilinosWrappers::PreconditionIC()); + T_preconditioner = std_cxx1x::shared_ptr + (new TrilinosWrappers::PreconditionILU()); T_preconditioner->initialize (temperature_matrix); rebuild_temperature_preconditioner = false; @@ -1350,10 +1296,10 @@ void BoussinesqFlowProblem::project_temperature_field () GrowingVectorMemory memory; SolverCG cg(control,memory); - TrilinosWrappers::PreconditionIC prec; - prec.initialize(temperature_mass_matrix); + TrilinosWrappers::PreconditionILU preconditioner_mass; + preconditioner_mass.initialize(temperature_mass_matrix); - cg.solve (temperature_mass_matrix, sol, rhs, prec); + cg.solve (temperature_mass_matrix, sol, rhs, preconditioner_mass); old_temperature_solution = sol; temperature_constraints.distribute (old_temperature_solution); @@ -1367,13 +1313,9 @@ void BoussinesqFlowProblem::solve () pcout << " Solving..." << std::endl; { - const LinearSolvers::InverseMatrix - mp_inverse (stokes_preconditioner_matrix.block(1,1), *Mp_preconditioner); - const LinearSolvers::BlockSchurPreconditioner - preconditioner (stokes_matrix, mp_inverse, *Amg_preconditioner); + TrilinosWrappers::PreconditionILU> + preconditioner (stokes_matrix, *Mp_preconditioner, *Amg_preconditioner); SolverControl solver_control (stokes_matrix.m(), 1e-6*stokes_rhs.l2_norm());