The attached code reproduces the error on my system.
Best,
Peder
________________________________
Fra: Peder Jørgensgaard Olesen <[email protected]>
Sendt: 18. januar 2024 21:06
Til: Jose E. Roman <[email protected]>
Cc: [email protected] <[email protected]>
Emne: Sv: [petsc-users] ScaLAPACK EPS error
I set up the matrix using MatCreateDense(), passing PETSC_DECIDE for the local
dimensions.
The same error appears with 8, 12, and 16 nodes (32 proc/node).
I'll have to get back to you regarding a minimal example.
Best,
Peder
________________________________
Fra: Jose E. Roman <[email protected]>
Sendt: 18. januar 2024 19:28
Til: Peder Jørgensgaard Olesen <[email protected]>
Cc: [email protected] <[email protected]>
Emne: Re: [petsc-users] ScaLAPACK EPS error
How are you setting up your input matrix? Are you giving the local sizes or
setting them to PETSC_DECIDE?
Do you get the same error for different number of MPI processes?
Can you send a small code reproducing the error?
Jose
> El 18 ene 2024, a las 18:59, Peder Jørgensgaard Olesen via petsc-users
> <[email protected]> escribió:
>
> Hello,
>
> I need to determine the full set of eigenpairs to a rather large (N=16,000)
> dense Hermitian matrix. I've managed to do this using SLEPc's standard
> Krylov-Schur EPS, but I think it could be done more efficiently using
> ScaLAPACK. I receive the following error when attempting this. As I
> understand it, descinit is used to initialize an array, and the variable in
> question designates the leading dimension of the array, for which it seems an
> illegal value is somehow passed.
>
> I know ScaLAPACK is an external package, but it seems as if the error would
> be in the call from SLEPc. Any ideas as to what could cause this?
>
> Thanks,
> Peder
>
> Error message (excerpt):
>
> PETSC ERROR: #1 MatConvert_Dense_ScaLAPACK() at [...]/matscalapack.c:1032
> PETSC ERROR: #2 MatConvert at [...]/matrix.c:4250
> PETSC ERROR: #3 EPSSetUp_ScaLAPACK() at [...]/scalapack.c:47
> PETSC ERROR: #4 EPSSetUp() at [...]/epssetup.c:323
> PETSC ERROR: #5 EPSSolve at [...]/epssolve.c:134
> PETSC ERROR: ------ Error message ------
> PETSC ERROR: Error in external library
> PETSC ERROR: Error in ScaLAPACK subroutine descinit: info=-9
> (...)
>
> Log file (excerpt):
> { 357, 0}: On entry to DESCINIT parameter number 9 had an illegal value
> [and a few hundred lines similar to this]
#include <stdio.h>
#include <stdlib.h>
#include <slepceps.h>
// Minimal example for EPS using ScaLAPACK
int main(int argc, char** argv){
PetscInt N = 16000, nconv, i;
Mat mat;
EPS eps;
PetscScalar eval_r;
PetscCall(SlepcInitialize(&argc, &argv, NULL, NULL));
// Generate random matrix
PetscCall(MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, N, N,
NULL, &mat));
PetscCall(MatSetRandom(mat, NULL));
// Set up and run EPS
PetscCall(EPSCreate(PETSC_COMM_WORLD, &eps));
PetscCall(EPSSetOperators(eps, mat, NULL));
PetscCall(EPSSetType(eps, EPSSCALAPACK));
PetscCall(EPSSetProblemType(eps, EPS_HEP));
PetscCall(EPSSetWhichEigenpairs(eps, EPS_ALL));
PetscCall(EPSSolve(eps));
PetscCall(EPSGetConverged(eps, &nconv));
PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%d eigenpairs converged\n", nconv));
PetscCall(MatDestroy(&mat));
// Report a few eigenvalues
for (i = 0; i < 5; i++){
PetscCall(EPSGetEigenvalue(eps, i, &eval_r, NULL));
PetscCall(PetscPrintf(PETSC_COMM_WORLD, "lamda_%d = %e + %ei\n", i,
eval_r));
}
PetscCall(EPSDestroy(&eps));
PetscCall(SlepcFinalize());
return(0);
}