00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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