]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
catch exceptions
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 28 Nov 2003 10:12:24 +0000 (10:12 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 28 Nov 2003 10:12:24 +0000 (10:12 +0000)
git-svn-id: https://svn.dealii.org/trunk@8201 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/lac/include/lac/solver_richardson.h

index 603ebf47160fc3a9eb6605cf0f7a9f4080a2a016..f934663d212b9a2f90a82ef8d55c2ac20c207535 100644 (file)
@@ -200,35 +200,44 @@ SolverRichardson<VECTOR>::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<VECTOR>::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);

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.