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 <[email protected]> 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 <[email protected]
> <mailto:[email protected]>> wrote:
>> On Sun, Jun 15, 2025 at 9:46 PM hexioafeng <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>> <mailto:[email protected]>> wrote:
>>>>>
>>>>> On Thu, Jun 12, 2025 at 10:55 PM hexioafeng <[email protected]
>>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>>>> <mailto:[email protected]>> wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Jun 12, 2025 at 8:44 AM Matthew Knepley <[email protected]
>>>>>>> <mailto:[email protected]>> wrote:
>>>>>>>> On Thu, Jun 12, 2025 at 4:58 AM Mark Adams <[email protected]
>>>>>>>> <mailto:[email protected]>> wrote:
>>>>>>>>> Adding this to the PETSc mailing list,
>>>>>>>>>
>>>>>>>>> On Thu, Jun 12, 2025 at 3:43 AM hexioafeng <[email protected]
>>>>>>>>> <mailto:[email protected]>> 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$>