From dff941c37e432f7559d70a93fe304f80b9465805 Mon Sep 17 00:00:00 2001 From: guido Date: Fri, 28 Nov 2003 10:12:24 +0000 Subject: [PATCH] catch exceptions git-svn-id: https://svn.dealii.org/trunk@8201 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/lac/include/lac/solver_richardson.h | 101 ++++++++++++-------- 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/deal.II/lac/include/lac/solver_richardson.h b/deal.II/lac/include/lac/solver_richardson.h index 603ebf4716..f934663d21 100644 --- a/deal.II/lac/include/lac/solver_richardson.h +++ b/deal.II/lac/include/lac/solver_richardson.h @@ -200,35 +200,44 @@ SolverRichardson::solve (const MATRIX &A, Vd = this->memory.alloc(); VECTOR& d = *Vd; d.reinit(x); deallog.push("Richardson"); - - // Main loop - for(int iter=0; conv==SolverControl::iterate; iter++) + + try { - // Do not use residual, - // but do it in 2 steps - A.vmult(r,x); - r.sadd(-1.,1.,b); - - if (!additional_data.use_preconditioned_residual) - { - res = r.l2_norm(); - conv = this->control().check (iter, criterion()); - if (conv != SolverControl::iterate) - break; - } - - precondition.vmult(d,r); - if (additional_data.use_preconditioned_residual) + // Main loop + for(int iter=0; conv==SolverControl::iterate; iter++) { - res = d.l2_norm(); - conv = this->control().check (iter, criterion()); - if (conv != SolverControl::iterate) - break; + // Do not use residual, + // but do it in 2 steps + A.vmult(r,x); + r.sadd(-1.,1.,b); + + if (!additional_data.use_preconditioned_residual) + { + res = r.l2_norm(); + conv = this->control().check (iter, criterion()); + if (conv != SolverControl::iterate) + break; + } + + precondition.vmult(d,r); + if (additional_data.use_preconditioned_residual) + { + res = d.l2_norm(); + conv = this->control().check (iter, criterion()); + if (conv != SolverControl::iterate) + break; + } + x.add(additional_data.omega,d); + print_vectors(iter,x,r,d); } - x.add(additional_data.omega,d); - print_vectors(iter,x,r,d); } - + catch (const ExceptionBase& e) + { + this->memory.free(Vr); + this->memory.free(Vd); + deallog.pop(); + throw e; + } // Deallocate Memory this->memory.free(Vr); this->memory.free(Vd); @@ -260,24 +269,34 @@ SolverRichardson::Tsolve (const MATRIX &A, deallog.push("RichardsonT"); - // Main loop - for(int iter=0; conv==SolverControl::iterate; iter++) + try + { + // Main loop + for(int iter=0; conv==SolverControl::iterate; iter++) + { + // Do not use Tresidual, + // but do it in 2 steps + A.Tvmult(r,x); + r.sadd(-1.,1.,b); + res=r.l2_norm(); + + conv = this->control().check (iter, criterion()); + if (conv != SolverControl::iterate) + break; + + precondition.Tvmult(d,r); + x.add(additional_data.omega,d); + print_vectors(iter,x,r,d); + } + } + catch (const ExceptionBase& e) { - // Do not use Tresidual, - // but do it in 2 steps - A.Tvmult(r,x); - r.sadd(-1.,1.,b); - res=r.l2_norm(); - - conv = this->control().check (iter, criterion()); - if (conv != SolverControl::iterate) - break; - - precondition.Tvmult(d,r); - x.add(additional_data.omega,d); - print_vectors(iter,x,r,d); + this->memory.free(Vr); + this->memory.free(Vd); + deallog.pop(); + throw e; } - + // Deallocate Memory this->memory.free(Vr); this->memory.free(Vd); -- 2.39.5