def solve(self,rhs):
     """ 
     Overrides LinearSolver.solve
     Result contains (solution,status)
     Status means:
          0: method has converged
          k>0 : maximum number of iterations reached
          k<0 : illegal input or breakdown
     """
     self.resid = zeros((0,))
     tol = self.param['tol']
     if self.param['relative']:
         tol = max(self.param['rel_tol']*norm(rhs),tol)
     print_it = self.param['print']
     #if print_it == 'short':
     restart = self.param['restart']
     maxiter = self.param['max_iter']
     if self.param['flexible']:
         x,info=self.fgmres(rhs,tol=tol,restrt=restart,\
             maxiter=maxiter)
     elif self.param['builtin']:
         if ((restart > len(rhs)) or (restart == None)):
             restart = 2*len(rhs)
         print "# using builtin | restrt : ", restart
         x,info=sgmres(self.point,rhs,tol=tol,\
             restrt=restart,maxiter=maxiter,\
             callback=self.callback,xtype=None)
     else:
         x,info=self.gmres(rhs,tol=tol,restrt=restart,\
             maxiter=maxiter)
     return (x,info)
 def solve(self,rhs):
     """ 
     Overrides LinearSolver.solve
     Result contains (solution,status)
     Status means:
          0: method has converged
          k>0 : maximum number of iterations reached
          k<0 : illegal input or breakdown
     """
     #self.resid = zeros((0,))
     tol = self.param['tol']
     if self.param['relative']:
         tol = max(self.param['rel_tol']*norm(rhs),tol)
     print_it = self.param['print']
     #if print_it == 'short':
     restart = self.param['restart']
     maxiter = self.param['max_iter']
     if self.param['flexible']:
         x,info=self.fgmres(rhs,tol=tol,restrt=restart,\
             maxiter=maxiter)
     elif self.param['builtin']:
         if ((restart > len(rhs)) or (restart == None)):
             restart = 2*len(rhs)
         print "# using builtin | restrt : ", restart
         x,info=sgmres(self.point,rhs,tol=tol,\
             restrt=restart,maxiter=maxiter,\
             callback=self.callback,xtype=None)
     else:
         x,info=self.gmres(rhs,tol=tol,restrt=restart,\
             maxiter=maxiter)
     if print_it == 'long':  
         print 'Convergence in GMRES!'
         plt.title('Final GMRES-residual')
         plt.plot(rhs-self.point.system.applyJacobian(x))        
         plt.show()
         print ' for vector '
         plt.plot(x)
         plt.title(r'$\delta_{final}$')
         plt.show()
     return (x,info)