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
