Dear Jose,
Many thanks for the guidance. I haven't yet extensively tested the
program, but I will cautiously
claim that it seems to be working
on the small test problem described below (i.e. a small modification of your
ex1f.F program). I am currently
using version 3.20, but I will upgrade to 3.22 when it comes out.
For the Laplace problem with n=50 , using the gd method and seeking to find the
two leading eigenmodes (nev=2)
using a space of dimension ncv = 30, with default tolerance, on the first
solution
(using a randomized initial subspace) the algorithm requires 91 iterations to
converge,
whereas for the second solution (using the previous solution invariant
subspace as an initial subspace)
it finds the solution in 2 iterations.
Many thanks once again and best wishes,
Dan.
>The Fortran interface is not fully tested. In particular, this function is not
>employed in any of the Fortran examples.
>The Fortran interface has undergone successive improvements in recent times. I
>have tried the following:
> Vec, pointer :: subspace_receive(:)
> ...
> PetscCall(EPSGetConverged(eps, nconv, ierr))
> PetscCall(MatCreateVecs(A, PETSC_NULL_VEC, xr, ierr))
> PetscCall(VecDuplicateVecsF90(xr, nconv, subspace_receive, ierr))
> PetscCall(EPSGetInvariantSubspace(eps, subspace_receive, ierr))
> ...
> PetscCall(VecDestroyVecsF90(nconv, subspace_receive, ierr))
> PetscCall(VecDestroy(xr, ierr))
>I have tested this in the 'main' branch and it works as expected (note that
>'main' will become version 3.22 in two weeks). You can try with version 3.21
>and it may work, > probably not in older versions.
* Jose
> El 16 sept 2024, a las 11:07, dazza simplythebest <[email protected]>
> escribió:
>
> Dear All and Jose,
> I am now trying to code up the extraction of the
> invariant subspace, but I seem to be running into
> a compilation problem. I am using the slepc example file ex1f.F as a base,
> and have added the following lines:
>
> !Declaration
> Vec subspace_receive
> .
> .
> .
> ! Executed code (following EPSSolve)
> call EPSGetConverged(eps,nconv,ierr); CHKERRA(ierr)
> call VecDuplicateVecs(xr, nconv, subspace_receive, ierr); CHKERRA(ierr)
> call EPSGetInvariantSubspace(eps, subspace_receive, ierr) ;
> CHKERRA(ierr).
> .
> .
>
> However, I get the following compilation error when I include the call
> EPSGetInvariantSubspace(eps, subspace_receive, ierr) line:
>
>
> minitest.F(133): error #8284: If the actual argument is scalar, the dummy
> argument shall be scalar unless the actual argument is of type character or
> is an element of an array that is not assumed shape, pointer, or polymorphic.
> [B]
> call EPSGetInvariantSubspace(eps, subspace_receive, ierr) ; if (ierr
> .ne. 0) then;call PetscErrorF(ierr,133,"minitest.F");call
> MPIU_Abort(PETSC_COMM_SELF,ierr);endif
> -----------^
> compilation aborted for minitest.F (code 1)
>
>
> If I comment out the call EPSGetInvariantSubspace(eps, subspace_receive,
> ierr) line the code compiles, links and runs successfully.
> I presume that I must be making a silly mistake in the above lines, but I
> can't quite see what it is. (There is some discussion in the
> manual of there being a different situation if the matrix is real but the
> eigenvalues are complex, but for this case the eigenvalues
> are real). Can you offer any guidance ?! I can provide the whole code of
> course if that would help.
> Many thanks and best wishes,
> Dan.
>
>
>
>
>
> From: Jose E. Roman <[email protected]>
> Sent: Monday, September 2, 2024 7:06 AM
> To: dazza simplythebest <[email protected]>
> Cc: [email protected] <[email protected]>
> Subject: Re: [petsc-users] How to create an array of vectors of type Vec (for
> use with slepc EPSGetInvariantSubspace)
> You can use VecDuplicateVecs() to create an array of Vec.
> Yes, you can use VecLoad() to read the data from a binary file.
>
> Jose
>
>
> > El 2 sept 2024, a las 8:56, dazza simplythebest <[email protected]>
> > escribió:
> >
> > Dear All,
> > I am seeking to perform a large number of eigenvalue
> > calculations (related to a fluid dynamics
> > problem) using the slepc framework. I have written the program that calls
> > slepc and validated its solutions against
> > known results for special cases - the Jacobi-Davidson iteration seemed to
> > perform best on this problem.
> > Since in the 'production-level' calculation I will step through a
> > parameter space which should
> > mean only small changes to the eigenproblem between each calculation, it
> > seems to make sense
> > to use the previous solution as the initial guess for the next calculation.
> >
> > The sequence to execute this strategy would seem to be:
> > To write out the current soln subspace:
> >
> > call EPSGetInvariantSubspace
> > [ call VecView -> binary file (if a file storage is required for possible
> > restart)]
> >
> > To then read in this data to use it as the initial subspace for the next
> > run:
> >
> > call EPSSetInitialSpace
> >
> > My question is that EPSGetInvariantSubspace needs an 'array of nconv
> > vectors', how does one create
> > such an array ? My understanding is that the Vec structure is just a
> > one-dimensional array (with contents
> > possibly scattered in non-contiguous memory locations !?) , so do we just
> > need to create a long Vec
> > that stores multiple vectors ? How can we do this (the examples I have
> > seen thus far use a MatCreateVecs to specify the size
> > of the Vec)?
> >
> > If loading such a subspace from a binary file (created maybe by VecView),
> > presumably VecLoad is the
> > best way to load such an array of vectors from the binary file ?
> >
> > Best wishes and many thanks,
> > Dan.