Barry, Dave,

Turns out both your suggestions were necessary to get the preconditioner 
working properly.

Thank you for the help!

Artur
________________________________
From: Dave May <[email protected]>
Sent: Monday, November 14, 2016 1:20 AM
To: Safin, Artur; [email protected]
Subject: Re: [petsc-users] Shell preconditioner within a fieldsplit

Damn - the last part of my email is wrong. You want to set the PCType to "mat". 
KSPType preonly is fine

On Mon, 14 Nov 2016 at 07:04, Dave May 
<[email protected]<mailto:[email protected]>> wrote:
Looks like you want the contents of your mat shell, specifically the op Ax, to 
define the action of the preconditioner.

You need to either create a PCShell (rather than a MatShell), and define the 
operation called by PCApply(), or keep you current shell but change "preonly" 
to "mat".

http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PCMAT.html#PCMAT

Thanks
Dave

On Mon, 14 Nov 2016 at 06:36, Safin, Artur 
<[email protected]<mailto:[email protected]>> wrote:

Hello,


What is the proper way to set up a shell preconditioner within a fielsplit? I 
have tried it on my own, but do not get the proper behavior. The relevant 
portion looks like this:


__________________________________________________________________

// Global System
KSPSetOperators(ksp, A, A);

// Skipped code..



// Shell Preconditioner for the pressure sub-block

KSP *subksp;

PCFieldSplitGetSubKSP(pc, NULL, &subksp);

Mat pressureA;
KSPSetType(subksp[0], "preonly");
MatCreateShell(MPI_COMM_WORLD, n_local_P_dofs, n_local_P_dofs, , 
PETSC_DETERMINE, PETSC_DETERMINE, &pressureA);
MatShellSetOperation(pressureA, MATOP_MULT, (void(*)(void)) PressureBlock);
KSPSetOperators(subksp[0], pressureA, pressureA);


// Skipped code..



KSPSetUp(ksp);

KSPSolve(ksp, b, x);

__________________________________________________________________


The fieldsplit component works fine; the solver however does not go into the 
custom function PressureBlock(), so I am curious as to what the correct 
approach is.


Best,


Artur

Reply via email to