From: Denis Davydov Date: Fri, 29 Sep 2017 16:01:14 +0000 (+0200) Subject: parpack: add additional solve() which takes eigenvectors as pointers X-Git-Tag: v9.0.0-rc1~1005^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=431fddcfe13e3a063258e12104a2ae3dc7930078;p=dealii.git parpack: add additional solve() which takes eigenvectors as pointers --- diff --git a/include/deal.II/lac/parpack_solver.h b/include/deal.II/lac/parpack_solver.h index 2a1789ec27..2cb2bbc652 100644 --- a/include/deal.II/lac/parpack_solver.h +++ b/include/deal.II/lac/parpack_solver.h @@ -338,6 +338,22 @@ public: std::vector &eigenvectors, const unsigned int n_eigenvalues); + /** + * Same as above but takes eigenvectors as pointers. + */ + template + void solve + (const MatrixType1 &A, + const MatrixType2 &B, + const INVERSE &inverse, + std::vector > &eigenvalues, + std::vector &eigenvectors, + const unsigned int n_eigenvalues); + + /** + * Return the memory consumption of this class in bytes. + */ std::size_t memory_consumption() const; protected: @@ -529,6 +545,8 @@ private: << " Arnoldi vectors."); }; + + template std::size_t PArpackSolver::memory_consumption() const @@ -546,6 +564,8 @@ PArpackSolver::memory_consumption() const MemoryConsumption::memory_consumption (types::global_dof_index()) * local_indices.size(); } + + template PArpackSolver::AdditionalData:: AdditionalData (const unsigned int number_of_arnoldi_vectors, @@ -574,6 +594,8 @@ AdditionalData (const unsigned int number_of_arnoldi_vectors, ExcMessage("Currently, only modes 1, 2 and 3 are supported.")); } + + template PArpackSolver::PArpackSolver (SolverControl &control, const MPI_Comm &mpi_communicator, @@ -594,6 +616,8 @@ PArpackSolver::PArpackSolver (SolverControl &control, sigmai(0.0) {} + + template void PArpackSolver::set_shift(const std::complex sigma) { @@ -601,6 +625,8 @@ void PArpackSolver::set_shift(const std::complex sigma) sigmai = sigma.imag(); } + + template void PArpackSolver:: set_initial_vector(const VectorType &vec) @@ -614,6 +640,7 @@ set_initial_vector(const VectorType &vec) } + template void PArpackSolver:: internal_reinit(const IndexSet &locally_owned_dofs) @@ -655,6 +682,8 @@ internal_reinit(const IndexSet &locally_owned_dofs) select.resize (ncv, 0); } + + template void PArpackSolver::reinit(const IndexSet &locally_owned_dofs) { @@ -666,6 +695,8 @@ void PArpackSolver::reinit(const IndexSet &locally_owned_dofs) tmp.reinit (locally_owned_dofs,mpi_communicator); } + + template void PArpackSolver::reinit(const VectorType &distributed_vector) { @@ -678,6 +709,7 @@ void PArpackSolver::reinit(const VectorType &distributed_vector) } + template void PArpackSolver::reinit(const IndexSet &locally_owned_dofs, const std::vector &partitioning) @@ -690,6 +722,26 @@ void PArpackSolver::reinit(const IndexSet &locally_owned_dofs, tmp.reinit (partitioning,mpi_communicator); } + + +template +template +void PArpackSolver::solve +(const MatrixType1 &A, + const MatrixType2 &B, + const INVERSE &inverse, + std::vector > &eigenvalues, + std::vector &eigenvectors, + const unsigned int n_eigenvalues) +{ + std::vector eigenvectors_ptr(eigenvectors.size()); + for (unsigned int i = 0; i < eigenvectors.size(); ++i) + eigenvectors_ptr[i] = &eigenvectors[i]; + solve(A,B,inverse,eigenvalues,eigenvectors_ptr,n_eigenvalues); +} + + + template template void PArpackSolver::solve @@ -697,7 +749,7 @@ void PArpackSolver::solve const MatrixType2 &mass_matrix, const INVERSE &inverse, std::vector > &eigenvalues, - std::vector &eigenvectors, + std::vector &eigenvectors, const unsigned int n_eigenvalues) { @@ -716,12 +768,12 @@ void PArpackSolver::solve // use eigenvectors to get the problem size so that it is possible to // employ LinearOperator for mass_matrix. - Assert (n_eigenvalues < eigenvectors[0].size(), - PArpackExcInvalidNumberofEigenvalues(n_eigenvalues, eigenvectors[0].size())); + Assert (n_eigenvalues < eigenvectors[0]->size(), + PArpackExcInvalidNumberofEigenvalues(n_eigenvalues, eigenvectors[0]->size())); - Assert (additional_data.number_of_arnoldi_vectors < eigenvectors[0].size(), + Assert (additional_data.number_of_arnoldi_vectors < eigenvectors[0]->size(), PArpackExcInvalidNumberofArnoldiVectors( - additional_data.number_of_arnoldi_vectors, eigenvectors[0].size())); + additional_data.number_of_arnoldi_vectors, eigenvectors[0]->size())); Assert (additional_data.number_of_arnoldi_vectors > 2*n_eigenvalues+1, PArpackExcSmallNumberofArnoldiVectors( @@ -969,13 +1021,13 @@ void PArpackSolver::solve for (int i=0; iadd (nloc, + &local_indices[0], + &v[i*nloc] ); + eigenvectors[i]->compress (VectorOperation::add); } for (size_type i=0; i::solve } + + template SolverControl &PArpackSolver::control () const {