From: kanschat Date: Thu, 4 Nov 1999 20:22:35 +0000 (+0000) Subject: PreconditionIdentity is not template class anymore X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a49c77e50810fb7e1c88ed2e266ca6a58f474a7;p=dealii-svn.git PreconditionIdentity is not template class anymore git-svn-id: https://svn.dealii.org/trunk@1826 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/lac/include/lac/precondition.h b/deal.II/lac/include/lac/precondition.h index 13ba73558b..8ad05245a3 100644 --- a/deal.II/lac/include/lac/precondition.h +++ b/deal.II/lac/include/lac/precondition.h @@ -13,13 +13,13 @@ * * @author Guido Kanschat, 1999 */ -template class PreconditionIdentity { public: /** * Execute preconditioning. */ + template void operator() (VECTOR&, const VECTOR&) const; }; @@ -183,6 +183,49 @@ class PreconditionRelaxation double omega; }; +/** + * Preconditioner using an iterative solver. This preconditioner uses + * a fully initialized LAC iterative solver for the approximate + * inverse of the matrix. Naturally, this solver needs another + * preconditionig method. + * + * Usually, the use of #ReductionControl# is preferred over the use of + * the basic #SolverControl in defining this solver. + * + * @author Guido Kanschat, 1999 + */ +template +class PreconditionLACSolver +{ + public: + /** + * Constructor. Provide a solver + * object, a matrix, and another + * preconditioner for this. + */ + PreconditionLACSolver(SOLVER&, + const MATRIX&, + const PRECONDITION&); + /** + * Execute preconditioning. + */ + template + void operator() (VECTOR&, const VECTOR&) const; + + private: + /** + * The solver class to use. + */ + SOLVER& solver; + /** + * The matrix in use. + */ + const MATRIX& matrix; + /** + * The preconditioner to use. + */ + const PRECONDITION& precondition; +}; @@ -190,7 +233,7 @@ class PreconditionRelaxation template void -PreconditionIdentity::operator() (VECTOR& dst, const VECTOR& src) const +PreconditionIdentity::operator() (VECTOR& dst, const VECTOR& src) const { dst = src; } @@ -228,4 +271,26 @@ PreconditionRelaxation::operator() (VECTOR& dst, (matrix.*precondition)(dst, src, omega); } +////////////////////////////////////////////////////////////////////// + +template +PreconditionLACSolver +::PreconditionLACSolver(SOLVER& solver, + const MATRIX& matrix, + const PRECONDITION& precondition) + : + solver(solver), matrix(matrix), precondition(precondition) +{} + +template +template +void +PreconditionLACSolver::operator() (VECTOR& dst, + const VECTOR& src) const +{ + solver.solve(matrix, dst, src, precondition); +} + + + #endif diff --git a/tests/Makefile b/tests/Makefile index 7269963fdb..c2bf129106 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -5,3 +5,8 @@ all: cd base ; make cd lac ; make cd deal.II ; make + +clean: + cd base ; make clean + cd lac ; make clean + cd deal.II ; make clean diff --git a/tests/deal.II/mg.cc b/tests/deal.II/mg.cc index bbd05a9cbb..b170f61545 100644 --- a/tests/deal.II/mg.cc +++ b/tests/deal.II/mg.cc @@ -104,7 +104,7 @@ int main() SolverControl control(100, 1.e-12); SolverCG, Vector >solver(control, mem); - PreconditionIdentity > precondition; + PreconditionIdentity precondition; solver.solve(A,u,f,precondition); u = 0.; @@ -124,9 +124,9 @@ int main() SolverControl cgcontrol(10,0., false, false); PrimitiveVectorMemory > cgmem; SolverCG, Vector > cgsolver(cgcontrol, cgmem); - PreconditionIdentity > cgprec; + PreconditionIdentity cgprec; MGCoarseGridLACIteration, Vector >, - SparseMatrix, PreconditionIdentity > > + SparseMatrix, PreconditionIdentity> coarse(cgsolver, mgA[0], cgprec); MGSmootherLAC smoother(mgA); diff --git a/tests/deal.II/mglocal.cc b/tests/deal.II/mglocal.cc index 04e863b95b..f5bfdda87d 100644 --- a/tests/deal.II/mglocal.cc +++ b/tests/deal.II/mglocal.cc @@ -136,9 +136,9 @@ int main() SolverControl cgcontrol(20,0., false, false); PrimitiveVectorMemory > cgmem; SolverCG, Vector > cgsolver(cgcontrol, cgmem); - PreconditionIdentity > cgprec; + PreconditionIdentity cgprec; MGCoarseGridLACIteration, Vector >, - SparseMatrix, PreconditionIdentity > > + SparseMatrix, PreconditionIdentity> coarse(cgsolver, mgA[tr.n_levels()-2], cgprec); MGSmootherRelaxation diff --git a/tests/lac/mg.cc b/tests/lac/mg.cc index f23dc45e23..3fc185677c 100644 --- a/tests/lac/mg.cc +++ b/tests/lac/mg.cc @@ -76,7 +76,7 @@ class MGSmootherLAC typedef MGCoarseGridLACIteration , Vector >, SparseMatrix, /*PreconditionRelaxation ,*/ - PreconditionIdentity > > + PreconditionIdentity > Coarse; @@ -133,7 +133,7 @@ int main() FDMG multigrid(level, A, transfer); // PreconditionRelaxation , Vector > - PreconditionIdentity > + PreconditionIdentity cgprec;//(A[minlevel], &SparseMatrix ::template precondition_SSOR, 1.2); Coarse coarsegrid(cgcg, A[minlevel], cgprec); diff --git a/tests/lac/solver.cc b/tests/lac/solver.cc index 6ba1c21804..8b61521f15 100644 --- a/tests/lac/solver.cc +++ b/tests/lac/solver.cc @@ -28,14 +28,15 @@ check_method( SOLVER& solver, const MATRIX& A, solver.solve(A,u,f,P); } -main() +int main() { ofstream logfile("solver.output"); deallog.attach(logfile); deallog.depth_console(0); - PrimitiveVectorMemory > mem; - SolverControl control(50, 1.e-5); + GrowingVectorMemory > mem; + SolverControl control(100, 1.e-5); + SolverControl verbose_control(100, 1.e-5, true); SolverCG , Vector > cg(control, mem); SolverGMRES , Vector > gmres(control, mem,20); SolverBicgstab , Vector > bicgstab(control, mem); @@ -44,10 +45,10 @@ main() for (unsigned int size=4; size <= 40; size *= 3) { - deallog << "Size " << size << endl; - unsigned int dim = (size-1)*(size-1); + deallog << "Size " << size << " Unknowns " << dim << endl; + // Make matrix FDMatrix testproblem(size, size); SparseMatrixStruct structure(dim, dim, 5); @@ -56,7 +57,7 @@ main() SparseMatrix A(structure); testproblem.laplacian(A); - PreconditionIdentity > + PreconditionIdentity prec_no; PreconditionRelaxation , Vector > prec_sor(A, &SparseMatrix ::template precondition_SOR, 1.2); diff --git a/tests/lac/solver.checked b/tests/lac/solver.checked index 0bf127ea52..01317a3f9c 100644 --- a/tests/lac/solver.checked +++ b/tests/lac/solver.checked @@ -1,10 +1,9 @@ -DEAL::Size 4 +DEAL::Size 4 Unknowns 9 DEAL::SOR-diff:0 DEAL:no:cg::Starting DEAL:no:cg::Starting DEAL:no:cg::Convergence step 2 -DEAL:no:Bicgstab::Go! DEAL:no:Bicgstab::Starting DEAL:no:Bicgstab::Convergence step 3 DEAL:no:GMRES::Starting @@ -17,33 +16,30 @@ DEAL:ssor:Richardson::Convergence step 15 DEAL:ssor:cg::Starting DEAL:ssor:cg::Starting DEAL:ssor:cg::Convergence step 4 -DEAL:ssor:Bicgstab::Go! DEAL:ssor:Bicgstab::Starting DEAL:ssor:Bicgstab::Convergence step 3 DEAL:ssor:GMRES::Starting DEAL:ssor:GMRES::Starting DEAL:ssor:GMRES::Convergence step 3 DEAL:ssor:QMRS::Starting -DEAL:ssor:QMRS::Convergence step 11 +DEAL:ssor:QMRS::Convergence step 5 DEAL:sor:Richardson::Starting DEAL:sor:Richardson::Convergence step 10 DEAL:sor:cg::Starting DEAL:sor:cg::Starting -DEAL:sor:cg::Failure step 50 -DEAL:sor:Bicgstab::Go! +DEAL:sor:cg::Failure step 100 DEAL:sor:Bicgstab::Starting DEAL:sor:Bicgstab::Convergence step 5 DEAL:sor:GMRES::Starting DEAL:sor:GMRES::Starting DEAL:sor:GMRES::Convergence step 4 DEAL:sor:QMRS::Starting -DEAL:sor:QMRS::Convergence step 12 -DEAL::Size 12 +DEAL:sor:QMRS::Failure step 100 +DEAL::Size 12 Unknowns 121 DEAL::SOR-diff:0 DEAL:no:cg::Starting DEAL:no:cg::Starting DEAL:no:cg::Convergence step 16 -DEAL:no:Bicgstab::Go! DEAL:no:Bicgstab::Starting DEAL:no:Bicgstab::Convergence step 13 DEAL:no:GMRES::Starting @@ -52,67 +48,64 @@ DEAL:no:GMRES::Convergence step 16 DEAL:no:QMRS::Starting DEAL:no:QMRS::Convergence step 18 DEAL:ssor:Richardson::Starting -DEAL:ssor:Richardson::Failure step 50 +DEAL:ssor:Richardson::Convergence step 88 DEAL:ssor:cg::Starting DEAL:ssor:cg::Starting DEAL:ssor:cg::Convergence step 10 -DEAL:ssor:Bicgstab::Go! DEAL:ssor:Bicgstab::Starting DEAL:ssor:Bicgstab::Convergence step 6 DEAL:ssor:GMRES::Starting DEAL:ssor:GMRES::Starting DEAL:ssor:GMRES::Convergence step 9 DEAL:ssor:QMRS::Starting -DEAL:ssor:QMRS::Convergence step 44 +DEAL:ssor:QMRS::Convergence step 12 DEAL:sor:Richardson::Starting -DEAL:sor:Richardson::Failure step 50 +DEAL:sor:Richardson::Failure step 100 DEAL:sor:cg::Starting DEAL:sor:cg::Starting -DEAL:sor:cg::Failure step 50 -DEAL:sor:Bicgstab::Go! +DEAL:sor:cg::Failure step 100 DEAL:sor:Bicgstab::Starting DEAL:sor:Bicgstab::Convergence step 19 DEAL:sor:GMRES::Starting DEAL:sor:GMRES::Starting DEAL:sor:GMRES::Convergence step 24 DEAL:sor:QMRS::Starting -DEAL:sor:QMRS::Convergence step 43 -DEAL::Size 36 +DEAL:sor:QMRS::Failure step 100 +DEAL::Size 36 Unknowns 1225 DEAL::SOR-diff:2.21867e-30 DEAL:no:cg::Starting DEAL:no:cg::Starting -DEAL:no:cg::Failure step 50 -DEAL:no:Bicgstab::Go! +DEAL:no:cg::Convergence step 58 DEAL:no:Bicgstab::Starting DEAL:no:Bicgstab::Convergence step 45 DEAL:no:GMRES::Starting DEAL:no:GMRES::Starting -DEAL:no:GMRES::Failure step 50 +DEAL:no:GMRES::Failure step 100 DEAL:no:QMRS::Starting -DEAL:no:QMRS::Failure step 50 +DEAL:no:QMRS::Convergence step 63 DEAL:ssor:Richardson::Starting -DEAL:ssor:Richardson::Failure step 50 +DEAL:ssor:Richardson::Failure step 100 DEAL:ssor:cg::Starting DEAL:ssor:cg::Starting DEAL:ssor:cg::Convergence step 26 -DEAL:ssor:Bicgstab::Go! DEAL:ssor:Bicgstab::Starting DEAL:ssor:Bicgstab::Convergence step 18 DEAL:ssor:GMRES::Starting DEAL:ssor:GMRES::Starting DEAL:ssor:GMRES::Convergence step 25 DEAL:ssor:QMRS::Starting -DEAL:ssor:QMRS::Failure step 50 +DEAL:ssor:QMRS::Convergence step 28 DEAL:sor:Richardson::Starting -DEAL:sor:Richardson::Failure step 50 +DEAL:sor:Richardson::Failure step 100 DEAL:sor:cg::Starting DEAL:sor:cg::Starting -DEAL:sor:cg::Failure step 50 -DEAL:sor:Bicgstab::Go! +DEAL:sor:cg::Failure step 100 DEAL:sor:Bicgstab::Starting -DEAL:sor:Bicgstab::Failure step 50 +DEAL:sor:Bicgstab::Convergence step 59 DEAL:sor:GMRES::Starting DEAL:sor:GMRES::Starting -DEAL:sor:GMRES::Failure step 50 +DEAL:sor:GMRES::Failure step 100 DEAL:sor:QMRS::Starting -DEAL:sor:QMRS::Failure step 50 +DEAL:sor:QMRS::Failure step 100 +DEAL::GrowingVectorMemory:Overall allocated vectors: 345 +DEAL::GrowingVectorMemory:Maximum allocated vectors: 20