[petsc-users] How to create an array of vectors of type Vec (for use with slepc EPSGetInvariantSubspace)
dazza simplythebest
sayosale at hotmail.com
Wed Sep 18 07:20:54 CDT 2024
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 <sayosale at hotmail.com> 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 <jroman at dsic.upv.es>
> Sent: Monday, September 2, 2024 7:06 AM
> To: dazza simplythebest <sayosale at hotmail.com>
> Cc: petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
> 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 <sayosale at hotmail.com> 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20240918/5eb5e1a9/attachment.html>
More information about the petsc-users
mailing list