On Wed, Jun 10, 2015 at 7:23 PM, Asbjørn Nilsen Riseth < [email protected]> wrote:
> Hi Matt, > > 1) K = > [ I 0 ; > -A10*inv(diag(A00)) I ] > Okay, it looks like this is some sort of weird approximate Schur complement. The right thing to do I think is to get everything written out in linear algebra language, since I think you can just use FieldSplit+PCComposite to do this from the command line. This one looks similar to SIMPLE. The paper by Shuttleworth, Elman, Shadid, etc. does a nice job of this kind of classification. It might help in the process. > There is a typo in my first email: S = Atilde11 = A11 - > A10*inv(diag(A00))*A01 > > 2) I'd like to have the linear solver close to what these people currently > use. My ultimate goal is to look at nonlinear solver strategies, not > improve their linear solver. I already have a PC that seems to work fine > for my purposes, but was hoping I could implement this version of CPR to > get even closer to their current systems. > Okay. Matt > Ozzy > > On Thu, 11 Jun 2015 at 00:54 Matthew Knepley <[email protected]> wrote: > >> On Wed, Jun 10, 2015 at 6:30 PM, Asbjørn Nilsen Riseth < >> [email protected]> wrote: >> >>> Dear PETSc community, >>> >>> I'm trying to implement a preconditioner used in reservoir modelling, >>> called Constrained Pressure Residual. >>> They apply a transformation to the linearised system we get from each >>> Newton step, before solving it. Then a 2-stage multiplicative >>> preconditioner on the transformed system. >>> >> >> 1) What is K? >> >> 2) Do you care about the 2-stage thing, or would any Stokes solver do? >> >> Thanks, >> >> Matt >> >> >>> The main problem is implementing step 1 below. >>> >>> Let A be the Jacobian, b the residual and K my transformation. >>> A = [A00 A01; A10 A11]. >>> The process is roughly like this: >>> 1) Set Atilde = KA, btilde = Kb. >>> - We want to solve Atilde x = btilde >>> >>> 2) Create a 2-stage multiplicative preconditioner using Atilde, btilde >>> pc0: This is only applied to the "fieldsplit 1" block of my system. >>> B_1 = [0 0; 0 S^-1] >>> Where S is a selfp Schur approximation from Atilde >>> S = Atilde11 - Atilde10 * inv(diag(Atilde00))* Atilde01 >>> pc1: This is a standard ILU on the whole system Atilde >>> >>> Currently I'm doing something like this >>> Step 1: >>> -ksp_type richardson -ksp_max_it 1 >>> -pc_type python >>> Then I create Atilde from KA in PCSetup, and a FGMRES ksp to take care >>> of step 2 with PCApply >>> >>> Step 2: >>> pc_type composite >>> pc_composite_type multiplicative >>> pc_composite_pcs python,ilu, >>> >>> Are there better ways of dealing with this transformation? >>> To me it looks similar to a 2-step right preconditioner on top of a left >>> preconditioner. >>> >>> Regards, >>> Ozzy >>> >> >> >> >> -- >> 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
