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.mayhe...@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 <aks084...@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 > >