Dear authors, Here are the options passed with fieldsplit preconditioner:
-ksp_type cg -pc_type fieldsplit -pc_fieldsplit_detect_saddle_point -pc_fieldsplit_type schur -pc_fieldsplit_schur_precondition selfp -pc_fieldsplit_schur_fact_type full -fieldsplit_0_ksp_type preonly -fieldsplit_0_pc_type gamg -fieldsplit_0_mg_coarse_sub_pc_type_type svd -fieldsplit_1_ksp_type preonly -fieldsplit_1_pc_type bjacobi -ksp_view -ksp_monitor_true_residual -ksp_converged_reason -fieldsplit_0_mg_levels_ksp_monitor_true_residual -fieldsplit_0_mg_levels_ksp_converged_reason -fieldsplit_1_ksp_monitor_true_residual -fieldsplit_1_ksp_converged_reason and the output: 0 KSP unpreconditioned resid norm 2.777777777778e+01 true resid norm 2.777777777778e+01 ||r(i)||/||b|| 1.000000000000e+00 Linear fieldsplit_0_mg_levels_1_ solve converged due to CONVERGED_ITS iterations 2 Linear fieldsplit_0_mg_levels_1_ solve converged due to CONVERGED_ITS iterations 2 Linear fieldsplit_1_ solve did not converge due to DIVERGED_PC_FAILED iterations 0 PC failed due to SUBPC_ERROR Linear fieldsplit_0_mg_levels_1_ solve converged due to CONVERGED_ITS iterations 2 Linear fieldsplit_0_mg_levels_1_ solve converged due to CONVERGED_ITS iterations 2 Linear solve did not converge due to DIVERGED_PC_FAILED iterations 0 PC failed due to SUBPC_ERROR KSP Object: 1 MPI processes type: cg maximum iterations=200, initial guess is zero tolerances: relative=1e-06, absolute=1e-12, divergence=1e+30 left preconditioning using UNPRECONDITIONED norm type for convergence test PC Object: 1 MPI processes type: fieldsplit FieldSplit with Schur preconditioner, blocksize = 1, factorization FULL Preconditioner for the Schur complement formed from Sp, an assembled approximation to S, which uses A00's diagonal's inverse Split info: Split number 0 Defined by IS Split number 1 Defined by IS KSP solver for A00 block KSP Object: (fieldsplit_0_) 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: (fieldsplit_0_) 1 MPI processes type: gamg type is MULTIPLICATIVE, levels=2 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 = Threshold scaling factor for each level not specified = 1. AGG specific options Symmetric graph false Number of levels to square graph 1 Number smoothing steps 1 Complexity: grid = 1.00222 Coarse grid solver -- level ------------------------------- KSP Object: (fieldsplit_0_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: (fieldsplit_0_mg_coarse_) 1 MPI processes type: bjacobi number of blocks = 1 Local solver is the same for all blocks, as in the following KSP and PC objects on rank 0: KSP Object: (fieldsplit_0_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 NONE norm type for convergence test PC Object: (fieldsplit_0_mg_coarse_sub_) 1 MPI processes type: lu out-of-place factorization tolerance for zero pivot 2.22045e-14 using diagonal shift on blocks to prevent zero pivot [INBLOCKS] matrix ordering: nd factor fill ratio given 5., needed 1. Factored matrix follows: Mat Object: 1 MPI processes type: seqaij rows=8, cols=8 package used to perform factorization: petsc total: nonzeros=56, allocated nonzeros=56 using I-node routines: found 3 nodes, limit used is 5 linear system matrix = precond matrix: Mat Object: 1 MPI processes type: seqaij rows=8, cols=8 total: nonzeros=56, allocated nonzeros=56 total number of mallocs used during MatSetValues calls=0 using I-node routines: found 3 nodes, limit used is 5 linear system matrix = precond matrix: Mat Object: 1 MPI processes type: mpiaij rows=8, cols=8 total: nonzeros=56, allocated nonzeros=56 total number of mallocs used during MatSetValues calls=0 using nonscalable MatPtAP() implementation using I-node (on process 0) routines: found 3 nodes, limit used is 5 Down solver (pre-smoother) on level 1 ------------------------------- KSP Object: (fieldsplit_0_mg_levels_1_) 1 MPI processes type: chebyshev eigenvalue estimates used: min = 0.0998145, max = 1.09796 eigenvalues estimate via gmres min 0.00156735, max 0.998145 eigenvalues estimated using gmres with translations [0. 0.1; 0. 1.1] KSP Object: (fieldsplit_0_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 PRECONDITIONED 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: (fieldsplit_0_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: (fieldsplit_0_) 1 MPI processes type: mpiaij rows=480, cols=480 total: nonzeros=25200, allocated nonzeros=25200 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 160 nodes, limit used is 5 Up solver (post-smoother) same as down solver (pre-smoother) linear system matrix = precond matrix: Mat Object: (fieldsplit_0_) 1 MPI processes type: mpiaij rows=480, cols=480 total: nonzeros=25200, allocated nonzeros=25200 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 160 nodes, limit used is 5 KSP solver for S = A11 - A10 inv(A00) A01 KSP Object: (fieldsplit_1_) 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: (fieldsplit_1_) 1 MPI processes type: bjacobi number of blocks = 1 Local solver is the same for all blocks, as in the following KSP and PC objects on rank 0: KSP Object: (fieldsplit_1_sub_) 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: (fieldsplit_1_sub_) 1 MPI processes type: bjacobi number of blocks = 1 Local solver is the same for all blocks, as in the following KSP and PC objects on rank 0: KSP Object: (fieldsplit_1_sub_sub_) 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: (fieldsplit_1_sub_sub_) 1 MPI processes type: ilu out-of-place factorization 0 levels of fill tolerance for zero pivot 2.22045e-14 matrix ordering: natural factor fill ratio given 1., needed 1. Factored matrix follows: Mat Object: 1 MPI processes type: seqaij rows=144, cols=144 package used to perform factorization: petsc total: nonzeros=240, allocated nonzeros=240 not using I-node routines linear system matrix = precond matrix: Mat Object: 1 MPI processes type: seqaij rows=144, cols=144 total: nonzeros=240, allocated nonzeros=240 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: mpiaij rows=144, cols=144 total: nonzeros=240, allocated nonzeros=240 total number of mallocs used during MatSetValues calls=0 not using I-node (on process 0) routines linear system matrix followed by preconditioner matrix: Mat Object: (fieldsplit_1_) 1 MPI processes type: schurcomplement rows=144, cols=144 Schur complement A11 - A10 inv(A00) A01 A11 Mat Object: (fieldsplit_1_) 1 MPI processes type: mpiaij rows=144, cols=144 total: nonzeros=240, allocated nonzeros=240 total number of mallocs used during MatSetValues calls=0 not using I-node (on process 0) routines A10 Mat Object: 1 MPI processes type: mpiaij rows=144, cols=480 total: nonzeros=48, allocated nonzeros=48 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 74 nodes, limit used is 5 KSP of A00 KSP Object: (fieldsplit_0_) 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: (fieldsplit_0_) 1 MPI processes type: gamg type is MULTIPLICATIVE, levels=2 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 = Threshold scaling factor for each level not specified = 1. AGG specific options Symmetric graph false Number of levels to square graph 1 Number smoothing steps 1 Complexity: grid = 1.00222 Coarse grid solver -- level ------------------------------- KSP Object: (fieldsplit_0_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: (fieldsplit_0_mg_coarse_) 1 MPI processes type: bjacobi number of blocks = 1 Local solver is the same for all blocks, as in the following KSP and PC objects on rank 0: KSP Object: (fieldsplit_0_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 NONE norm type for convergence test PC Object: (fieldsplit_0_mg_coarse_sub_) 1 MPI processes type: lu out-of-place factorization tolerance for zero pivot 2.22045e-14 using diagonal shift on blocks to prevent zero pivot [INBLOCKS] matrix ordering: nd factor fill ratio given 5., needed 1. Factored matrix follows: Mat Object: 1 MPI processes type: seqaij rows=8, cols=8 package used to perform factorization: petsc total: nonzeros=56, allocated nonzeros=56 using I-node routines: found 3 nodes, limit used is 5 linear system matrix = precond matrix: Mat Object: 1 MPI processes type: seqaij rows=8, cols=8 total: nonzeros=56, allocated nonzeros=56 total number of mallocs used during MatSetValues calls=0 using I-node routines: found 3 nodes, limit used is 5 linear system matrix = precond matrix: Mat Object: 1 MPI processes type: mpiaij rows=8, cols=8 total: nonzeros=56, allocated nonzeros=56 total number of mallocs used during MatSetValues calls=0 using nonscalable MatPtAP() implementation using I-node (on process 0) routines: found 3 nodes, limit used is 5 Down solver (pre-smoother) on level 1 ------------------------------- KSP Object: (fieldsplit_0_mg_levels_1_) 1 MPI processes type: chebyshev eigenvalue estimates used: min = 0.0998145, max = 1.09796 eigenvalues estimate via gmres min 0.00156735, max 0.998145 eigenvalues estimated using gmres with translations [0. 0.1; 0. 1.1] KSP Object: (fieldsplit_0_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 PRECONDITIONED 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: (fieldsplit_0_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: (fieldsplit_0_) 1 MPI processes type: mpiaij rows=480, cols=480 total: nonzeros=25200, allocated nonzeros=25200 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 160 nodes, limit used is 5 Up solver (post-smoother) same as down solver (pre-smoother) linear system matrix = precond matrix: Mat Object: (fieldsplit_0_) 1 MPI processes type: mpiaij rows=480, cols=480 total: nonzeros=25200, allocated nonzeros=25200 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 160 nodes, limit used is 5 A01 Mat Object: 1 MPI processes type: mpiaij rows=480, cols=144 total: nonzeros=48, allocated nonzeros=48 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 135 nodes, limit used is 5 Mat Object: 1 MPI processes type: mpiaij rows=144, cols=144 total: nonzeros=240, allocated nonzeros=240 total number of mallocs used during MatSetValues calls=0 not using I-node (on process 0) routines linear system matrix = precond matrix: Mat Object: 1 MPI processes type: mpiaij rows=624, cols=624 total: nonzeros=25536, allocated nonzeros=25536 total number of mallocs used during MatSetValues calls=0 using I-node (on process 0) routines: found 336 nodes, limit used is 5 Thanks, Xiaofeng > On Jun 17, 2025, at 19:05, Mark Adams <mfad...@lbl.gov> wrote: > > And don't use -pc_gamg_parallel_coarse_grid_solver > You can use that in production but for debugging use -mg_coarse_pc_type svd > Also, use -options_left and remove anything that is not used. > (I am puzzled, I see -pc_type gamg not -pc_type fieldsplit) > > Mark > > > On Mon, Jun 16, 2025 at 6:40 AM Matthew Knepley <knep...@gmail.com > <mailto:knep...@gmail.com>> wrote: >> On Sun, Jun 15, 2025 at 9:46 PM hexioafeng <hexiaof...@buaa.edu.cn >> <mailto:hexiaof...@buaa.edu.cn>> wrote: >>> Hello, >>> >>> Here are the options and outputs: >>> >>> options: >>> >>> -ksp_type cg -pc_type gamg -pc_gamg_parallel_coarse_grid_solver >>> -pc_fieldsplit_detect_saddle_point -pc_fieldsplit_type schur >>> -pc_fieldsplit_schur_precondition selfp >>> -fieldsplit_1_mat_schur_complement_ainv_type lump >>> -pc_fieldsplit_schur_fact_type full -fieldsplit_0_ksp_type preonly >>> -fieldsplit_0_pc_type gamg -fieldsplit_0_mg_coarse_pc_type_type svd >>> -fieldsplit_1_ksp_type preonly -fieldsplit_1_pc_type bjacobi >>> -fieldsplit_1_sub_pc_type sor -ksp_view -ksp_monitor_true_residual >>> -ksp_converged_reason -fieldsplit_0_mg_levels_ksp_monitor_true_residual >>> -fieldsplit_0_mg_levels_ksp_converged_reason >>> -fieldsplit_1_ksp_monitor_true_residual -fieldsplit_1_ksp_converged_reason >> >> This option was wrong: >> >> -fieldsplit_0_mg_coarse_pc_type_type svd >> >> from the output, we can see that it should have been >> >> -fieldsplit_0_mg_coarse_sub_pc_type_type svd >> >> THanks, >> >> Matt >> >>> output: >>> >>> 0 KSP unpreconditioned resid norm 2.777777777778e+01 true resid norm >>> 2.777777777778e+01 ||r(i)||/||b|| 1.000000000000e+00 >>> Linear solve did not converge due to DIVERGED_PC_FAILED iterations 0 >>> PC failed due to SUBPC_ERROR >>> KSP Object: 1 MPI processes >>> type: cg >>> maximum iterations=200, initial guess is zero >>> tolerances: relative=1e-06, absolute=1e-12, divergence=1e+30 >>> left preconditioning >>> using UNPRECONDITIONED norm type for convergence test >>> PC Object: 1 MPI processes >>> type: gamg >>> type is MULTIPLICATIVE, levels=2 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 = >>> Threshold scaling factor for each level not specified = 1. >>> AGG specific options >>> Symmetric graph false >>> Number of levels to square graph 1 >>> Number smoothing steps 1 >>> Complexity: grid = 1.00176 >>> 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 solver is the same for all blocks, as in the following KSP >>> and PC objects on rank 0: >>> 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 NONE norm type for convergence test >>> PC Object: (mg_coarse_sub_) 1 MPI processes >>> type: lu >>> out-of-place factorization >>> tolerance for zero pivot 2.22045e-14 >>> using diagonal shift on blocks to prevent zero pivot [INBLOCKS] >>> matrix ordering: nd >>> factor fill ratio given 5., needed 1. >>> Factored matrix follows: >>> Mat Object: 1 MPI processes >>> type: seqaij >>> rows=7, cols=7 >>> package used to perform factorization: petsc >>> total: nonzeros=45, allocated nonzeros=45 >>> using I-node routines: found 3 nodes, limit used is 5 >>> linear system matrix = precond matrix: >>> Mat Object: 1 MPI processes >>> type: seqaij >>> rows=7, cols=7 >>> total: nonzeros=45, allocated nonzeros=45 >>> total number of mallocs used during MatSetValues calls=0 >>> using I-node routines: found 3 nodes, limit used is 5 >>> linear system matrix = precond matrix: >>> Mat Object: 1 MPI processes >>> type: mpiaij >>> rows=7, cols=7 >>> total: nonzeros=45, allocated nonzeros=45 >>> total number of mallocs used during MatSetValues calls=0 >>> using nonscalable MatPtAP() implementation >>> using I-node (on process 0) routines: found 3 nodes, limit used >>> is 5 >>> 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 PRECONDITIONED 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: mpiaij >>> rows=624, cols=624 >>> total: nonzeros=25536, allocated nonzeros=25536 >>> total number of mallocs used during MatSetValues calls=0 >>> using I-node (on process 0) routines: found 336 nodes, limit >>> used is 5 >>> 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: mpiaij >>> rows=624, cols=624 >>> total: nonzeros=25536, allocated nonzeros=25536 >>> total number of mallocs used during MatSetValues calls=0 >>> using I-node (on process 0) routines: found 336 nodes, limit used >>> is 5 Up solver (post-smoother) same as down solver (pre-smoother) >>> linear system matrix = precond matrix: >>> Mat Object: 1 MPI processes >>> type: mpiaij >>> rows=624, cols=624 >>> total: nonzeros=25536, allocated nonzeros=25536 >>> total number of mallocs used during MatSetValues calls=0 >>> using I-node (on process 0) routines: found 336 nodes, limit used is 5 >>> >>> >>> Best regards, >>> >>> Xiaofeng >>> >>> >>>> On Jun 14, 2025, at 07:28, Barry Smith <bsm...@petsc.dev >>>> <mailto:bsm...@petsc.dev>> wrote: >>>> >>>> >>>> Matt, >>>> >>>> Perhaps we should add options -ksp_monitor_debug and >>>> -snes_monitor_debug that turn on all possible monitoring for the >>>> (possibly) nested solvers and all of their converged reasons also? Note >>>> this is not completely trivial because each preconditioner will have to >>>> supply its list based on the current solver options for it. >>>> >>>> Then we won't need to constantly list a big string of problem specific >>>> monitor options to ask the user to use. >>>> >>>> Barry >>>> >>>> >>>> >>>> >>>>> On Jun 13, 2025, at 9:09 AM, Matthew Knepley <knep...@gmail.com >>>>> <mailto:knep...@gmail.com>> wrote: >>>>> >>>>> On Thu, Jun 12, 2025 at 10:55 PM hexioafeng <hexiaof...@buaa.edu.cn >>>>> <mailto:hexiaof...@buaa.edu.cn>> wrote: >>>>>> Dear authors, >>>>>> >>>>>> I tried -pc_type game -pc_gamg_parallel_coarse_grid_solver and -pc_type >>>>>> field split -pc_fieldsplit_detect_saddle_point -fieldsplit_0_ksp_type >>>>>> pronely -fieldsplit_0_pc_type game -fieldsplit_0_mg_coarse_pc_type sad >>>>>> -fieldsplit_1_ksp_type pronely -fieldsplit_1_pc_type Jacobi >>>>>> _fieldsplit_1_sub_pc_type for , both options got the >>>>>> KSP_DIVERGE_PC_FAILED error. >>>>> >>>>> With any question about convergence, we need to see the output of >>>>> >>>>> -ksp_view -ksp_monitor_true_residual -ksp_converged_reason >>>>> -fieldsplit_0_mg_levels_ksp_monitor_true_residual >>>>> -fieldsplit_0_mg_levels_ksp_converged_reason >>>>> -fieldsplit_1_ksp_monitor_true_residual -fieldsplit_1_ksp_converged_reason >>>>> >>>>> and all the error output. >>>>> >>>>> Thanks, >>>>> >>>>> Matt >>>>> >>>>>> Thanks, >>>>>> >>>>>> Xiaofeng >>>>>> >>>>>> >>>>>>> On Jun 12, 2025, at 20:50, Mark Adams <mfad...@lbl.gov >>>>>>> <mailto:mfad...@lbl.gov>> wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Jun 12, 2025 at 8:44 AM Matthew Knepley <knep...@gmail.com >>>>>>> <mailto:knep...@gmail.com>> wrote: >>>>>>>> On Thu, Jun 12, 2025 at 4:58 AM Mark Adams <mfad...@lbl.gov >>>>>>>> <mailto:mfad...@lbl.gov>> wrote: >>>>>>>>> Adding this to the PETSc mailing list, >>>>>>>>> >>>>>>>>> On Thu, Jun 12, 2025 at 3:43 AM hexioafeng <hexiaof...@buaa.edu.cn >>>>>>>>> <mailto:hexiaof...@buaa.edu.cn>> wrote: >>>>>>>>>> >>>>>>>>>> Dear Professor, >>>>>>>>>> >>>>>>>>>> I hope this message finds you well. >>>>>>>>>> >>>>>>>>>> I am an employee at a CAE company and a heavy user of the PETSc >>>>>>>>>> library. I would like to thank you for your contributions to PETSc >>>>>>>>>> and express my deep appreciation for your work. >>>>>>>>>> >>>>>>>>>> Recently, I encountered some difficulties when using PETSc to solve >>>>>>>>>> structural mechanics problems with Lagrange multiplier constraints. >>>>>>>>>> After searching extensively online and reviewing several papers, I >>>>>>>>>> found your previous paper titled "Algebraic multigrid methods for >>>>>>>>>> constrained linear systems with applications to contact problems in >>>>>>>>>> solid mechanics" seems to be the most relevant and helpful. >>>>>>>>>> >>>>>>>>>> The stiffness matrix I'm working with, K, is a block saddle-point >>>>>>>>>> matrix of the form (A00 A01; A10 0), where A00 is singular—just as >>>>>>>>>> described in your paper, and different from many other articles . I >>>>>>>>>> have a few questions regarding your work and would greatly >>>>>>>>>> appreciate your insights: >>>>>>>>>> >>>>>>>>>> 1. Is the AMG/KKT method presented in your paper available in PETSc? >>>>>>>>>> I tried using CG+GAMG directly but received a KSP_DIVERGED_PC_FAILED >>>>>>>>>> error. I also attempted to use CG+PCFIELDSPLIT with the following >>>>>>>>>> options: >>>>>>>>> >>>>>>>>> No >>>>>>>>> >>>>>>>>>> >>>>>>>>>> -pc_type fieldsplit -pc_fieldsplit_detect_saddle_point >>>>>>>>>> -pc_fieldsplit_type schur -pc_fieldsplit_schur_precondition selfp >>>>>>>>>> -pc_fieldsplit_schur_fact_type full -fieldsplit_0_ksp_type preonly >>>>>>>>>> -fieldsplit_0_pc_type gamg -fieldsplit_1_ksp_type preonly >>>>>>>>>> -fieldsplit_1_pc_type bjacobi >>>>>>>>>> >>>>>>>>>> Unfortunately, this also resulted in a KSP_DIVERGED_PC_FAILED >>>>>>>>>> error. Do you have any suggestions? >>>>>>>>>> >>>>>>>>>> 2. In your paper, you compare the method with Uzawa-type approaches. >>>>>>>>>> To my understanding, Uzawa methods typically require A00 to be >>>>>>>>>> invertible. How did you handle the singularity of A00 to construct >>>>>>>>>> an M-matrix that is invertible? >>>>>>>>>> >>>>>>>>> >>>>>>>>> You add a regularization term like A01 * A10 (like springs). See the >>>>>>>>> paper or any reference to augmented lagrange or Uzawa >>>>>>>>> >>>>>>>>> >>>>>>>>>> 3. Can i implement the AMG/KKT method in your paper using existing >>>>>>>>>> AMG APIs? Implementing a production-level AMG solver from scratch >>>>>>>>>> would be quite challenging for me, so I’m hoping to utilize existing >>>>>>>>>> AMG interfaces within PETSc or other packages. >>>>>>>>>> >>>>>>>>> >>>>>>>>> You can do Uzawa and make the regularization matrix with >>>>>>>>> matrix-matrix products. Just use AMG for the A00 block. >>>>>>>>> >>>>>>>>> >>>>>>>>>> 4. For saddle-point systems where A00 is singular, can you recommend >>>>>>>>>> any more robust or efficient solutions? Alternatively, are you aware >>>>>>>>>> of any open-source software packages that can handle such cases >>>>>>>>>> out-of-the-box? >>>>>>>>>> >>>>>>>>> >>>>>>>>> No, and I don't think PETSc can do this out-of-the-box, but others >>>>>>>>> may be able to give you a better idea of what PETSc can do. >>>>>>>>> I think PETSc can do Uzawa or other similar algorithms but it will >>>>>>>>> not do the regularization automatically (it is a bit more complicated >>>>>>>>> than just A01 * A10) >>>>>>>> >>>>>>>> One other trick you can use is to have >>>>>>>> >>>>>>>> -fieldsplit_0_mg_coarse_pc_type svd >>>>>>>> >>>>>>>> This will use SVD on the coarse grid of GAMG, which can handle the >>>>>>>> null space in A00 as long as the prolongation does not put it back in. >>>>>>>> I have used this for the Laplacian with Neumann conditions and for >>>>>>>> freely floating elastic problems. >>>>>>>> >>>>>>> >>>>>>> Good point. >>>>>>> You can also use -pc_gamg_parallel_coarse_grid_solver to get GAMG to >>>>>>> use a on level iterative solver for the coarse grid. >>>>>>> >>>>>>>> Thanks, >>>>>>>> >>>>>>>> Matt >>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Mark >>>>>>>>>> >>>>>>>>>> Thank you very much for taking the time to read my email. Looking >>>>>>>>>> forward to hearing from you. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Sincerely, >>>>>>>>>> >>>>>>>>>> Xiaofeng He >>>>>>>>>> ----------------------------------------------------- >>>>>>>>>> >>>>>>>>>> Research Engineer >>>>>>>>>> >>>>>>>>>> Internet Based Engineering, Beijing, China >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> What most experimenters take for granted before they begin their >>>>>>>> experiments is infinitely more interesting than any results to which >>>>>>>> their experiments lead. >>>>>>>> -- Norbert Wiener >>>>>>>> >>>>>>>> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!byYxhIBJt_hYquyBdn7tu8cOQZhdItp2R6lnYK5xb64Ums47URE9JMIkS73yNRFqYf6smAJ-0ss8pTCDv4S8C8te60bgDg$ >>>>>>>> >>>>>>>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!f-YJSzthRa7atIa1xs1GPHW53hGIqSenvp1eO2kDsSyf4jv1_Vp0kL9Lg8pyyPeG8al4Im8XlLqGRHw1FxYh$> >>>>> >>>>> >>>>> >>>>> -- >>>>> What most experimenters take for granted before they begin their >>>>> experiments is infinitely more interesting than any results to which >>>>> their experiments lead. >>>>> -- Norbert Wiener >>>>> >>>>> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!byYxhIBJt_hYquyBdn7tu8cOQZhdItp2R6lnYK5xb64Ums47URE9JMIkS73yNRFqYf6smAJ-0ss8pTCDv4S8C8te60bgDg$ >>>>> >>>>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!f-YJSzthRa7atIa1xs1GPHW53hGIqSenvp1eO2kDsSyf4jv1_Vp0kL9Lg8pyyPeG8al4Im8XlLqGRHw1FxYh$> >>>> >>> >> >> >> >> -- >> What most experimenters take for granted before they begin their experiments >> is infinitely more interesting than any results to which their experiments >> lead. >> -- Norbert Wiener >> >> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!byYxhIBJt_hYquyBdn7tu8cOQZhdItp2R6lnYK5xb64Ums47URE9JMIkS73yNRFqYf6smAJ-0ss8pTCDv4S8C8te60bgDg$ >> >> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!dYETsi-moODALE1tmLrk5pxFKF9l552nNiC0cBgsCQ9ebugJWHtsNYa0QBS5Gmws9J_VC_Iec3Nx0c1FgNl1$>