> On Oct 1, 2021, at 6:38 AM, Marco Cisternino <marco.cistern...@optimad.it> > wrote: > > Thank you Barry. > I added a custom atoll = 1.0e-12 and this makes the CFD stable with all the > linear solver types. CFD solution is good and pressure is a good “zero” field > at every CFD iteration. > I did the same test using ASM+ILU+FGMRES(BCGS and GMRES) and the behaviour is > the same. > During some CFD iteration the residual of linear system starts slightly > higher than atol and the linear solver makes some iteration (2/3 iterations) > before it stops because of atol. > The pressure is still different in the 2 sub-domains (order 1.0e-14 because > of those few linear solver iterations), therefore no symmetry of the solution > In the 2 sub-domains. > I think it is a matter of round-off, do you agree on this? Or do I need to > take care of this difference as a symptom of something wrong?
Yes, if the differences in the two solutions are order 1.e-14 that is very good, one cannot expect them to be identical. > > Thank you for your support. > > Marco Cisternino > > From: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>> > Sent: giovedì 30 settembre 2021 16:39 > To: Marco Cisternino <marco.cistern...@optimad.it > <mailto:marco.cistern...@optimad.it>> > Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> > Subject: Re: [petsc-users] Disconnected domains and Poisson equation > > > It looks like the initial solution (guess) is to round-off the solution to > the linear system 9.010260489109e-14 > > 0 KSP unpreconditioned resid norm 9.010260489109e-14 true resid norm > 9.010260489109e-14 ||r(i)||/||b|| 2.021559024868e+00 > 0 KSP Residual norm 9.010260489109e-14 % max 1.000000000000e+00 min > 1.000000000000e+00 max/min 1.000000000000e+00 > 1 KSP unpreconditioned resid norm 4.918108339808e-15 true resid norm > 4.918171792537e-15 ||r(i)||/||b|| 1.103450292594e-01 > 1 KSP Residual norm 4.918108339808e-15 % max 9.566256813737e-01 min > 9.566256813737e-01 max/min 1.000000000000e+00 > 2 KSP unpreconditioned resid norm 1.443599554690e-15 true resid norm > 1.444867143493e-15 ||r(i)||/||b|| 3.241731154382e-02 > 2 KSP Residual norm 1.443599554690e-15 % max 9.614019380614e-01 min > 7.360950481750e-01 max/min 1.306083963538e+00 > > Thus the Krylov solver will not be able to improve the solution, it then gets > stuck trying to improve the solution but cannot because of round off. > > In other words the algorithm has converged (even at the initial solution > (guess) and should stop immediately. > > You can use -ksp_atol 1.e-12 to get it to stop immediately without iterating > if the initial residual is less than 1e-12. > > Barry > > > > > On Sep 30, 2021, at 4:16 AM, Marco Cisternino <marco.cistern...@optimad.it > <mailto:marco.cistern...@optimad.it>> wrote: > > Hello Barry. > This is the output of ksp_view using fgmres and gamg. It has to be said that > the solution of the linear system should be a zero values field. As you can > see both unpreconditioned residual and r/b converge at this iteration of the > CFD solver. During the time integration of the CFD, I can observe pressure > linear solver residuals behaving in a different way: unpreconditioned > residual stil converges but r/b stalls. After the output of ksp_view I add > the output of ksp_monitor_true_residual for one of these iteration where r/b > stalls. > Thanks, > > KSP Object: 1 MPI processes > type: fgmres > restart=30, using Classical (unmodified) Gram-Schmidt Orthogonalization > with no iterative refinement > happy breakdown tolerance 1e-30 > maximum iterations=100, nonzero initial guess > tolerances: relative=1e-05, absolute=1e-50, divergence=10000. > right preconditioning > using UNPRECONDITIONED norm type for convergence test > PC Object: 1 MPI processes > type: gamg > type is MULTIPLICATIVE, levels=4 cycles=v > Cycles per PCApply=1 > Using externally compute Galerkin coarse grid matrices > GAMG specific options > Threshold for dropping small values in graph on each level = 0.02 > 0.02 > Threshold scaling factor for each level not specified = 1. > AGG specific options > Symmetric graph true > Number of levels to square graph 1 > Number smoothing steps 0 > Coarse grid solver -- level ------------------------------- > KSP Object: (mg_coarse_) 1 MPI processes > type: preonly > maximum iterations=10000, initial guess is zero > tolerances: relative=1e-05, absolute=1e-50, divergence=10000. > left preconditioning > using NONE norm type for convergence test > PC Object: (mg_coarse_) 1 MPI processes > type: bjacobi > number of blocks = 1 > Local solve is same for all blocks, in the following KSP and PC > objects: > KSP Object: (mg_coarse_sub_) 1 MPI processes > type: preonly > maximum iterations=1, initial guess is zero > tolerances: relative=1e-05, absolute=1e-50, divergence=10000. > left preconditioning > using DEFAULT norm type for convergence test > PC Object: (mg_coarse_sub_) 1 MPI processes > type: lu > PC has not been set up so information may be incomplete > out-of-place factorization > tolerance for zero pivot 2.22045e-14 > using diagonal shift on blocks to prevent zero pivot [INBLOCKS] > matrix ordering: nd > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: seqaij > rows=18, cols=18 > total: nonzeros=104, allocated nonzeros=104 > total number of mallocs used during MatSetValues calls =0 > not using I-node routines > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: seqaij > rows=18, cols=18 > total: nonzeros=104, allocated nonzeros=104 > total number of mallocs used during MatSetValues calls =0 > not using I-node routines > Down solver (pre-smoother) on level 1 ------------------------------- > KSP Object: (mg_levels_1_) 1 MPI processes > type: chebyshev > eigenvalue estimates used: min = 0., max = 0. > eigenvalues estimate via gmres min 0., max 0. > eigenvalues estimated using gmres with translations [0. 0.1; 0. 1.1] > KSP Object: (mg_levels_1_esteig_) 1 MPI processes > type: gmres > restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > happy breakdown tolerance 1e-30 > maximum iterations=10, initial guess is zero > tolerances: relative=1e-12, absolute=1e-50, divergence=10000. > left preconditioning > using DEFAULT norm type for convergence test > estimating eigenvalues using noisy right hand side > maximum iterations=2, nonzero initial guess > tolerances: relative=1e-05, absolute=1e-50, divergence=10000. > left preconditioning > using NONE norm type for convergence test > PC Object: (mg_levels_1_) 1 MPI processes > type: sor > type = local_symmetric, iterations = 1, local iterations = 1, omega = > 1. > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: seqaij > rows=67, cols=67 > total: nonzeros=675, allocated nonzeros=675 > total number of mallocs used during MatSetValues calls =0 > not using I-node routines > Up solver (post-smoother) same as down solver (pre-smoother) > Down solver (pre-smoother) on level 2 ------------------------------- > KSP Object: (mg_levels_2_) 1 MPI processes > type: chebyshev > eigenvalue estimates used: min = 0., max = 0. > eigenvalues estimate via gmres min 0., max 0. > eigenvalues estimated using gmres with translations [0. 0.1; 0. 1.1] > KSP Object: (mg_levels_2_esteig_) 1 MPI processes > type: gmres > restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > happy breakdown tolerance 1e-30 > maximum iterations=10, initial guess is zero > tolerances: relative=1e-12, absolute=1e-50, divergence=10000. > left preconditioning > using DEFAULT norm type for convergence test > estimating eigenvalues using noisy right hand side > maximum iterations=2, nonzero initial guess > tolerances: relative=1e-05, absolute=1e-50, divergence=10000. > left preconditioning > using NONE norm type for convergence test > PC Object: (mg_levels_2_) 1 MPI processes > type: sor > type = local_symmetric, iterations = 1, local iterations = 1, omega = > 1. > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: seqaij > rows=348, cols=348 > total: nonzeros=3928, allocated nonzeros=3928 > total number of mallocs used during MatSetValues calls =0 > not using I-node routines > Up solver (post-smoother) same as down solver (pre-smoother) > Down solver (pre-smoother) on level 3 ------------------------------- > KSP Object: (mg_levels_3_) 1 MPI processes > type: chebyshev > eigenvalue estimates used: min = 0., max = 0. > eigenvalues estimate via gmres min 0., max 0. > eigenvalues estimated using gmres with translations [0. 0.1; 0. 1.1] > KSP Object: (mg_levels_3_esteig_) 1 MPI processes > type: gmres > restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > happy breakdown tolerance 1e-30 > maximum iterations=10, initial guess is zero > tolerances: relative=1e-12, absolute=1e-50, divergence=10000. > left preconditioning > using DEFAULT norm type for convergence test > estimating eigenvalues using noisy right hand side > maximum iterations=2, nonzero initial guess > tolerances: relative=1e-05, absolute=1e-50, divergence=10000. > left preconditioning > using NONE norm type for convergence test > PC Object: (mg_levels_3_) 1 MPI processes > type: sor > type = local_symmetric, iterations = 1, local iterations = 1, omega = > 1. > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: seqaij > rows=3584, cols=3584 > total: nonzeros=23616, allocated nonzeros=23616 > total number of mallocs used during MatSetValues calls =0 > has attached null space > not using I-node routines > Up solver (post-smoother) same as down solver (pre-smoother) > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: seqaij > rows=3584, cols=3584 > total: nonzeros=23616, allocated nonzeros=23616 > total number of mallocs used during MatSetValues calls =0 > has attached null space > not using I-node routines > Pressure system has reached convergence in 0 iterations with reason 3. > 0 KSP unpreconditioned resid norm 4.798763170703e-16 true resid norm > 4.798763170703e-16 ||r(i)||/||b|| 1.000000000000e+00 > 0 KSP Residual norm 4.798763170703e-16 % max 1.000000000000e+00 min > 1.000000000000e+00 max/min 1.000000000000e+00 > 1 KSP unpreconditioned resid norm 1.648749109132e-17 true resid norm > 1.648749109132e-17 ||r(i)||/||b|| 3.435779284125e-02 > 1 KSP Residual norm 1.648749109132e-17 % max 9.561792537103e-01 min > 9.561792537103e-01 max/min 1.000000000000e+00 > 2 KSP unpreconditioned resid norm 4.737880600040e-19 true resid norm > 4.737880600040e-19 ||r(i)||/||b|| 9.873128619820e-04 > 2 KSP Residual norm 4.737880600040e-19 % max 9.828636644296e-01 min > 9.293131521763e-01 max/min 1.057623753767e+00 > 3 KSP unpreconditioned resid norm 2.542212716830e-20 true resid norm > 2.542212716830e-20 ||r(i)||/||b|| 5.297641551371e-05 > 3 KSP Residual norm 2.542212716830e-20 % max 9.933572357920e-01 min > 9.158303248850e-01 max/min 1.084652046127e+00 > 4 KSP unpreconditioned resid norm 6.614510286263e-21 true resid norm > 6.614510286269e-21 ||r(i)||/||b|| 1.378378146822e-05 > 4 KSP Residual norm 6.614510286263e-21 % max 9.950912550705e-01 min > 6.296575800237e-01 max/min 1.580368896747e+00 > 5 KSP unpreconditioned resid norm 1.981505525281e-22 true resid norm > 1.981505525272e-22 ||r(i)||/||b|| 4.129200493513e-07 > 5 KSP Residual norm 1.981505525281e-22 % max 9.984097962703e-01 min > 5.316259535293e-01 max/min 1.878030577029e+00 > Linear solve converged due to CONVERGED_RTOL iterations 5 > > Ksp_monitor_true_residual output for stalling r/b CFD iteration > 0 KSP unpreconditioned resid norm 9.010260489109e-14 true resid norm > 9.010260489109e-14 ||r(i)||/||b|| 2.021559024868e+00 > 0 KSP Residual norm 9.010260489109e-14 % max 1.000000000000e+00 min > 1.000000000000e+00 max/min 1.000000000000e+00 > 1 KSP unpreconditioned resid norm 4.918108339808e-15 true resid norm > 4.918171792537e-15 ||r(i)||/||b|| 1.103450292594e-01 > 1 KSP Residual norm 4.918108339808e-15 % max 9.566256813737e-01 min > 9.566256813737e-01 max/min 1.000000000000e+00 > 2 KSP unpreconditioned resid norm 1.443599554690e-15 true resid norm > 1.444867143493e-15 ||r(i)||/||b|| 3.241731154382e-02 > 2 KSP Residual norm 1.443599554690e-15 % max 9.614019380614e-01 min > 7.360950481750e-01 max/min 1.306083963538e+00 > 3 KSP unpreconditioned resid norm 6.623206616803e-16 true resid norm > 6.654132553541e-16 ||r(i)||/||b|| 1.492933720678e-02 > 3 KSP Residual norm 6.623206616803e-16 % max 9.764112945239e-01 min > 4.911485418014e-01 max/min 1.988016274960e+00 > 4 KSP unpreconditioned resid norm 6.551896936698e-16 true resid norm > 6.646157296305e-16 ||r(i)||/||b|| 1.491144376933e-02 > 4 KSP Residual norm 6.551896936698e-16 % max 9.883425885532e-01 min > 1.461270778833e-01 max/min 6.763582786091e+00 > 5 KSP unpreconditioned resid norm 6.222297644887e-16 true resid norm > 1.720560536914e-15 ||r(i)||/||b|| 3.860282047823e-02 > 5 KSP Residual norm 6.222297644887e-16 % max 1.000409371755e+00 min > 4.989767363560e-03 max/min 2.004921870829e+02 > 6 KSP unpreconditioned resid norm 6.496945794974e-17 true resid norm > 2.031914800253e-14 ||r(i)||/||b|| 4.558842341106e-01 > 6 KSP Residual norm 6.496945794974e-17 % max 1.004914985753e+00 min > 1.459258738706e-03 max/min 6.886475709192e+02 > 7 KSP unpreconditioned resid norm 1.965237342540e-17 true resid norm > 1.684522207337e-14 ||r(i)||/||b|| 3.779425772373e-01 > 7 KSP Residual norm 1.965237342540e-17 % max 1.005737762541e+00 min > 1.452603803766e-03 max/min 6.923689446035e+02 > 8 KSP unpreconditioned resid norm 1.627718951285e-17 true resid norm > 1.958642967520e-14 ||r(i)||/||b|| 4.394448276241e-01 > 8 KSP Residual norm 1.627718951285e-17 % max 1.006364278765e+00 min > 1.452081813014e-03 max/min 6.930492963590e+02 > 9 KSP unpreconditioned resid norm 1.616577677764e-17 true resid norm > 2.019110946644e-14 ||r(i)||/||b|| 4.530115373837e-01 > 9 KSP Residual norm 1.616577677764e-17 % max 1.006648747131e+00 min > 1.452031376577e-03 max/min 6.932692801059e+02 > 10 KSP unpreconditioned resid norm 1.285788988203e-17 true resid norm > 2.065082694477e-14 ||r(i)||/||b|| 4.633258453698e-01 > 10 KSP Residual norm 1.285788988203e-17 % max 1.007469033514e+00 min > 1.433291867068e-03 max/min 7.029057072477e+02 > 11 KSP unpreconditioned resid norm 5.490854431580e-19 true resid norm > 1.798071628891e-14 ||r(i)||/||b|| 4.034187394623e-01 > 11 KSP Residual norm 5.490854431580e-19 % max 1.008058905554e+00 min > 1.369401685301e-03 max/min 7.361309076612e+02 > 12 KSP unpreconditioned resid norm 1.371754802104e-20 true resid norm > 1.965688920064e-14 ||r(i)||/||b|| 4.410256708163e-01 > 12 KSP Residual norm 1.371754802104e-20 % max 1.008409402214e+00 min > 1.369243011779e-03 max/min 7.364721919624e+02 > Linear solve converged due to CONVERGED_RTOL iterations 12 > > > > Marco Cisternino > > From: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>> > Sent: mercoledì 29 settembre 2021 18:34 > To: Marco Cisternino <marco.cistern...@optimad.it > <mailto:marco.cistern...@optimad.it>> > Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> > Subject: Re: [petsc-users] Disconnected domains and Poisson equation > > > > > > On Sep 29, 2021, at 11:59 AM, Marco Cisternino <marco.cistern...@optimad.it > <mailto:marco.cistern...@optimad.it>> wrote: > > For sake of completeness, explicitly building the null space using a vector > per sub-domain make s the CFD runs using BCGS and GMRES more stable, but > still slower than FGMRES. > > Something is strange. Please run with -ksp_view and send the output on the > solver details. > > > > I had divergence using BCGS and GMRES setting the null space with only one > constant. > Thanks > > Marco Cisternino > > From: Marco Cisternino > Sent: mercoledì 29 settembre 2021 17:54 > To: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>> > Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> > Subject: RE: [petsc-users] Disconnected domains and Poisson equation > > Thank you Barry for the quick reply. > About the null space: I already tried what you suggest, building 2 Vec > (constants) with 0 and 1 chosen by sub-domain, normalizing them and setting > the null space like this > MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_FALSE,nconstants,constants,&nullspace); > The solution is slightly different in values but it is still different in the > two sub-domains. > About the solver: I tried BCGS, GMRES and FGMRES. The linear system is a > pressure system in a navier-stokes solver and only solving with FGMRES makes > the CFD stable, with BCGS and GMRES the CFD solution diverges. Moreover, in > the same case but with a single domain, CFD solution is stable using all the > solvers, but FGMRES converges in much less iterations than the others. > > Marco Cisternino > > From: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>> > Sent: mercoledì 29 settembre 2021 15:59 > To: Marco Cisternino <marco.cistern...@optimad.it > <mailto:marco.cistern...@optimad.it>> > Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> > Subject: Re: [petsc-users] Disconnected domains and Poisson equation > > > The problem actually has a two dimensional null space; constant on each > domain but possibly different constants. I think you need to build the > MatNullSpace by explicitly constructing two vectors, one with 0 on one domain > and constant value on the other and one with 0 on the other domain and > constant on the first. > > Separate note: why use FGMRES instead of just GMRES? If the problem is > linear and the preconditioner is linear (no GMRES inside the smoother) then > you can just use GMRES and it will save a little space/work and be > conceptually clearer. > > Barry > > > On Sep 29, 2021, at 8:46 AM, Marco Cisternino <marco.cistern...@optimad.it > <mailto:marco.cistern...@optimad.it>> wrote: > > Good morning, > I want to solve the Poisson equation on a 3D domain with 2 non-connected > sub-domains. > I am using FGMRES+GAMG and I have no problem if the two sub-domains see a > Dirichlet boundary condition each. > On the same domain I would like to solve the Poisson equation imposing > periodic boundary condition in one direction and homogenous Neumann boundary > conditions in the other two directions. The two sub-domains are symmetric > with respect to the separation between them and the operator discretization > and the right hand side are symmetric as well. It would be nice to have the > same solution in both the sub-domains. > Setting the null space to the constant, the solver converges to a solution > having the same gradients in both sub-domains but different values. > Am I doing some wrong with the null space? I’m not setting a block matrix > (one block for each sub-domain), should I? > I tested the null space against the matrix using MatNullSpaceTest and the > answer is true. Can I do something more to have a symmetric solution as > outcome of the solver? > Thank you in advance for any comments and hints. > > Best regards, > > Marco Cisternino