Your formula
(R(q+epsilon*v) - R(q-epsilon*v))/(2*epsilon).
is not linear, it cannot be expressed as a constant matrix times a vector, A*v.

If you want to solve a nonlinear eigenvector problem
A(x)*x=lambda*x
then have a look at ex34.c 
https://slepc.upv.es/documentation/current/src/eps/tutorials/ex34.c.html

Jose


> El 25 ago 2022, a las 18:07, feng wang <snails...@hotmail.com> escribió:
> 
> Hi Jose,
> 
> Following my previous email, just some update,  the epsilon actually does not 
> change in my shell matrix to compute the finite difference Jacobian. I don't 
> have an iterative procedure in the shell matrix. It simply computes the 
> non-linear residuals twice with perturbed flow variables. I have attached my 
> code. Any suggestions are welcome.
> 
> Thanks,
> Feng
> From: Jose E. Roman <jro...@dsic.upv.es>
> Sent: 25 August 2022 9:45
> To: feng wang <snails...@hotmail.com>
> Cc: petsc-users <petsc-users@mcs.anl.gov>
> Subject: Re: [petsc-users] Slepc Question, shell-matrix
>  
> Probably the explanation is the following. Your shell matrix runs an 
> iterative procedure that computes the action of the matrix to a certain 
> accuracy. This is equivalent to multiplying by the exact matrix plus a 
> perturbation, A+E. But every time you apply the shell matrix, the 
> perturbation E is slightly different, so the eigensolver does not really see 
> a constant matrix, it changes at every iteration.
> 
> This also happens in nested iterations, such as inexact shift-and-invert, 
> where e.g. GMRES is run within each iteration of the eigensolver. For this to 
> work, the GMRES tolerance should be smaller than the tolerance of the 
> eigensolver. Similarly, if your shell matrix runs an iterative procedure, you 
> have to use a tolerance that is more stringent than the one used in the 
> eigensolver.
> 
> Hope this helps.
> Jose
> 
> 
> > El 25 ago 2022, a las 11:34, feng wang <snails...@hotmail.com> escribió:
> > 
> > Hi Jose,
> > 
> > Thanks for your reply. I have fixed one thing in my shell matrix. Now the 
> > conversion seems working.
> > 
> > If I use the converted dense matrix and give it to EPSSetOperators, it 
> > actually converges!
> > 
> >  50 EPS nconv=0 first unconverged value (error) 2.89521e-06+2.13473e-06i 
> > (7.73051721e-08)
> >  51 EPS nconv=0 first unconverged value (error) 2.89521e-06+2.13473e-06i 
> > (5.42681175e-08)
> >  52 EPS nconv=0 first unconverged value (error) 2.89521e-06+2.13473e-06i 
> > (2.48352708e-08)
> >  53 EPS nconv=0 first unconverged value (error) 2.89521e-06+2.13473e-06i 
> > (1.76912430e-08)
> >  54 EPS nconv=0 first unconverged value (error) 2.89521e-06+2.13473e-06i 
> > (2.07480734e-08)
> >  55 EPS nconv=0 first unconverged value (error) 2.89521e-06+2.13473e-06i 
> > (1.13588981e-08)
> >  56 EPS nconv=2 first unconverged value (error) 1.10143e-06+9.80005e-06i 
> > (8.32889697e-06)
> >  Solution method: krylovschur
> > 
> >  Number of requested eigenvalues: 1
> >  Linear eigensolve converged (2 eigenpairs) due to CONVERGED_TOL; 
> > iterations 56
> >  ---------------------- --------------------
> >             k             ||Ax-kx||/||kx||
> >  ---------------------- --------------------
> >    0.000003+0.000002i       7.90447e-09
> >    0.000003-0.000002i       7.90447e-09
> >  ---------------------- --------------------
> > 
> > If I use the shell matrix directly, the relative norm is still large. This 
> > really puzzles me...... 
> > 
> > Thanks,
> > Feng
> > 
> > From: Jose E. Roman <jro...@dsic.upv.es>
> > Sent: 25 August 2022 7:21
> > To: feng wang <snails...@hotmail.com>
> > Cc: petsc-users <petsc-users@mcs.anl.gov>
> > Subject: Re: [petsc-users] Slepc Question, shell-matrix
> >  
> > This works for simple examples such as ex9.c
> > It may be an indication that there is a problem with your shell matrix.
> > 
> > Jose
> > 
> > 
> > > El 24 ago 2022, a las 19:35, feng wang <snails...@hotmail.com> escribió:
> > > 
> > > Hi Jose,
> > > 
> > > Thanks for your reply.
> > > 
> > > I have tried 
> > > PetscCall(MatConvert(slepc_A_mf,MATDENSE,MAT_INITIAL_MATRIX,&Adense));  
> > > and If I do MatView(Adense,viewer), All I see was NAN. Have I missed 
> > > anything here?
> > > 
> > > Thanks,
> > > Feng
> > > 
> > > From: Jose E. Roman <jro...@dsic.upv.es>
> > > Sent: 24 August 2022 16:23
> > > To: feng wang <snails...@hotmail.com>
> > > Cc: petsc-users <petsc-users@mcs.anl.gov>
> > > Subject: Re: [petsc-users] Slepc Question, shell-matrix
> > >  
> > > 
> > > 
> > > > El 24 ago 2022, a las 17:03, feng wang <snails...@hotmail.com> escribió:
> > > > 
> > > > Hi Jose,
> > > > 
> > > > Thanks for your reply.
> > > > 
> > > > I have tried -eps_view_mat0 binary:amatrix.bin to save my shell matrix. 
> > > > It seems not saving the shell matrix and just created an empty file.
> > > 
> > > Oops, I thought the shell matrix would be converted automatically. Try 
> > > converting it yourself:
> > > 
> > > PetscCall(MatConvert(slepc_A_mf,MATDENSE,MAT_INITIAL_MATRIX,&Adense));
> > > 
> > > Then use Adense in EPSSetOperators(). Or save it to disk and send it to 
> > > me so that I can give it a try.
> > > 
> > > > 
> > > > Besides, I am trying to understand the output of slepc.  I can set  
> > > > -eps_tol to a low value, but the final relative residual norm is still 
> > > > high , what does this tell me?
> > > 
> > > I don't know. It should not happen.
> > > Jose
> > > 
> > > > 
> > > > Best regards,
> > > > Feng
> > > > 
> > > > From: Jose E. Roman <jro...@dsic.upv.es>
> > > > Sent: 23 August 2022 11:06
> > > > To: feng wang <snails...@hotmail.com>
> > > > Cc: petsc-users <petsc-users@mcs.anl.gov>
> > > > Subject: Re: [petsc-users] Slepc Question, shell-matrix
> > > >  
> > > > You can try the following. Save your shell matrix to disk with the 
> > > > option
> > > > -eps_view_mat0 binary:amatrix.bin
> > > > then repeat the computation with ex4.c loading this file.
> > > > 
> > > > Note that this should be done for a small problem size, because the 
> > > > conversion from a shell matrix implies a matrix-vector product per each 
> > > > column.
> > > > 
> > > > Jose
> > > > 
> > > > > El 23 ago 2022, a las 12:57, feng wang <snails...@hotmail.com> 
> > > > > escribió:
> > > > > 
> > > > > Hi Jose,
> > > > > 
> > > > > Thanks for your reply.
> > > > > 
> > > > > It represents a linear operator. In my shell matrix, I am computing 
> > > > > the non-linear residuals twice with perturbed flow variables. The 
> > > > > matrix-vector product is computed as:
> > > > > 
> > > > > A*v = (R(q+eps*v) - R(q-eps*v))/(2*eps)
> > > > > 
> > > > > R is the non-linear residual. q is my flow variable and it does not 
> > > > > change. eps is the perturbation. A is my Jacobian matrix. Besides, 
> > > > > for some background, I am computing a steady RANS flow with finite 
> > > > > volume method and trying to do a global stability analysis by looking 
> > > > > at the Jacobian matrix. 
> > > > > 
> > > > > Thanks,
> > > > > Feng
> > > > > 
> > > > > From: Jose E. Roman <jro...@dsic.upv.es>
> > > > > Sent: 23 August 2022 10:32
> > > > > To: feng wang <snails...@hotmail.com>
> > > > > Cc: petsc-users <petsc-users@mcs.anl.gov>
> > > > > Subject: Re: [petsc-users] Slepc Question, shell-matrix
> > > > >  
> > > > > The relative residual norms that are printed at the end are too 
> > > > > large. For NHEP problems, they should be below the tolerance. Don't 
> > > > > know what is happening. Does your shell matrix represent a linear 
> > > > > (constant) operator? Or does it change slightly depending on the 
> > > > > input vector? 
> > > > > 
> > > > > > El 23 ago 2022, a las 12:14, feng wang <snails...@hotmail.com> 
> > > > > > escribió:
> > > > > > 
> > > > > > Hi Jose,
> > > > > > 
> > > > > > I think the previous problem comes from my side. I have some 
> > > > > > uninitialized values in my part of code to compute the non-linear 
> > > > > > residuals. so, it produces a NAN when it tries to compute the 
> > > > > > matrix-vector product using finite difference.  This might make the 
> > > > > > slepc/pestc do unexpected things.
> > > > > > 
> > > > > > Now It seems I've got slepc running. eps_nev is set to 3 and I am 
> > > > > > trying to compute the ones with the largest amplitudes. Below is 
> > > > > > the slepc output. 
> > > > > > 
> > > > > >  14 EPS converged value (error) #0 -0.000164282 (5.36813206e-09)
> > > > > >  16 EPS converged value (error) #1 -0.000160691+2.17113e-05i 
> > > > > > (3.37429620e-09)
> > > > > >  16 EPS converged value (error) #2 -0.000160691-2.17113e-05i 
> > > > > > (3.37429620e-09)
> > > > > >  Solution method: krylovschur
> > > > > > 
> > > > > >  Number of requested eigenvalues: 2
> > > > > >  Linear eigensolve converged (3 eigenpairs) due to CONVERGED_TOL; 
> > > > > > iterations 16
> > > > > >  ---------------------- --------------------
> > > > > >             k             ||Ax-kx||/||kx||
> > > > > >  ---------------------- --------------------
> > > > > >        -0.000164              0.0613788
> > > > > >   -0.000161+0.000022i         0.0773339
> > > > > >   -0.000161-0.000022i         0.0774536
> > > > > >  ---------------------- --------------------
> > > > > > 
> > > > > > The values in the brackets are the absolute error (I believe) and 
> > > > > > they seem very low. The relative error seems quite large.  Could 
> > > > > > you please comment on this? 
> > > > > > 
> > > > > > 
> > > > > > Best regards,
> > > > > > Feng
> > > > > > 
> > > > > > From: Jose E. Roman <jro...@dsic.upv.es>
> > > > > > Sent: 23 August 2022 5:24
> > > > > > To: feng wang <snails...@hotmail.com>
> > > > > > Cc: petsc-users <petsc-users@mcs.anl.gov>
> > > > > > Subject: Re: [petsc-users] Slepc Question, shell-matrix
> > > > > >  
> > > > > > Please always respond to the list, otherwise the thread appears as 
> > > > > > unresolved in the archives of the mailing list.
> > > > > > 
> > > > > > 
> > > > > > > El 22 ago 2022, a las 22:45, feng wang <snails...@hotmail.com> 
> > > > > > > escribió:
> > > > > > > 
> > > > > > > Hi Jose,
> > > > > > > 
> > > > > > > I think I might have solved my problem. I have some uninitialized 
> > > > > > > values in my part of code to compute the right hand side. so it 
> > > > > > > produces a NAN when it tries to compute the matrix-vector 
> > > > > > > product. 
> > > > > > > 
> > > > > > > Many thanks for your help!
> > > > > > > 
> > > > > > > Best regards,
> > > > > > > Feng
> > > > > > > From: Jose E. Roman <jro...@dsic.upv.es>
> > > > > > > Sent: 22 August 2022 19:32
> > > > > > > To: feng wang <snails...@hotmail.com>
> > > > > > > Cc: petsc-users@mcs.anl.gov <petsc-users@mcs.anl.gov>
> > > > > > > Subject: Re: [petsc-users] Slepc Question, shell-matrix
> > > > > > >  
> > > > > > > This is very strange. This error appears when the solver employs 
> > > > > > > the B-inner product, but in your case you don't have a B matrix, 
> > > > > > > so you should never see that error. Try running under valgrind to 
> > > > > > > see if it gives more hints.
> > > > > > > 
> > > > > > > Jose
> > > > > > > 
> > > > > > > 
> > > > > > > > El 22 ago 2022, a las 20:45, feng wang <snails...@hotmail.com> 
> > > > > > > > escribió:
> > > > > > > > 
> > > > > > > > Hello,
> > > > > > > > 
> > > > > > > > I am new to Slepc and trying to work out the eigenvalues and 
> > > > > > > > eigenvectors of my Jacobian matrix. I am using a shell matrix 
> > > > > > > > to work out the matrix-vector product and I am using the 
> > > > > > > > default Krylov-schur method.  
> > > > > > > > 
> > > > > > > > My first attempt was not successful and I got the following 
> > > > > > > > errors:
> > > > > > > > 
> > > > > > > > [0]PETSC ERROR: --------------------- Error Message 
> > > > > > > > --------------------------------------------------------------
> > > > > > > > [0]PETSC ERROR: Missing or incorrect user input 
> > > > > > > > [0]PETSC ERROR: The inner product is not well defined: 
> > > > > > > > indefinite matrix
> > > > > > > > [0]PETSC ERROR: See https://petsc.org/release/faq/ for trouble 
> > > > > > > > shooting.
> > > > > > > > [0]PETSC ERROR: Petsc Release Version 3.17.4, unknown 
> > > > > > > > [0]PETSC ERROR: cfdtest on a arch-debug named ming by feng Mon 
> > > > > > > > Aug 22 19:21:41 2022
> > > > > > > > [0]PETSC ERROR: Configure options --with-cc=mpicc 
> > > > > > > > --with-cxx=mpicxx --with-fc=0 PETSC_ARCH=arch-debug
> > > > > > > > [0]PETSC ERROR: #1 BV_SafeSqrt() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/include/slepc/private/bvimpl.h:130
> > > > > > > > [0]PETSC ERROR: #2 BV_SquareRoot_Default() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/include/slepc/private/bvimpl.h:365
> > > > > > > > [0]PETSC ERROR: #3 BVOrthogonalizeCGS1() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/src/sys/classes/bv/interface/bvorthog.c:101
> > > > > > > > [0]PETSC ERROR: #4 BVOrthogonalizeGS() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/src/sys/classes/bv/interface/bvorthog.c:177
> > > > > > > > [0]PETSC ERROR: #5 BVOrthonormalizeColumn() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/src/sys/classes/bv/interface/bvorthog.c:402
> > > > > > > > [0]PETSC ERROR: #6 BVMatArnoldi() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/src/sys/classes/bv/interface/bvkrylov.c:91
> > > > > > > > [0]PETSC ERROR: #7 EPSSolve_KrylovSchur_Default() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/src/eps/impls/krylov/krylovschur/krylovschur.c:261
> > > > > > > > [0]PETSC ERROR: #8 EPSSolve() at 
> > > > > > > > /home/feng/cfd/slepc-3.17.1/src/eps/interface/epssolve.c:147
> > > > > > > > [0]PETSC ERROR: #9 slepc_eigen_comp() at 
> > > > > > > > domain/cfd/slepc_eigen_solve.cpp:77
> > > > > > > > 
> > > > > > > > Could someone please shine some light on this? I have also 
> > > > > > > > attached my code. The code is part of my big library and I 
> > > > > > > > cannot attach the whole code, sorry about this. but I am happy 
> > > > > > > > to provide more information. The attached code has some 
> > > > > > > > arrangements for halo exchange, but for the moment, it assumes 
> > > > > > > > it is a serial run.
> > > > > > > > 
> > > > > > > > Many thanks,
> > > > > > > > Feng
> > > > > > > > <slepc_eigen_solve.cpp>
> 
> <slepc_eigen_solve.cpp>

Reply via email to