> El 29 mar 2021, a las 11:59, dazza simplythebest <[email protected]>
> escribió:
>
> Dear Jose,
> Many thanks for your reply, it enabled me to solve the
> problem I described below.
> In particular, I recompiled PETSC and SLEPC with MUMPS and SCALAPACK included
> (by including the following lines in the configuration file:
> '--download-mumps',
> '--download-scalapack',
> '--download-cmake',
> )
> and then the program (unchanged from the previous attempt) then both compiled
> and ran straightaway with no hanging. Just in case someone is following this
> example later,
> the correct eigenvalues are (I have checked them against an independent
> lapack zggev code):
> 0 (15.7283987073479, 79.3812583009335)
> 1 (10.3657189951037, 65.4935496512632)
> 2 (20.2726807729152, 60.7235264113338)
> 3 (15.8693370278539, 54.4403170495817)
> 4 (8.93270390707530, 42.0676105026967)
> 5 (18.0161334989426, 31.7976217614629)
> 6 (16.2219350827311, 26.7999463239364)
> 7 (6.64653598248233, 19.2535093354505)
> 8 (7.23494239184217, 4.58606776802574)
> 9 (3.68158090200136, 1.65838104812904)
>
> The problem would then indeed appear to have been - exactly as you suggested
> -
> the fact that the generalised eigenvalue problem requires linear systems to be
> solved as part of the solution process, but in the previous attempt I was
> trying
> to solve an MPI-distributed system using a sequential solver.
>
> A couple of other quick points / queries:
> 1) By 'debug mode' you mean compiling the library with '--with-debugging=1'?
Yes.
> 2) Out of interest, I am wondering out of interest which LU solver was used -
> scalapack or
> MUMPS ? I could see both these libraries in the linking command, is there
> an easy way
> to find out which solver was actually called ?
MUMPS (which uses ScaLAPACK internally). Run with -eps_view and you will see
the details of the solver being used.
> 2) One slightly strange thing is that I also compiled the library with
> '--with-64-bit-indices=1'
> for 64-bit memory addressing, but I noticed in the compilation commands
> generated
> by the make command there is no '-i8' flag, which is used with mpiifort to
> request 64 bit
> integers. Is it the case that this is not required since everything is
> somehow taken care of by
> Petsc custom data type ( PetscInt) ? As an experiment I tried manually
> inserting the -i8
> and got a few errors like:
> /data/work/rotplane/omega_to_zero/stability/test/tmp10/tmp3/write_and_solve8.F(38):
> warning #6075: The data type of the actual argument does not match the
> definition. [PETSC_COMM_WORLD]
> call MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr);if (ierr .ne. 0) th
If you use PetscInt throughout your code, then no -i8 flag is required. Note
that the argument of MPI functions should be PetscMPIInt, not PetscInt.
Jose
>
>
> A big thank you once again,
> Best wishes,
> Dan.
>
> From: Jose E. Roman <[email protected]>
> Sent: Sunday, March 28, 2021 4:42 PM
> To: dazza simplythebest <[email protected]>
> Cc: PETSc users list <[email protected]>
> Subject: Re: [petsc-users] Newbie question: Something is wrong with this
> Slepc simple example for generalised eigenvalue problem
>
> You should run in debug mode until you get a correct code, otherwise you may
> no see some error messages. Also, it is recommended to add error checking
> after every call to PETSc, otherwise the execution continues and may get
> blocked. See the CHKERRA macro in
> https://slepc.upv.es/documentation/current/src/eps/tutorials/ex1f90.F90.html
>
> The problem you are probably having is that you are running with several MPI
> processes, so you need a parallel LU solver. See FAQ #10
> https://slepc.upv.es/documentation/faq.htm
>
> Jose
>
>
> > El 28 mar 2021, a las 11:25, dazza simplythebest <[email protected]>
> > escribió:
> >
> > Dear All,
> > I am seeking to use slepc/petsc to solve a generalised
> > eigenvalue problem
> > that arises in a hydrodynamic stability problem. The code is a
> > parallelisation of an existing
> > serial Fortran code. Before I get to grips with this target problem, I
> > would of course like to get
> > some relevant examples working. I have installed petsc/ slepc seemingly
> > without any problem,
> > and the provided slepc example fortran program ex1f.F, which solves a
> > regular eigenvalue
> > problem Ax = lambda x, seemed to compile and run correctly.
> > I have now written a short program to instead solve the complex generalised
> > problem Ax = lambda B x (see below) . This code compiles and runs w/out
> > errors but
> > for some reason hangs when calling EPSSolve - we enter EPSSolve but never
> > leave.
> > The matrices appear to be correctly assembled -all the values are correct
> > in the Matview
> > printout, so I am not quite sure where I have gone wrong, can anyone spot
> > my mistake?
> > ( Note that for the actual problem I wish to solve I have already written
> > the code to construct the matrix,
> > which distributes the rows across the processes and it is fully tested and
> > working. Hence I want to specify
> > the distribution of rows and not leave it up to a PETS_DECIDE .)
> > I would be very grateful if someone can point out what is wrong with this
> > small example code (see below),
> > Many thanks,
> > Dan.
> >
> > ! this program MUST be run with NGLOBAL = 10, MY_NO_ROWS = 5
> > ! and two MPI processes since row distribution is hard-baked into code
> > !
> > program main
> > #include <slepc/finclude/slepceps.h>
> > use slepceps
> > implicit none
> >
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > ! Declarations
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > !
> > ! Variables:
> > ! A , B double complex operator matrices
> > ! eps eigenproblem solver context
> >
> > Mat A,B
> > EPS eps
> > EPSType tname
> > PetscReal tol, error
> > PetscScalar kr, ki
> > Vec xr, xi
> > PetscInt NGLOBAL , MY_NO_ROWS, NL3, owner
> > PetscInt nev, maxit, its, nconv
> > PetscInt i,j,ic,jc
> > PetscReal reala, imaga, realb, imagb, di, dj
> > PetscScalar a_entry, b_entry
> > PetscMPIInt rank
> > PetscErrorCode ierr
> > PetscInt,parameter :: zero = 0, one = 1, two = 2, three = 3
> >
> > PetscInt M1, N1, mm1, nn1
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > ! Beginning of program
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> >
> > call SlepcInitialize(PETSC_NULL_CHARACTER,ierr)
> > call MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)
> > ! make sure you set NGLOBAL = 10, MY_NO_ROWS = 5 and run with two
> > processes
> > NGLOBAL = 10
> > MY_NO_ROWS = 5
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > ! Compute the operator matrices that define the eigensystem, Ax=kBx
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > !!!!!!!!! Setup A matrix
> >
> > call MatCreate(PETSC_COMM_WORLD,A,ierr)
> > call MatSetsizes(A,MY_NO_ROWS, MY_NO_ROWS ,NGLOBAL,NGLOBAL,ierr)
> > call MatSetFromOptions(A,ierr)
> > call MatGetSize(A,M1,N1,ierr)
> > write(*,*)'Rank [',rank,']: global size of A is ',M1, N1
> > call MatGetLocalSize(A,mm1,nn1,ierr)
> > write(*,*)'Rank [',rank,']: my local size of A is ',mm1, nn1
> > call MatMPIAIJSetPreallocation(A,three, PETSC_NULL_INTEGER,one, &
> > & PETSC_NULL_INTEGER,ierr) !parallel (MPI) allocation
> >
> > !!!!!!!!! Setup B matrix
> > call MatCreate(PETSC_COMM_WORLD,B,ierr)
> > call MatSetsizes(B,MY_NO_ROWS, MY_NO_ROWS ,NGLOBAL,NGLOBAL,ierr)
> > call MatSetFromOptions(B,ierr)
> > call MatGetSize(B,M1,N1,ierr)
> > write(*,*)'Rank [',rank,']: global size of B is ',M1, N1
> > call MatGetLocalSize(B,mm1,nn1,ierr)
> > write(*,*)'Rank [',rank,']: my local size of B is ',mm1, nn1
> >
> > call MatMPIAIJSetPreallocation(B,three, PETSC_NULL_INTEGER,one, &
> > & PETSC_NULL_INTEGER,ierr) !parallel (MPI) allocation
> >
> > ! initalise
> > call MatZeroEntries(A,ierr)
> > call MatZeroEntries(B,ierr)
> >
> > ! Fill in values of A, B and assemble matrices
> > ! Both matrices are tridiagonal with
> > ! Aij = cmplx( (i-j)**2, (i+j)**2)
> > ! Bij = cmplx( ij/i + j, (i/j)**2)
> > ! (numbering from 1 )
> >
> > do i = 1, NGLOBAL
> > ! a rather crude way to distribute rows
> > if (i < 6) owner = 0
> > if (i >= 6) owner = 1
> > if (rank /= owner) cycle
> > do j = 1, NGLOBAL
> > if ( abs(i-j) < 2 ) then
> > write(*,*)rank,' : Setting ',i,j
> > di = dble(i) ; dj = dble(j)
> >
> > reala = (di - dj)**2 ; imaga = (di + dj)**2
> > a_entry = dcmplx(reala, imaga)
> > realb = (di*dj)/(di + dj) ; imagb = di**2/dj**2
> > b_entry = dcmplx(realb, imagb)
> >
> > ic = i -1 ; jc = j-1 ! convert to C indexing
> > call MatSetValue(A, ic, jc, a_entry, ADD_VALUES,ierr)
> > call MatSetValue(B, ic, jc, b_entry, ADD_VALUES,ierr)
> > endif
> > enddo
> > enddo
> >
> > call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
> > call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)
> > call MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY,ierr)
> > call MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY,ierr)
> >
> > ! Check matrices
> > write(*,*)'A matrix ... '
> > call MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr)
> > write(*,*)'B matrix ... '
> > call MatView(B,PETSC_VIEWER_STDOUT_WORLD,ierr)
> >
> > call MatCreateVecs(A,PETSC_NULL_VEC,xr)
> > call MatCreateVecs(A, PETSC_NULL_VEC,xi)
> >
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > ! Create the eigensolver and display info
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > ! ** Create eigensolver context
> > call EPSCreate(PETSC_COMM_WORLD,eps,ierr)
> >
> > ! ** Set operators.for general problem Ax = lambda B x
> > call EPSSetOperators(eps,A, B, ierr)
> > call EPSSetProblemType(eps,EPS_GNHEP,ierr)
> >
> > ! ** Set solver parameters at runtime
> > call EPSSetFromOptions(eps,ierr)
> >
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > ! Solve the eigensystem
> > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> >
> > write(*,*)'rank',rank, 'entering solver ...'
> > call EPSSolve(eps,ierr)
> >
> > ! ** Free work space
> > call EPSDestroy(eps,ierr)
> > call MatDestroy(A,ierr)
> > call MatDestroy(B,ierr)
> >
> > call VecDestroy(xr,ierr)
> > call VecDestroy(xi,ierr)
> >
> > call SlepcFinalize(ierr)
> > end