};
/**
- * An implementation of the solver interface using the SLEPc Lanczos
+ * An implementation of the solver interface using the SLEPc Power
* solver. Usage: Largest values of spectrum only, all problem types,
* complex.
*
};
+#if DEAL_II_PETSC_VERSION_GTE(3,1,0)
+/**
+ * An implementation of the solver interface using the SLEPc Davidson
+ * solver. Usage (incomplete/untested): All problem types.
+ *
+ * @ingroup SLEPcWrappers
+ * @author Toby D. Young 2010
+ */
+ class SolverDavidson : public SolverBase
+ {
+ public:
+ /**
+ * Standardized data struct to pipe
+ * additional data to the solver,
+ * should it be needed.
+ */
+ struct AdditionalData
+ {};
+
+ /**
+ * SLEPc solvers will want to have
+ * an MPI communicator context over
+ * which computations are
+ * parallelized. By default, this
+ * carries the same behaviour has
+ * the PETScWrappers, but you can
+ * change that.
+ */
+ SolverDavidson (SolverControl &cn,
+ const MPI_Comm &mpi_communicator = PETSC_COMM_WORLD,
+ const AdditionalData &data = AdditionalData());
+
+ protected:
+
+ /**
+ * Store a copy of the flags for
+ * this particular solver.
+ */
+ const AdditionalData additional_data;
+
+ /**
+ * Function that takes a Eigenvalue
+ * Problem Solver context object,
+ * and sets the type of solver that
+ * is appropriate for this class.
+ */
+ virtual void set_solver_type (EPS &eps) const;
+
+ };
+#endif
// --------------------------- inline and template functions -----------
/**
{
unsigned int n_converged;
- set_matrices (A,B);
+ set_matrices (A, B);
solve (n_eigenvectors, &n_converged);
if (n_converged >= n_eigenvectors)
}
/* ---------------------- SolverKrylovSchur ------------------------ */
+
SolverKrylovSchur::SolverKrylovSchur (SolverControl &cn,
const MPI_Comm &mpi_communicator,
const AdditionalData &data)
}
/* ---------------------- SolverArnoldi ------------------------ */
+
SolverArnoldi::SolverArnoldi (SolverControl &cn,
const MPI_Comm &mpi_communicator,
const AdditionalData &data)
AssertThrow (ierr == 0, ExcSLEPcError(ierr));
}
+ /* ---------------------- Davidson ----------------------- */
+
+#if DEAL_II_PETSC_VERSION_LT(3,1,0)
+ SolverDavidson::SolverDavidson (SolverControl &cn,
+ const MPI_Comm &mpi_communicator,
+ const AdditionalData &data)
+ :
+ SolverBase (cn, mpi_communicator),
+ additional_data (data)
+ {}
+
+ void
+ SolverDavidson::set_solver_type (EPS &eps) const
+ {
+ int ierr;
+ ierr = EPSSetType (eps, const_cast<char *>(EPSDAVIDSON));
+ AssertThrow (ierr == 0, ExcSLEPcError(ierr));
+
+ // hand over the absolute
+ // tolerance and the maximum
+ // number of iteration steps to
+ // the SLEPc convergence
+ // criterion.
+ ierr = EPSSetTolerances(eps, this->solver_control.tolerance(),
+ this->solver_control.max_steps());
+ AssertThrow (ierr == 0, ExcSLEPcError(ierr));
+ }
+#endif
+
}
DEAL_II_NAMESPACE_CLOSE