[petsc-users] MatNest with Shell blocks for multipysics

Jed Brown jed at jedbrown.org
Thu Jul 1 10:52:07 CDT 2021

Matteo Semplice <matteo.semplice at uninsubria.it> writes:

> Hi.
> We are designing a PETSc application that will employ a SNES solver on a 
> multiphysics problem whose jacobian will have a 2x2 block form, say 
> A=[A00,A01;A10,A11]. We already have code for the top left block A_00 (a 
> MatShell and a related Shell preconditioner) that we wish to reuse. We 
> could implement the other blocks as Shells or assembled matrices. We'd 
> like also to compare our method with existing ones, so we'd like to be 
> quite flexible in the choice of KSP and PC within the SNES. (To this 
> end, implementing an assembled version of the A00 and the other blocks 
> would be easy)
> I am assuming that, in order to have one or more shell blocks, the full 
> jacobian should be a nested matrix, and I am wondering what is the best 
> way to design the code.
> We are going to use DMDA's to manipulate Vecs for both variable sets, so 
> the DMComposite approach of 
> https://www.mcs.anl.gov/petsc/petsc-current/src/snes/tutorials/ex28.c.html 
> is intriguing, but I have read in the comments that it has issues with 
> MatNest type.

I think ex28 is better organization of code. You can DMCreateMatrix() and then set types/preallocation for off-diagonal blocks of the MatNest. I think the comment is unclear and not quite what was intended and originally worked (which was to assemble the off-diagonal blocks despite bad preallocation).



Note that if you're using DMDA and have collocated fields, you can skip all this complexity. And if you have a scattered discretization, consider DMStag. ex28 is showing how to solve a coupled problem where there is no suitable structure to convey the relation between discretizations.

> My next guess would be to create the four submatrices ahead and then 
> insert them in a MatNest, like in the Stokes example of 
> https://www.mcs.anl.gov/petsc/petsc-current/src/snes/tutorials/ex70.c.html. 
> However, in order to have shell blocks I guess it is almost mandatory to 
> have the matrix partitioned among cpus as the Vecs are and I don't 
> understand how Vecs end up being partitioned in ex70.

More information about the petsc-users mailing list