This gives [0]PETSC ERROR: Object is in wrong state [0]PETSC ERROR: Matrix must be set first The PC is from a SNESGetKSP, and I have called SNESSetJacobian before this. Thanks, Sander On Tue, Jun 30, 2015 at 2:09 PM, Matthew Knepley <[email protected]> wrote:
On Tue, Jun 30, 2015 at 11:43 AM, Sander Land <[email protected]> wrote:
I am trying to use the Schur complement preconditioner in petsc, but am encountering a null argument error calling PCFieldSplitGetSubKSP. This only happens on PC_COMPOSITE_SCHUR, the multiplicative/additive options do return a KSP array.
Error message:
[0]PETSC ERROR: --------------------- Error Message -------------------------------------------------------------- [0]PETSC ERROR: Null argument, when expecting valid pointer [0]PETSC ERROR: Null Object: Parameter # 1 [0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for trouble shooting. [0]PETSC ERROR: Petsc Release Version 3.6.0, Jun, 09, 2015 [0]PETSC ERROR: ./elecmech on a arch-linux2-cxx-debug [0]PETSC ERROR: Configure options --with-shared-libraries=1 --with-debugging=1 --download-openmpi=1 --with-clanguage=c++ --download-fblaslapack=1 --download-scalapack=1 --download-blacs=1 --download-suitesparse=1 --download-pastix=1 --download-superlu=1 --dowload-essl=1 --download-ptscotch=1 --download-mumps=1 --download-lusol=1 [0]PETSC ERROR: #1 MatSchurComplementGetKSP() line 317 in petsc-3.6/src/ksp/ksp/utils/schurm.c [0]PETSC ERROR: #2 PCFieldSplitGetSubKSP_FieldSplit_Schur() line 1264 in petsc-3.6/src/ksp/pc/impls/fieldsplit/fieldsplit.c [0]PETSC ERROR: #3 PCFieldSplitGetSubKSP() line 1668 in petsc-3.6/src/ksp/pc/impls/fieldsplit/fieldsplit.c
Code snippet:
ISCreateGeneral(PETSC_COMM_SELF,xp_dofs,&ii[0],PETSC_COPY_VALUES,&is_xp); ISCreateGeneral(PETSC_COMM_SELF,all_dofs - xp_dofs,&ii[xp_dofs],PETSC_COPY_VALUES,&is_wk);
PCSetType(pc,PCFIELDSPLIT); PCFieldSplitSetType(pc,PC_COMPOSITE_SCHUR); PCFieldSplitSetIS(pc,"xp",is_xp); PCFieldSplitSetIS(pc,"wk",is_wk); int n; KSP* ksps; PC subpc; PCFieldSplitGetSubKSP(pc,&n,&ksps);
ii here is simply an array with ii[i] = i. There is probably a better way to simply indicate two blocks of different size, but I couldn't find it.
It looks like the PC is not setup. Can you try calling PCSetUp(pc) before GetSubKSP()?
Thanks,
Matt
Thanks, Sander
-- 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