void SlepcEigenSolver<T>::attach_deflation_space(NumericVector<T>& deflation_vector_in) { this->init(); int ierr = 0; Vec deflation_vector = (libmesh_cast_ptr<PetscVector<T>*>(&deflation_vector_in))->vec(); Vec* deflation_space = &deflation_vector; #if SLEPC_VERSION_LESS_THAN(3,1,0) ierr = EPSAttachDeflationSpace(_eps, 1, deflation_space, PETSC_FALSE); #else ierr = EPSSetDeflationSpace(_eps, 1, deflation_space); #endif LIBMESH_CHKERRABORT(ierr); }
void SlepcEigenSolver<T>::attach_deflation_space(NumericVector<T> & deflation_vector_in) { this->init(); PetscErrorCode ierr = 0; // Make sure the input vector is actually a PetscVector PetscVector<T> * deflation_vector_petsc_vec = dynamic_cast<PetscVector<T> *>(&deflation_vector_in); if (!deflation_vector_petsc_vec) libmesh_error_msg("Error attaching deflation space: input vector must be a PetscVector."); // Get a handle for the underlying Vec. Vec deflation_vector = deflation_vector_petsc_vec->vec(); #if SLEPC_VERSION_LESS_THAN(3,1,0) ierr = EPSAttachDeflationSpace(_eps, 1, &deflation_vector, PETSC_FALSE); #else ierr = EPSSetDeflationSpace(_eps, 1, &deflation_vector); #endif LIBMESH_CHKERR(ierr); }