On Tue, Jun 30, 2015 at 3:10 PM, Sander Land <sander.land@gmail.com> wrote: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.If this is embedded in a SNES, it is very messy to yank it out and do thing manually. However, if youset the matrix in the PC manually, it might work.However, I would encourage you to try an alternate scheme and see if you think it is easier. We havestarted to use the DM object to hold this kind of information. For FieldSplit, I think it is easier to tella DMShell about your field division, and then have it pass this on to PCFIELDSPLIT. So you woulda) Create a DMSHELLb) Create a PetscSection and call DMSetDefaultSection()c) Call SNESSetDM()d) use command line options to configure the split -pc_fieldsplit_0_fields 0 -pc_fieldsplit_1_fields 1Then everything should work, and can work in any embedded context. Does this make sense?Thanks,MattThanks,SanderOn Tue, Jun 30, 2015 at 2:09 PM, Matthew Knepley <knepley@gmail.com> wrote:On Tue, Jun 30, 2015 at 11:43 AM, Sander Land <sander.land@gmail.com> 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.cCode 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,MattThanks,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--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