include/deal.II/lac/solver_selector.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: solver_selector.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 2012 by the deal.II authors
00005 //
00006 //    This file is subject to QPL and may not be  distributed
00007 //    without copyright and license information. Please refer
00008 //    to the file deal.II/doc/license.html for the  text  and
00009 //    further information on this license.
00010 //
00011 //---------------------------------------------------------------------------
00012 #ifndef __deal2__solver_selector_h
00013 #define __deal2__solver_selector_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/smartpointer.h>
00018 #include <deal.II/lac/solver.h>
00019 #include <deal.II/lac/vector.h>
00020 #include <deal.II/lac/vector_memory.h>
00021 #include <deal.II/lac/solver_control.h>
00022 #include <deal.II/lac/solver_cg.h>
00023 #include <deal.II/lac/solver_bicgstab.h>
00024 #include <deal.II/lac/solver_gmres.h>
00025 #include <deal.II/lac/vector_memory.h>
00026 #include <deal.II/lac/solver_richardson.h>
00027 #include <deal.II/lac/precondition.h>
00028 
00029 DEAL_II_NAMESPACE_OPEN
00030 
00031 
00034 
00094 template <class VECTOR = Vector<double> >
00095 class SolverSelector : public Subscriptor
00096 {
00097   public:
00098 
00103     SolverSelector ();
00104 
00114     SolverSelector (const std::string    &solvername,
00115                     SolverControl        &control,
00116                     VectorMemory<VECTOR> &vector_memory);
00117 
00121     ~SolverSelector();
00122 
00130     template<class Matrix, class Preconditioner>
00131     void solve(const Matrix &A,
00132                VECTOR &x,
00133                const VECTOR &b,
00134                const Preconditioner &precond) const;
00135 
00141     void select(const std::string& name);
00142 
00147     void set_control(SolverControl & ctrl);
00148 
00153     void set_data(const typename SolverRichardson<VECTOR>
00154                   ::AdditionalData &data);
00155 
00160     void set_data(const typename SolverCG<VECTOR>
00161                   ::AdditionalData &data);
00162 
00167     void set_data(const typename SolverBicgstab<VECTOR>
00168                   ::AdditionalData &data);
00169 
00174     void set_data(const typename SolverGMRES<VECTOR>
00175                   ::AdditionalData &data);
00176 
00181     void set_data(const typename SolverFGMRES<VECTOR>
00182                   ::AdditionalData &data);
00183 
00188     static std::string get_solver_names ();
00189 
00193     DeclException1 (ExcSolverDoesNotExist,
00194                     std::string, << "Solver " << arg1 << " does not exist. Use one of "
00195                     << std::endl << get_solver_names());
00196 
00197 
00198 
00199   protected:
00206     SmartPointer< SolverControl, SolverSelector< VECTOR > >     control;
00207 
00211     std::string solver_name;
00212 
00213   private:
00217     typename SolverRichardson<VECTOR>::AdditionalData richardson_data;
00218 
00222     typename SolverCG<VECTOR>::AdditionalData cg_data;
00223 
00227     typename SolverBicgstab<VECTOR>::AdditionalData bicgstab_data;
00228 
00232     typename SolverGMRES<VECTOR>::AdditionalData gmres_data;
00233 
00237     typename SolverFGMRES<VECTOR>::AdditionalData fgmres_data;
00238 };
00239 
00241 /* --------------------- Inline and template functions ------------------- */
00242 
00243 
00244 template <class VECTOR>
00245 SolverSelector<VECTOR>::SolverSelector()
00246 {}
00247 
00248 
00249 template <class VECTOR>
00250 SolverSelector<VECTOR>::SolverSelector(const std::string    &solver_name,
00251                                        SolverControl        &control,
00252                                        VectorMemory<VECTOR> &) :
00253                 control(&control),
00254                 solver_name(solver_name)
00255 {}
00256 
00257 
00258 template <class VECTOR>
00259 SolverSelector<VECTOR>::~SolverSelector()
00260 {}
00261 
00262 
00263 template <class VECTOR>
00264 void
00265 SolverSelector<VECTOR>::select(const std::string& name)
00266 {
00267   solver_name = name;
00268 }
00269 
00270 
00271 template <class VECTOR>
00272 template<class Matrix, class Preconditioner>
00273 void
00274 SolverSelector<VECTOR>::solve(const Matrix &A,
00275                               VECTOR &x,
00276                               const VECTOR &b,
00277                               const Preconditioner &precond) const
00278 {
00279   GrowingVectorMemory<VECTOR> vector_memory;
00280 
00281   if (solver_name=="richardson")
00282     {
00283       SolverRichardson<VECTOR> solver(*control, vector_memory,
00284                                       richardson_data);
00285       solver.solve(A,x,b,precond);
00286     }
00287   else if (solver_name=="cg")
00288     {
00289       SolverCG<VECTOR> solver(*control, vector_memory,
00290                               cg_data);
00291       solver.solve(A,x,b,precond);
00292     }
00293   else if (solver_name=="bicgstab")
00294     {
00295       SolverBicgstab<VECTOR> solver(*control, vector_memory,
00296                                     bicgstab_data);
00297       solver.solve(A,x,b,precond);
00298     }
00299   else if (solver_name=="gmres")
00300     {
00301       SolverGMRES<VECTOR> solver(*control,vector_memory,
00302                                  gmres_data);
00303       solver.solve(A,x,b,precond);
00304     }
00305   else if (solver_name=="fgmres")
00306     {
00307       SolverFGMRES<VECTOR> solver(*control,vector_memory,
00308                                   fgmres_data);
00309       solver.solve(A,x,b,precond);
00310     }
00311   else
00312     Assert(false,ExcSolverDoesNotExist(solver_name));
00313 }
00314 
00315 
00316 template <class VECTOR>
00317 void SolverSelector<VECTOR>::set_control(
00318   SolverControl & ctrl)
00319 {
00320   control=&ctrl;
00321 }
00322 
00323 
00324 template <class VECTOR>
00325 std::string SolverSelector<VECTOR>::get_solver_names()
00326 {
00327   return "richardson|cg|bicgstab|gmres|fgmres";
00328 }
00329 
00330 
00331 template <class VECTOR>
00332 void SolverSelector<VECTOR>::set_data(
00333   const typename SolverGMRES<VECTOR>::AdditionalData &data)
00334 {
00335   gmres_data=data;
00336 }
00337 
00338 
00339 template <class VECTOR>
00340 void SolverSelector<VECTOR>::set_data(
00341   const typename SolverFGMRES<VECTOR>::AdditionalData &data)
00342 {
00343   fgmres_data=data;
00344 }
00345 
00346 
00347 template <class VECTOR>
00348 void SolverSelector<VECTOR>::set_data(
00349   const typename SolverRichardson<VECTOR>::AdditionalData &data)
00350 {
00351   richardson_data=data;
00352 }
00353 
00354 
00355 template <class VECTOR>
00356 void SolverSelector<VECTOR>::set_data(
00357   const typename SolverCG<VECTOR>::AdditionalData &data)
00358 {
00359   cg_data=data;
00360 }
00361 
00362 
00363 template <class VECTOR>
00364 void SolverSelector<VECTOR>::set_data(
00365   const typename SolverBicgstab<VECTOR>::AdditionalData &data)
00366 {
00367   bicgstab_data=data;
00368 }
00369 
00370 
00371 DEAL_II_NAMESPACE_CLOSE
00372 
00373 #endif
00374 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Wed May 23 2012 06:07:39 by doxygen 1.7.3