trilinos / Trilinos

Primary repository for the Trilinos Project
https://trilinos.org/
Other
1.2k stars 563 forks source link

Teko: Using Teko to construct a custom block diagonal preconditioner for the saddle point problem #7422

Closed SreevatsaAnantharamu closed 4 years ago

SreevatsaAnantharamu commented 4 years ago

Question

@trilinos/\<Teko>

I am wondering about how to use Teko to construct the following custom block-diagonal preconditioner for the following saddle point problem that arises from stable mixed FEM discretization for incompressible elasticity, [K G] [u] = [bu] [GT 0] [p] = [bp] Here, K is a symmetric positive definite stiffness matrix, G is the gradient matrix, and GT is the transpose of G.

The block-diagonal preconditioner that I would like to create for the MINRES iterations of the above saddle point problem is

P^{-1} = [(K_{AMG})^{-1} 0 ] [ 0 M^{-1}]

where (K_{AMG})^{-1} is the action of the AMG preconditioner on a vector, M^{-1} is a sparse matrix whose entries I explicitly know. This preconditioner is from a paper by Elman et al. (2007).

I have K, G, GT, M^{-1} stored as TPETRACRSMATRICES. I have the action of (K_{AMG})^{-1} as a MUELU preconditioner and have setup MINRES as a BELOS solver.

I know that the Teko package within Trilinos provides block-preconditioning capabilities, but I am unsure how to use it to construct the above block-diagonal preconditioner. Can you please help me out with this? Is there any example code that I can look into that would help me? I tried looking into tests and example directories within Teko package, but could not find.

Thanks, Sreevatsa

jhux2 commented 4 years ago

@trilinos/teko

cgcgcg commented 4 years ago

@SreevatsaAnantharamu You could have a look at MiniEM, and the block preconditioner it uses: https://github.com/trilinos/Trilinos/blob/master/packages/panzer/mini-em/src/solvers/MiniEM_FullMaxwellPreconditionerFactory.cpp

SreevatsaAnantharamu commented 4 years ago

@cgcgcg Thanks for the referring me to the code https://github.com/trilinos/Trilinos/blob/master/packages/panzer/mini-em/src/solvers/MiniEM_FullMaxwellPreconditionerFactory.cpp

I will look into the MiniEM_FullMaxwellPreconditionerFactory.cpp and try to make my custom block preconditioner.

SreevatsaAnantharamu commented 4 years ago

I was able to successfully create my custom block preconditioner. Thanks to @eric-c-cyr for clarifying many of my doubts and @cgcgcg for pointing me to the Maxwell preconditioner factory.

I am closing this issue.