# Re: [petsc-users] multiply a mpibaij matrix by its block diagonal inverse

```Yes, the preconditioner is like a multi-stage pccomposite preconditioner.
In one stage, I just precondition a subset of matrix corresponding to
certain physical unknowns. To get a better decoupled submatrix, I need to
apply that operation.```
```
Thanks.

Xiangdong

On Wed, Feb 14, 2018 at 9:39 AM, Matthew Knepley <knep...@gmail.com> wrote:

> On Wed, Feb 14, 2018 at 9:29 AM, Xiangdong <epsco...@gmail.com> wrote:
>
>> The reason for the operation invdiag(A)*A is to have a decoupled
>> matrix/physics for preconditioning. For example, after the transformation,
>> the diagonal block is identity matrix ( e.g. [1,0,0;0,1,0;0,0,1]  for
>> bs=3). One can extract a submatrix (e.g. corresponding to only first
>> unknown) and apply special preconditioners for the extracted/decoupled
>> matrix. The motivation is that after the transformation, one can get a
>> better decoupled matrix to preserve the properties of the unknowns.
>>
>
> Barry's point is that this operation is usually rolled into the
> preconditioner itself, as in his example of PBJACOBI. Are you building this
> preconditioner yourself?
>
>    Matt
>
>
>> Thanks.
>>
>> Xiangdong
>>
>> On Tue, Feb 13, 2018 at 6:27 PM, Smith, Barry F. <bsm...@mcs.anl.gov>
>> wrote:
>>
>>>
>>>  In general you probably don't want to do this. Most good
>>> preconditioners (like AMG) rely on the matrix having the "natural" scaling
>>> that arises from the discretization and doing a scaling like you describe
>>> destroys that natural scaling. You can use PCPBJACOBI to use point block
>>> Jacobi preconditioner on the matrix without needing to do the scaling up
>>> front. The ILU preconditioners for BAIJ matrices work directly with the
>>> block structure so again pre-scaling the matrix buys you nothing. PETSc
>>> doesn't have any particularly efficient routines for computing what you
>>> desire, the only way to get something truly efficient is to write the code
>>> directly using the BAIJ data structure, doable but probably not worth it.
>>>
>>>   Barry
>>>
>>>
>>> > On Feb 13, 2018, at 5:21 PM, Xiangdong <epsco...@gmail.com> wrote:
>>> >
>>> > Hello everyone,
>>> >
>>> > I have a block sparse matrices A created from the DMDA3d. Before
>>> passing the matrix to ksp solver, I want to apply a transformation to this
>>> matrix: namely A:= invdiag(A)*A. Here invdiag(A) is the inverse of the
>>> block diagonal of A. What is the best way to get the transformed matrix?
>>> >
>>> > At this moment, I created a new mat IDA=inv(diag(A)) by looping
>>> through each row and call MatMatMult to get B=invdiag(A)*A, then destroy
>>> the temporary matrix B. However, I prefer the in-place transformation if
>>> possible, namely, without the additional matrix B for memory saving purpose.
>>> >
>>> > Do you have any suggestion on compute invdiag(A)*A for mpibaij matrix?
>>> >
>>> > Thanks for your help.
>>> >
>>> > Best,
>>> > Xiangdong
>>> >
>>> >
>>> >
>>> >
>>>
>>>
>>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their