From b6ede4621232aa57cb6c9588db961974852942d9 Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Mon, 9 Nov 2015 15:11:15 +0100 Subject: [PATCH] add set_initial_space() to SLEPc solvers --- include/deal.II/lac/slepc_solver.h | 25 ++++++++++++++++++++++--- source/lac/slepc_solver.cc | 11 +++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/include/deal.II/lac/slepc_solver.h b/include/deal.II/lac/slepc_solver.h index 6fac9094b4..0e6770a79f 100644 --- a/include/deal.II/lac/slepc_solver.h +++ b/include/deal.II/lac/slepc_solver.h @@ -186,7 +186,15 @@ namespace SLEPcWrappers */ void set_initial_vector - (const PETScWrappers::VectorBase &this_initial_vector); + (const PETScWrappers::VectorBase &this_initial_vector) DEAL_II_DEPRECATED; + + /** + * Set the initial vector space for the solver. + */ + template + void + set_initial_space + (const std::vector &initial_vectors); /** * Set the spectral transformation to be used. @@ -361,9 +369,9 @@ namespace SLEPcWrappers const PETScWrappers::MatrixBase *opB; /** - * An initial vector used to "feed" some SLEPc solvers. + * An initial vector space used in SLEPc solvers. */ - const PETScWrappers::VectorBase *initial_vector; + std::vector initial_vectors; /** * Pointer to an an object that describes transformations that can be @@ -844,6 +852,17 @@ namespace SLEPcWrappers real_eigenvectors[index], imag_eigenvectors[index]); } + template + void + SolverBase::set_initial_space(const std::vector &vectors) + { + initial_vectors.resize(vectors.size()); + for (unsigned int i = 0; i < initial_vectors.size(); i++) + { + initial_vectors[i] = vectors[i]; + } + } + } DEAL_II_NAMESPACE_CLOSE diff --git a/source/lac/slepc_solver.cc b/source/lac/slepc_solver.cc index 3953ab2bad..c442b18055 100644 --- a/source/lac/slepc_solver.cc +++ b/source/lac/slepc_solver.cc @@ -53,7 +53,6 @@ namespace SLEPcWrappers set_problem (EPS_GNHEP), opA (NULL), opB (NULL), - initial_vector (NULL), transformation (NULL) {} @@ -80,7 +79,8 @@ namespace SLEPcWrappers void SolverBase::set_initial_vector (const PETScWrappers::VectorBase &this_initial_vector) { - initial_vector = (&this_initial_vector); + initial_vectors.resize(1); + initial_vectors[0] = this_initial_vector; } void @@ -140,14 +140,13 @@ namespace SLEPcWrappers AssertThrow (ierr == 0, ExcSLEPcError(ierr)); // set the initial vector(s) if any - if (initial_vector && initial_vector->size() != 0) + if (initial_vectors.size() != 0) { #if DEAL_II_PETSC_VERSION_LT(3,1,0) - ierr = EPSSetInitialVector (solver_data->eps, *initial_vector); + ierr = EPSSetInitialVector (solver_data->eps, &initial_vectors[0]); #else - Vec this_vector = *initial_vector; - ierr = EPSSetInitialSpace (solver_data->eps, 1, &this_vector); + ierr = EPSSetInitialSpace (solver_data->eps, initial_vectors.size(), &initial_vectors[0]); #endif AssertThrow (ierr == 0, ExcSLEPcError(ierr)); -- 2.39.5