[petsc-users] Saddle point problem with nested matrix and a relatively small number of Lagrange multipliers

Olivier Jamond olivier.jamond at cea.fr
Thu Sep 3 10:43:13 CDT 2020


Hello,

I am working on a finite-elements/finite-volumes code, whose distributed 
solver is based on petsc. For FE, it relies on Lagrange multipliers for 
the imposition of various boundary conditions or interactions (simple 
dirichlet, contact, ...). This results in saddle point problems:

[K C^t][U]=[F]
[C  0 ][L] [D]

Most of the time, the relations related to the matrix C are applied to 
dofs on the boundary of the domain. Then the size of L is much smaller 
than the size of U, which becomes more and more true as  the mesh is 
refined.

The code construct this matrix as a nested matrix (one of the reason is 
that for some interactions such as contact, whereas being quite small, 
the size of the matrix C change constantly, and having it 'blended' into 
a monolithic 'big' matrix would require to recompute its profile/ 
reallocate / ... each time), and use fieldsplit preconditioner of type 
PC_COMPOSITE_SCHUR. I would like to solve the system using iterative 
methods to access good extensibility on a large number of subdomains.

Simple BC such as Dirichlet can be eliminated into K (and must be in 
order to make K invertible).

My problem is the computational cost of these constraints treated with 
Lagrange multipliers, whereas their number becomes more and more 
neglectable as the mesh is refined. To give an idea, let's consider a 
simple elastic cube with dirichlet BCs which are all eliminated (to 
ensure invertibility of K) but one on a single dof.

-ksp_type preonly
-pc_type fieldsplit
-pc_fieldsplit_type schur
-pc_fieldsplit_schur_factorization_type full
-pc_fieldsplit_schur_precondition selfp

-fieldsplit_u_ksp_type cg
-fieldsplit_u_pc_type bjacobi

-fieldsplit_l_ksp_type cg
-fieldsplit_l_pc_type bjacobi

it seems that my computation time is multiplied by a factor 3: 3 ksp 
solves of the big block 'K' are needed to apply the schur preconditioner 
(assuming that the ksp(S,Sp) converges in 1 iteration). It seems 
expensive for a single dof dirichlet!

And for some relations treated by Lagrange multipliers which involve 
many dofs, the number of ksp solve of the big block 'K' is ( 2 + number 
of iteration of ksp(S,Sp)). To reduce this, one can think about solving 
the ksp(S,Sp) with a direct solver, but then one must use 
"-pc_fieldsplit_schur_precondition self" which is advised against in the 
documentation...

To illustrate this, on a small elasticity case: 32x32x32 cube on 8 
processors, dirichlet on the top and bottom faces:
* if all the dirichlet are eliminated (no C matrix, monolithic solve of 
the K bloc)
   - computation time for the solve: ~400ms
* if only the dirichlet of the bottom face are eliminated
   - computation time for the solve: ~35000ms
   - number of iteration of ksp(S,Sp): 37
   - total number of iterations of ksp(K): 4939
* only the dirichlet of the bottom face are eliminated with these options:
-ksp_type fgmres
-pc_type fieldsplit
-pc_fieldsplit_type schur
-pc_fieldsplit_schur_factorization_type full
-pc_fieldsplit_schur_precondition selfp

-fieldsplit_u_ksp_type cg
-fieldsplit_u_pc_type bjacobi

-fieldsplit_l_ksp_type cg
-fieldsplit_l_pc_type bjacobi
-fieldsplit_l_ksp_rtol 1e-10
-fieldsplit_l_inner_ksp_type preonly
-fieldsplit_l_inner_pc_type jacobi
-fieldsplit_l_upper_ksp_type preonly
-fieldsplit_l_upper_pc_type jacobi

   - computation time for the solve: ~50000ms
   - total number of iterations of ksp(K): 7424
   - 'main' ksp number of iterations: 7424

Then in the end, my question is: is there a smarter way to handle such 
'small' constraint matrices C, with the (maybe wrong) idea that a small 
number of extra dofs (the lagrange multipliers) should result in a small 
extra computation time ?

Thanks!



More information about the petsc-users mailing list