column-based block-Jacobi preconditioner in firedrake
Dear firedrakers (and Colin), is there an easy way of building a PETSc-based block-Jacobi preconditioner for a mixed system in firedrake? So if I have the mixed system in velocity, buoyancy, pressure, can I tell PETSc that the dofs in one vertical column belong together, i.e. the full vector has a block-structure, and then use a block-Jacobi preconditioner? Or does that make no sense if I have a horizontally continuous space? Colin, in your full model, do you use the Schur-complement preconditioner and have you tried replacing it with a block-Jacobi)? Do you have a non-linear shallow water code lying around, in which we would test replacing the Schur-complement preconditioner with point-Jacobi? We’re thinking about using this as a short term alternative for the full Schur-complement preconditioner in GungHo. Thanks, Eike
On 11 Sep 2015, at 17:05, Eike Mueller <E.Mueller@bath.ac.uk> wrote:
Dear firedrakers (and Colin),
is there an easy way of building a PETSc-based block-Jacobi preconditioner for a mixed system in firedrake? So if I have the mixed system in velocity, buoyancy, pressure, can I tell PETSc that the dofs in one vertical column belong together, i.e. the full vector has a block-structure, and then use a block-Jacobi preconditioner? Or does that make no sense if I have a horizontally continuous space?
Block Jacobi is a broad church, can you describe what you mean in more detail? Do you want to use a block diagonal preconditioner where the blocks are the three variables. Or do you want to decouple into columns and invert all the variables in the same column simultaneously. Or something else? Cheers, Lawrence
Hi Lawrence,
Block Jacobi is a broad church, can you describe what you mean in more detail? Do you want to use a block diagonal preconditioner where the blocks are the three variables.
I want to do this:
Or do you want to decouple into columns and invert all the variables in the same column simultaneously.
However, I realise that this might not be entirely well defined. For spaces which are horizontally discontinuous, I want to treat all variables that are associated with the same horizontal grid cell as one block. For a horizontally continuous space I probably want to treat all variables as one block which correspond to the same basis function in the 3d reference element of the base cell in a vertical column. So for example, looking at the grid from the side: For a horizontally discontinuous space: +-A-A-+ ! A A ! +-A-A-+ ! A A ! +-A-A-+ For a horizontally continuous space: +—B—+ A C +—B—+ A C +—B—+ (variables with the same letter are in the same block). I’m not necessarily saying that that makes sense mathematically, and that the preconditioner will be effective. Thanks, Eike
Or something else?
Cheers,
Lawrence _______________________________________________ firedrake mailing list firedrake@imperial.ac.uk https://mailman.ic.ac.uk/mailman/listinfo/firedrake
On 11 Sep 2015, at 18:34, Eike Mueller <E.Mueller@bath.ac.uk> wrote:
Hi Lawrence,
Block Jacobi is a broad church, can you describe what you mean in more detail? Do you want to use a block diagonal preconditioner where the blocks are the three variables.
I want to do this:
Or do you want to decouple into columns and invert all the variables in the same column simultaneously.
However, I realise that this might not be entirely well defined.
OK, so I think it's entirely well defined because at the level of the operator you're dealing with a dof partitioning (not a cell partitioning).
For spaces which are horizontally discontinuous, I want to treat all variables that are associated with the same horizontal grid cell as one block. For a horizontally continuous space I probably want to treat all variables as one block which correspond to the same basis function in the 3d reference element of the base cell in a vertical column.
So for example, looking at the grid from the side:
For a horizontally discontinuous space: +-A-A-+ ! A A ! +-A-A-+ ! A A ! +-A-A-+
For a horizontally continuous space: +—B—+ A C +—B—+ A C +—B—+
(variables with the same letter are in the same block).
I’m not necessarily saying that that makes sense mathematically, and that the preconditioner will be effective.
OK, so you can do this, not with a block jacobi preconditioner (since the blocking will not be regular). Instead you need to use an additive schwarz preconditioner. Note that block jacobi is just ASM with zero overlap on the subdomains. You'll need to use the PCASMSetLocalSubdomains to do this and pass in appropriate index sets (PETSc IS objects) defining the dof indices for each block. You pass one IS per block. I think you'll only need to pass the "is" argument and not the is_local argument as well. Cheers, Lawrence
participants (2)
- 
                
                Eike Mueller
- 
                
                Lawrence Mitchell