From: heister Date: Tue, 12 Oct 2010 19:05:40 +0000 (+0000) Subject: Fix SolverSelector when using a custom SolverControl. It got copied into a member... X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b688e41f870210524a32601fc370136d2f4794ed;p=dealii-svn.git Fix SolverSelector when using a custom SolverControl. It got copied into a member and thus sliced. Changed into using a SmartPointer. git-svn-id: https://svn.dealii.org/trunk@22316 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/lac/include/lac/solver_selector.h b/deal.II/lac/include/lac/solver_selector.h index cb5ad94fb3..fa602b32b0 100644 --- a/deal.II/lac/include/lac/solver_selector.h +++ b/deal.II/lac/include/lac/solver_selector.h @@ -140,6 +140,12 @@ class SolverSelector : public Subscriptor * class are all lower case. */ void select(const std::string& name); + + /** + * Set a new SolverControl. This needs to + * be set before solving. + */ + void set_control(SolverControl & ctrl); /** * Set the additional data. For more @@ -189,27 +195,17 @@ class SolverSelector : public Subscriptor std::string, << "Solver " << arg1 << " does not exist. Use one of " << std::endl << get_solver_names()); + + + protected: /** - * Stores the @p ReductionControl that - * is needed in the constructor of - * each @p Solver class. This - * data member is public, so that - * it can easily be changed from - * its default values. If you - * create a SolverControl or - * ReductionControl object with - * the values needed, you can - * simply use solver.control - * = my_control to set the - * values here. - * - * This object is updated in - * solve(), thus declared mutable - * here. + * Stores the @p SolverControl that is + * needed in the constructor of each @p + * Solver class. This can be changed with + * @p set_control(). */ - mutable ReductionControl control; + SmartPointer< SolverControl, SolverSelector< VECTOR > > control; - protected: /** * Stores the name of the solver. */ @@ -255,7 +251,7 @@ template SolverSelector::SolverSelector(const std::string &solver_name, SolverControl &control, VectorMemory &) : - control(control), + control(&control), solver_name(solver_name) {} @@ -273,7 +269,6 @@ SolverSelector::select(const std::string& name) } - template template void @@ -286,31 +281,31 @@ SolverSelector::solve(const Matrix &A, if (solver_name=="richardson") { - SolverRichardson solver(control,vector_memory, + SolverRichardson solver(*control, vector_memory, richardson_data); solver.solve(A,x,b,precond); } else if (solver_name=="cg") { - SolverCG solver(control,vector_memory, + SolverCG solver(*control, vector_memory, cg_data); solver.solve(A,x,b,precond); } else if (solver_name=="bicgstab") { - SolverBicgstab solver(control,vector_memory, + SolverBicgstab solver(*control, vector_memory, bicgstab_data); solver.solve(A,x,b,precond); } else if (solver_name=="gmres") { - SolverGMRES solver(control,vector_memory, + SolverGMRES solver(*control,vector_memory, gmres_data); solver.solve(A,x,b,precond); } else if (solver_name=="fgmres") { - SolverFGMRES solver(control,vector_memory, + SolverFGMRES solver(*control,vector_memory, fgmres_data); solver.solve(A,x,b,precond); } @@ -319,6 +314,14 @@ SolverSelector::solve(const Matrix &A, } +template +void SolverSelector::set_control( + SolverControl & ctrl) +{ + control=&ctrl; +} + + template std::string SolverSelector::get_solver_names() {