Add common options to the benchmark interface
diff --git a/bench/spbench/spbenchsolver.cpp b/bench/spbench/spbenchsolver.cpp
index bcbe0d8..f7b68ec 100644
--- a/bench/spbench/spbenchsolver.cpp
+++ b/bench/spbench/spbenchsolver.cpp
@@ -16,6 +16,8 @@
     cout<< " -h or --help \n    print this help and return\n\n";
     cout<< " -d matrixdir \n    Use matrixdir as the matrix folder instead of the one specified in the environment variable EIGEN_MATRIXDIR\n\n"; 
     cout<< " -o outputfile.html \n    Output the statistics to a html file \n\n";
+    cout<< " --eps <RelErr> Sets the relative tolerance for iterative solvers (default 1e-08)
+    cout<< " --maxits <MaxIts> Sets the maximum number of iterations (default 1000) 
     
 }
 int main(int argc, char ** args)
@@ -56,14 +58,23 @@
       std::cerr << "Unable to open the provided file for writting... \n";
   }       
   
+  // Get the maximum number of iterations and the tolerance
+  int maxiters = 1000; 
+  double tol = 1e-08; 
+  string inval; 
+  if (get_options(argc, args, "--eps", &inval))
+    tol = atof(inval.c_str()); 
+  if(get_options(argc, args, "--maxits", &inval))
+    maxiters = atoi(inval.c_str()); 
+  
   string current_dir; 
   // Test the matrices in %EIGEN_MATRIXDIR/real
   current_dir = matrix_dir + "/real"; 
-  Browse_Matrices<double>(current_dir, statFileExists, statFile);
+  Browse_Matrices<double>(current_dir, statFileExists, statFile,maxiters, tol);
   
   // Test the matrices in %EIGEN_MATRIXDIR/complex
   current_dir = matrix_dir + "/complex"; 
-  Browse_Matrices<std::complex<double> >(current_dir, statFileExists, statFile); 
+  Browse_Matrices<std::complex<double> >(current_dir, statFileExists, statFile, maxiters, tol); 
   
   if(statFileExists)
   {
diff --git a/bench/spbench/spbenchsolver.h b/bench/spbench/spbenchsolver.h
index 3f50de1..6d765a9 100644
--- a/bench/spbench/spbenchsolver.h
+++ b/bench/spbench/spbenchsolver.h
@@ -94,6 +94,10 @@
   int isIterative;
 }; 
 
+// Global variables for input parameters
+int MaximumIters; // Maximum number of iterations
+double RelErr; // Relative error of the computed solution
+
 template<typename T> inline typename NumTraits<T>::Real test_precision() { return NumTraits<T>::dummy_precision(); }
 template<> inline float test_precision<float>() { return 1e-3f; }                                                             
 template<> inline double test_precision<double>() { return 1e-6; }                                                            
@@ -175,7 +179,7 @@
     temp = A * x; 
     stat.rel_error = (b-temp).norm()/b.norm();
   }
-  if ( stat.rel_error > test_precision<Scalar>() )
+  if ( stat.rel_error > RelErr )
   {
     stat.info = NoConvergence; 
     return stat;
@@ -199,7 +203,9 @@
 Stats call_itersolver(Solver &solver, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX)
 {
   Stats stat;
-  solver.setTolerance(1e-10); 
+  solver.setTolerance(RelErr); 
+  solver.setMaxIterations(MaximumIters);
+  
   stat = call_solver(solver, A, b, refX); 
   stat.iterations = solver.iterations();
   return stat; 
@@ -375,8 +381,8 @@
     printStatItem(stat, EIGEN_GMRES_ILUT, best_time_id, best_time_val); 
   }
   
-  // Symmetric and not necessarily positive-definites
-  if ( (sym == Symmetric) || (sym == SPD) )
+  // Hermitian and not necessarily positive-definites
+  if (sym != NonSymmetric)
   {
     // Internal Cholesky
     {
@@ -494,8 +500,10 @@
  * and optionally in the provided html file
  */
 template <typename Scalar>
-void Browse_Matrices(const string folder, bool statFileExists, std::string& statFile)
+void Browse_Matrices(const string folder, bool statFileExists, std::string& statFile, int maxiters, double tol)
 {
+  MaximumIters = maxiters; // Maximum number of iterations, global variable 
+  RelErr = tol;  //Relative residual error  as stopping criterion for iterative solvers
   MatrixMarketIterator<Scalar> it(folder);
   Stats stat[EIGEN_ALL_SOLVERS];
   for ( ; it; ++it)