Chebyshev, it should be the default, isn’t it? I checked for it in the toy code.
I’m preparing a lanuch using -ksp_view to check for the real case,
I will prepare a monitor for computing solution average if ksp_view is going to 
say nothing relevant.

Thanks

Marco Cisternino


From: Barry Smith <[email protected]>
Sent: martedì 22 marzo 2022 15:27
To: Marco Cisternino <[email protected]>
Cc: Mark Adams <[email protected]>; [email protected]
Subject: Re: [petsc-users] Null space and preconditioners




On Mar 22, 2022, at 9:55 AM, Marco Cisternino 
<[email protected]<mailto:[email protected]>> wrote:

Thank you Barry!
No, no reason for FGMRES (some old tests showed shorter wall-times relative to 
GMRES), I’m going to use GMRES.
I tried GMRES with GAMG using PCSVD on the coarser level on real cases, larger 
than the toy case, I cannot get machine epsilon mean value of the solution, as 
in the toy case but about 10e-5, which is much better than before. The rest of 
GAMG is on default configuration. The mesh is much more complicated being an 
octree with immersed geometries. I get the same behaviour using GMRES+ASM+ILU 
as well.
I cannot really get why the solution is not at zero mean value. I’m using a 
rtol~1.0e-8 but I get the same mean value using rtol~1.o-6, I tried 1.0-12 too, 
but no improvement in the constant, definitely tiny but not zero.
Thanks.

   Are you using GMRES in the smoother or Chebyshev? Recommend using Chebyshev.

   I have no explanation why the average is not much closer to zero.

   Here is one thing to try. Use KSPMonitorSet() to provide a monitor that 
calls KSPBuildSolution() and then computes the average and prints it. Is the 
average always around 1e-5 from the first iteration or does it start close to 
1e-12 and get larger with more iterations?




Marco Cisternino

From: Barry Smith <[email protected]<mailto:[email protected]>>
Sent: lunedì 21 marzo 2022 19:49
To: Marco Cisternino 
<[email protected]<mailto:[email protected]>>
Cc: Mark Adams <[email protected]<mailto:[email protected]>>; 
[email protected]<mailto:[email protected]>
Subject: Re: [petsc-users] Null space and preconditioners


  Marco,

     I have confirmed your results.

     Urgg, it appears we do not have something well documented. The removal of 
the null space only works for left preconditioned solvers and FGMRES only works 
with right preconditioning. Here is the reasoning.

     The Krylov space for left preconditioning is built from [r, BAr, (BA)^2 r, 
...] and the solution space is built from this basis. If A has a null space of 
n then the left preconditioned Krylov methods simply remove n from the "full" 
Krylov space after applying each B preconditioner and the resulting "reduced" 
Krylov space has no components in the n directions hence the solution built by 
GMRES naturally has no component in the n.

     But with right preconditioning the Krylov space is [s ABs (AB)^2 s, ....] 
We would need to remove B^-1 n from the Krylov space so that (A B) B^-1 n = 0 
In general we don't have any way of applying B^-1 to a vector so we cannot 
create the appropriate "reduced" Krylov space.

     If I run with GMRES (which defaults to left preconditioner) and the 
options ./testPreconditioners -pc_type gamg -ksp_type gmres 
-ksp_monitor_true_residual -ksp_rtol 1.e-12 -ksp_view -mg_coarse_pc_type svd

  Then  it handles the null space correctly and the solution has Solution mean 
= 4.51028e-17

Is there any reason to use FGMRES instead of GMRES? You just cannot use GMRES 
as the smoother inside GAMG if you use GMRES on the outside, but for pressure 
equations you don't want use such a strong smoother anyways.

  Barry

  I feel we should add some information to the documentation on the removal of 
the null space to the user's manual when using right preconditioning and maybe 
even have an error check in the code so that people don't fall into this trap. 
But I am not sure exactly what to do. When the A and B are both symmetric I 
think special stuff happens that doesn't require providing a null space; but I 
am not sure.







On Mar 21, 2022, at 12:41 PM, Marco Cisternino 
<[email protected]<mailto:[email protected]>> wrote:

Thank you, Mark.
However, doing this with my toy code
mpirun -n 1 ./testpreconditioner -pc_type gamg 
-pc_gamg_use_parallel_coarse_grid_solver -mg_coarse_pc_type jacobi 
-mg_coarse_ksp_type cg

I get 16 inf elements. Do I miss anything?

Thanks again

Marco Cisternino


From: Mark Adams <[email protected]<mailto:[email protected]>>
Sent: lunedì 21 marzo 2022 17:31
To: Marco Cisternino 
<[email protected]<mailto:[email protected]>>
Cc: [email protected]<mailto:[email protected]>
Subject: Re: [petsc-users] Null space and preconditioners

And for GAMG you can use:

-pc_gamg_use_parallel_coarse_grid_solver -mg_coarse_pc_type jacobi 
-mg_coarse_ksp_type cg

Note if you are using more that one MPI process you can use 'lu' instead of 
'jacobi'

If GAMG converges fast enough it can solve before the constant creeps in and 
works without cleaning in the KSP method.

On Mon, Mar 21, 2022 at 12:06 PM Mark Adams 
<[email protected]<mailto:[email protected]>> wrote:
The solution for Neumann problems can "float away" if the constant is not 
controlled in some way because floating point errors can introduce it even if 
your RHS is exactly orthogonal to it.

You should use a special coarse grid solver for GAMG but it seems to be working 
for you.

I have lost track of the simply way to have the KSP solver clean the constant 
out, which is what you want.

can someone help Marco?

Mark





On Mon, Mar 21, 2022 at 8:18 AM Marco Cisternino 
<[email protected]<mailto:[email protected]>> wrote:
Good morning,
I’m observing an unexpected (to me) behaviour of my code.
I tried to reduce the problem in a toy code here attached.
The toy code archive contains a small main, a matrix and a rhs.
The toy code solves the linear system and check the norms and the mean of the 
solution.
The problem into the matrix and the rhs is the finite volume discretization of 
the pressure equation of an incompressible NS solver.
It has been cooked as tiny as possible (16 cells!).
It is important to say that it is an elliptic problem with homogeneous Neumann 
boundary conditions only, for this reason the toy code sets a null space 
containing the constant.

The unexpected (to me) behaviour is evident by launching the code using 
different preconditioners, using -pc-type <pctype>
I tested using PCNONE (“none”), PCGAMG (“gamg”) and PCILU (“ilu”). The default 
solver is KSPFGMRES.
Using the three PC, I get 3 different solutions. It seems to me that they 
differ in the mean value, but GAMG is impressive.
PCNONE gives me the zero mean solution I expected. What about the others?

Asking for residuals monitor, the ratio ||r||/||b|| shows convergence for 
PCNONE and PCILU (~10^-16), but it stalls for PCGAMG (~10^-4).
I cannot see why. Am I doing anything wrong or incorrectly thinking about the 
expected behaviour?

Generalizing to larger mesh the behaviour is similar.

Thank you for any help.

Marco Cisternino

Reply via email to