The difference between IS(1), IS(2) and IS(1)',IS(2)' is that they operate on two different matrices. The former operate on A whereas the operates on S and these matrices have different sizes so it's not obvious to me that they IS would be identical? I guess it depends on the initial ordering of the blocks of A, if A00 is actually the bottom right block then I can see how the two are the same.

But just to get a confirmation here is a simple example: let's assume I solve a 2D problem with momentum and energy conservation.
In that case I get three equations per nodes:

C1*d^2 u_x/dx^2 + C2*d^2 u_y/dxdy + a*dT/dt= fx      ---> IS(0)
C3*d^2 u_x/dxdy + C4*d^2 u_y/dy^2 + a*dT/dt = fy     ---> IS(1)
dT/dt + kappa*(d^2 T/dx^2 + d^2 T/dy^2) = fT            ---> IS(2)

This leads to a block matrix with 3x3 block per nodes. If I extract the temperature problem, invert it and compute the schur complement I will end up with S with the same size as the elasticity part of the problem but will the IS(0) and IS(1) be the same for the jacobian and the Schur complement? If that's the case that's awesome that you programmed it to keep track of these things!

Best,
Luc

On 03/26/2015 06:05 PM, Matthew Knepley wrote:
On Thu, Mar 26, 2015 at 4:06 PM, Luc Berger-Vergiat <[email protected] <mailto:[email protected]>> wrote:

    Ok,
    this work is still part of my Schur complement approach using the
    full schur but with a block diagonal A00^-1.
    I implemented the computation of A00^-1 by extracting each
    diagonal block and inverting them individually.
    This works quite well and does not cost some much, especially
    since I can still use threads to accelerate this process (I might
    send a question about this in the future...).

    At the moment the most expensive part of the procedure is
    inverting S (I'm using LU at the moment to make sure that
    everything is implemented correctly) and the second most expensive
    procedure is MatMatMult. I'm doing two of these: A10 * A00^-1 and
    then a right multiplication by A01.
    Decreasing that cost would be nice (I attached the output of
    -log_summary for reference).
    I think I need to look for the objects that are not Destroyed too.


We will look, but this is a notoriously hard thing to speed up. You might try the RAP code instead.

    Finally I now would like to split the Schur complement into two
    submatrices. I have an IS that tracks location of these
    sub-matrices in the global system:

           [ A00  A01  A02 ]  --> IS(0)
    A = [ A10  A11  A12 ]  --> IS(1)
           [ A20  A21  A22 ]  --> IS(2)

    How can I use IS(1) and IS(2) to track:

S = [ A11 A12 ] _ [ A10] * [A00]^-1 * [ A01 A02 ] = [ S11 S12 ] --> IS(1)'
             [ A21  A22 ]     [
    A20]                                          = [ S21 S22 ]  -->
    IS(2)'

    or is there a simple way to compute IS(1)' and IS(2)' based on
    IS(1) and IS(2)?


Aren't they identical?

  Thanks,

     Matt

    Thanks!

    Best,
    Luc

    On 03/26/2015 04:12 PM, Matthew Knepley wrote:
    On Thu, Mar 26, 2015 at 3:07 PM, Luc Berger-Vergiat
    <[email protected] <mailto:[email protected]>> wrote:

        Hi all,
        I want to multiply two matrices together, one is MATAIJ and
        the second is MATBAIJ, is there a way to leverage the
        properties of the blocked matrix in the BAIJ format or should
        I just assemble the BAIJ matrix as AIJ?


    I am afraid you are currently stuck with the latter.

      Thanks,

        Matt


-- Best,
        Luc





-- 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




--
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

Reply via email to