std::pair<unsigned int, unsigned int> SlepcEigenSolver<T>::solve_generalized (SparseMatrix<T> & matrix_A_in, SparseMatrix<T> & matrix_B_in, int nev, // number of requested eigenpairs int ncv, // number of basis vectors const double tol, // solver tolerance const unsigned int m_its) // maximum number of iterations { this->init (); // Make sure the data passed in are really of Petsc types PetscMatrix<T> * matrix_A = dynamic_cast<PetscMatrix<T> *>(&matrix_A_in); PetscMatrix<T> * matrix_B = dynamic_cast<PetscMatrix<T> *>(&matrix_B_in); if (!matrix_A || !matrix_B) libmesh_error_msg("Error: inputs to solve_generalized() must be of type PetscMatrix."); // Close the matrix and vectors in case this wasn't already done. if (this->_close_matrix_before_solve) { matrix_A->close (); matrix_B->close (); } return _solve_generalized_helper (matrix_A->mat(), matrix_B->mat(), nev, ncv, tol, m_its); }
std::pair<unsigned int, unsigned int> SlepcEigenSolver<T>::solve_generalized (ShellMatrix<T> &shell_matrix_A, ShellMatrix<T> &shell_matrix_B, int nev, // number of requested eigenpairs int ncv, // number of basis vectors const double tol, // solver tolerance const unsigned int m_its) // maximum number of iterations { this->init (); PetscErrorCode ierr=0; // Prepare the matrix. Mat mat_A; ierr = MatCreateShell(this->comm().get(), shell_matrix_A.m(), // Specify the number of local rows shell_matrix_A.n(), // Specify the number of local columns PETSC_DETERMINE, PETSC_DETERMINE, const_cast<void*>(static_cast<const void*>(&shell_matrix_A)), &mat_A); LIBMESH_CHKERRABORT(ierr); Mat mat_B; ierr = MatCreateShell(this->comm().get(), shell_matrix_B.m(), // Specify the number of local rows shell_matrix_B.n(), // Specify the number of local columns PETSC_DETERMINE, PETSC_DETERMINE, const_cast<void*>(static_cast<const void*>(&shell_matrix_B)), &mat_B); LIBMESH_CHKERRABORT(ierr); /* Note that the const_cast above is only necessary because PETSc does not accept a const void*. Inside the member function _petsc_shell_matrix() below, the pointer is casted back to a const ShellMatrix<T>*. */ ierr = MatShellSetOperation(mat_A,MATOP_MULT,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_mult)); LIBMESH_CHKERRABORT(ierr); ierr = MatShellSetOperation(mat_A,MATOP_GET_DIAGONAL,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_get_diagonal)); LIBMESH_CHKERRABORT(ierr); ierr = MatShellSetOperation(mat_B,MATOP_MULT,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_mult)); LIBMESH_CHKERRABORT(ierr); ierr = MatShellSetOperation(mat_B,MATOP_GET_DIAGONAL,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_get_diagonal)); LIBMESH_CHKERRABORT(ierr); return _solve_generalized_helper (mat_A, mat_B, nev, ncv, tol, m_its); }
std::pair<unsigned int, unsigned int> SlepcEigenSolver<T>::solve_generalized (SparseMatrix<T> & matrix_A_in, ShellMatrix<T> & shell_matrix_B, int nev, // number of requested eigenpairs int ncv, // number of basis vectors const double tol, // solver tolerance const unsigned int m_its) // maximum number of iterations { this->init (); PetscErrorCode ierr=0; PetscMatrix<T> * matrix_A = dynamic_cast<PetscMatrix<T> *>(&matrix_A_in); if (!matrix_A) libmesh_error_msg("Error: inputs to solve_generalized() must be of type PetscMatrix."); // Close the matrix and vectors in case this wasn't already done. if (this->_close_matrix_before_solve) matrix_A->close (); // Prepare the matrix. Note that the const_cast is only necessary // because PETSc does not accept a const void *. Inside the member // function _petsc_shell_matrix() below, the pointer is casted back // to a const ShellMatrix<T> *. Mat mat_B; ierr = MatCreateShell(this->comm().get(), shell_matrix_B.m(), // Specify the number of local rows shell_matrix_B.n(), // Specify the number of local columns PETSC_DETERMINE, PETSC_DETERMINE, const_cast<void *>(static_cast<const void *>(&shell_matrix_B)), &mat_B); LIBMESH_CHKERR(ierr); ierr = MatShellSetOperation(mat_B,MATOP_MULT,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_mult)); LIBMESH_CHKERR(ierr); ierr = MatShellSetOperation(mat_B,MATOP_GET_DIAGONAL,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_get_diagonal)); LIBMESH_CHKERR(ierr); return _solve_generalized_helper (matrix_A->mat(), mat_B, nev, ncv, tol, m_its); }
std::pair<unsigned int, unsigned int> SlepcEigenSolver<T>::solve_generalized (SparseMatrix<T> &matrix_A_in, SparseMatrix<T> &matrix_B_in, int nev, // number of requested eigenpairs int ncv, // number of basis vectors const double tol, // solver tolerance const unsigned int m_its) // maximum number of iterations { this->init (); // Make sure the data passed in are really of Petsc types PetscMatrix<T>* matrix_A = libmesh_cast_ptr<PetscMatrix<T>*>(&matrix_A_in); PetscMatrix<T>* matrix_B = libmesh_cast_ptr<PetscMatrix<T>*>(&matrix_B_in); // Close the matrix and vectors in case this wasn't already done. matrix_A->close (); matrix_B->close (); return _solve_generalized_helper (matrix_A->mat(), matrix_B->mat(), nev, ncv, tol, m_its); }
std::pair<unsigned int, unsigned int> SlepcEigenSolver<T>::solve_generalized (SparseMatrix<T> &matrix_A_in, ShellMatrix<T> &shell_matrix_B, int nev, // number of requested eigenpairs int ncv, // number of basis vectors const double tol, // solver tolerance const unsigned int m_its) // maximum number of iterations { this->init (); int ierr=0; PetscMatrix<T>* matrix_A = libmesh_cast_ptr<PetscMatrix<T>*>(&matrix_A_in); // Close the matrix and vectors in case this wasn't already done. matrix_A->close (); // Prepare the matrix. Mat mat_B; ierr = MatCreateShell(libMesh::COMM_WORLD, shell_matrix_B.m(), // Specify the number of local rows shell_matrix_B.n(), // Specify the number of local columns PETSC_DETERMINE, PETSC_DETERMINE, const_cast<void*>(static_cast<const void*>(&shell_matrix_B)), &mat_B); /* Note that the const_cast above is only necessary because PETSc does not accept a const void*. Inside the member function _petsc_shell_matrix() below, the pointer is casted back to a const ShellMatrix<T>*. */ CHKERRABORT(libMesh::COMM_WORLD,ierr); ierr = MatShellSetOperation(mat_B,MATOP_MULT,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_mult)); ierr = MatShellSetOperation(mat_B,MATOP_GET_DIAGONAL,reinterpret_cast<void(*)(void)>(_petsc_shell_matrix_get_diagonal)); CHKERRABORT(libMesh::COMM_WORLD,ierr); return _solve_generalized_helper (matrix_A->mat(), mat_B, nev, ncv, tol, m_its); }