This is what Matt is looking at:

                PC Object: (fieldsplit_0_mg_coarse_sub_) 1 MPI processes
                      type: lu

This should be svd, not lu

If you had used -options_left you would have caught this mistake(s)

On Thu, Jun 19, 2025 at 8:06 AM Matthew Knepley <knep...@gmail.com> wrote:

> On Thu, Jun 19, 2025 at 7:59 AM hexioafeng <hexiaof...@buaa.edu.cn> wrote:
>
>> Hello sir,
>>
>> I remove the duplicated "_type", and get the same error and output.
>>
>
> The output cannot be the same. Please send it.
>
>   Thanks,
>
>      Matt
>
>
>> Best regards,
>> Xiaofeng
>>
>>
>> On Jun 19, 2025, at 19:45, Matthew Knepley <knep...@gmail.com> wrote:
>>
>> This options is wrong
>>
>>   -fieldsplit_0_mg_coarse_sub_pc_type_type svd
>>
>> Notice that "_type" is repeated.
>>
>>   Thanks,
>>
>>       Matt
>>
>> On Thu, Jun 19, 2025 at 7:10 AM hexioafeng <hexiaof...@buaa.edu.cn>
>> wrote:
>>
>>> 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>
>>> wrote:
>>>
>>>> On Sun, Jun 15, 2025 at 9:46 PM hexioafeng <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> 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>
>>>>> wrote:
>>>>>
>>>>> On Thu, Jun 12, 2025 at 10:55 PM hexioafeng <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> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, Jun 12, 2025 at 8:44 AM Matthew Knepley <knep...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> On Thu, Jun 12, 2025 at 4:58 AM Mark Adams <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>
>>>>>>>> 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!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGMjX_0bM$
>>>>>>>  
>>>>>>> <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!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGMjX_0bM$
>>>>>  
>>>>> <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!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGMjX_0bM$
>>>>  
>>>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!dYETsi-moODALE1tmLrk5pxFKF9l552nNiC0cBgsCQ9ebugJWHtsNYa0QBS5Gmws9J_VC_Iec3Nx0c1FgNl1$>
>>>>
>>>
>>>
>>
>> --
>> 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!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGMjX_0bM$
>>  
>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGIXnhYhE$
>>  >
>>
>>
>>
>
> --
> 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!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGMjX_0bM$
>  
> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cHB4OLTr7QlRt1fr_h3k0qkn0X-IFHj6y0za4fcxzLznrzyfWFSlsBK-cCaFEQ5yyGBQ91BQj2f5S0NGIXnhYhE$
>  >
>

Reply via email to