100 EPSConvergedReason reason;
111#ifdef __MPI_PARALLEL_MODE
112 MPI_Comm comm =
engngModel->giveParallelComm();
114 MPI_Comm comm = PETSC_COMM_SELF;
116 ierr = EPSCreate(comm, &
eps);
127 ierr = EPSSetProblemType(
eps, EPS_GHEP);
129 ierr = EPSGetST(
eps, & st);
131 ierr = STSetType(st, STSINVERT);
133 ierr = STSetMatStructure(st, SAME_NONZERO_PATTERN);
135 ierr = EPSSetTolerances(
eps, ( PetscReal ) rtol, PETSC_DECIDE);
137 ierr = EPSSetDimensions(
eps, ( PetscInt ) nroot, PETSC_DECIDE, PETSC_DECIDE);
139 ierr = EPSSetWhichEigenpairs(
eps, EPS_SMALLEST_MAGNITUDE);
146 ierr = EPSSetFromOptions(
eps);
153 ierr = EPSSolve(
eps);
156 ierr = EPSGetConvergedReason(
eps, & reason);
158 ierr = EPSGetIterationNumber(
eps, & nite);
160 OOFEM_LOG_INFO(
"SLEPcSolver::solve EPSConvergedReason: %d, number of iterations: %d\n", reason, nite);
162 ierr = EPSGetConverged(
eps, & nconv);
166 OOFEM_LOG_INFO(
"SLEPcSolver :: solveYourselfAt: Convergence reached for RTOL=%20.15f", rtol);
170 ierr = MatGetVecs(* B->
giveMtrx(), PETSC_NULL, & Vr);
175 for (
int i = 0; i < nconv && i < nroot; i++ ) {
176 ierr = EPSGetEigenpair(
eps, i, & kr, PETSC_NULL, Vr, PETSC_NULL);
180 _eigv.
at(i + 1) = kr;
184 for (
int j = 0; j < size; j++ ) {
185 _r.
at(j + 1, i + 1) = Vr_loc.
at(j + 1);
189 ierr = VecDestroy(& Vr);