[petsc-users] Shell preconditioner within a fieldsplit

Safin, Artur aks084000 at utdallas.edu
Mon Nov 14 13:38:05 CST 2016


Barry, Dave,


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

Thank you for the help!

Artur
________________________________
From: Dave May <dave.mayhem23 at gmail.com>
Sent: Monday, November 14, 2016 1:20 AM
To: Safin, Artur; petsc-users at mcs.anl.gov
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 <dave.mayhem23 at gmail.com<mailto:dave.mayhem23 at gmail.com>> 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 <aks084000 at utdallas.edu<mailto:aks084000 at utdallas.edu>> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20161114/539069c3/attachment.html>


More information about the petsc-users mailing list