[petsc-users] Fieldsplit PC null pointer error on getksp

Sander Land sander.land at gmail.com
Thu Jul 16 05:33:23 CDT 2015


Yes, I figured I'd need to rewrite my dirichlet bc implementation to zero
out the row rather than remove the dof completely. For now I'm just
avoiding partial bcs.
Using MatSetBlockSize is a problem because the matrix has stuff after the
xyzxyz (hydrostatic pressure dofs and a few coupled things).
MatGetSubMatrix inherits the block size of 1, and I can't change it
afterwards.

Sander

On Thu, Jul 16, 2015 at 12:26 AM, Mark Adams <mfadams at lbl.gov> wrote:

> Note, you want to tell the matrix that it has these blocks with
> MatSetBlockSize, and do not remove a single DOF (like for BCs). That is,
> xyzxyxyz is not allowed.  The block size is critical for GAMG and would
> think HYPRE uses it also because it does OK on elasticity.
>
> On Wed, Jul 15, 2015 at 2:52 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>
>>
>> > On Jul 15, 2015, at 5:43 AM, Sander Land <sander.land at gmail.com> wrote:
>> >
>> > Hi Barry,
>> >
>> > I have some structures set up that map dofs to their respective matrix
>> indices, and it wasn't difficult to change them.
>> >
>> > However, now this call:
>> > MatMultAdd(ctxp->B,xp,bx,xxtmp);
>> > is directed to "MatMultAdd_SeqAIJ_Inode" and gives a vector lock error
>> at line 601 of mat/impls/aij/seq/inode.c
>> > ierr = VecGetArray(zz,&z);
>> > I think this is a bug and should be VecGetArrayRead as it doesn't need
>> to be written to.
>>
>>     Oh yes, this is a bug. I have fixed it in maint, master and next
>> >
>> > In the old xxxyyyzzz ordering this call went to MatMultAdd_SeqAIJ,
>> which (via VecGetArrayPair) does use VecGetArrayRead. I'm not sure what is
>> causing the different matrix formats.
>>
>>    When the values are interlaced the matrix has "identical nodes"
>> (i-nodes) which means certain rows have identical nonzero structure with
>> there neighbors and the AIJ matrix code automatically switches to the more
>> efficient Inode operations. This is why you only saw the bug with
>> interlacing.
>> >
>> > I'm also still not sure at what point I can change the matrix block
>> size to get the correct BoomerAMGSetNumFunctions.
>> >
>> > Thanks,
>> > Sander
>> >
>> >
>> >
>> >
>> >
>> > On Tue, Jul 14, 2015 at 6:34 PM, Barry Smith <bsmith at mcs.anl.gov>
>> wrote:
>> >
>> > > On Jul 14, 2015, at 11:37 AM, Sander Land <sander.land at gmail.com>
>> wrote:
>> > >
>> > > Hi Matt,
>> > >
>> > > Doing things to the PC like this has worked for me for a long time.
>> It just happened to be formerly KSPPREONLY/PCLU. Setting things like
>> GMRES/PCNONE works as well with no errors, though it converges far too
>> slowly.
>> > >
>> > > The actual preconditioner I am trying to form is one from recent
>> literature and uses a slightly modified Schur complement split embedded in
>> another Schur complement split with multiple solves of the inner system and
>> very specific choices for sub-preconditioners. I don't think command line
>> options will work very well here.
>> > >
>> > > I've since gone the way of just using PCSHELL and setting things up
>> more explicitly. This seems to work, but i'm not quite sure how to set up
>> boomeramg for one of the sub-problems.
>> > >
>> > > boomeramg is used on the matrix A derived from:
>> > > MatGetSubMatrix(J,is_x ,is_x ,MAT_INITIAL_MATRIX,&ctxp->A);
>> > > The degrees of freedom for J are xxxyyyzzzpw, with the size of
>> xxxyyyzzz around 20k, p around 1k, and w 8 for my 'small' test problem.
>> > >
>> > > I can see that HYPRE_BoomerAMGSetNumFunctions takes its value from
>> the matrix block size. This is 1 for J as it doesn't have a consistent
>> block size. However, the number of functions for boomeramg should be 3.
>> > > Changing the block size is not allowed by petsc, and there doesn't
>> seem to be another way to reach HYPRE_BoomerAMGSetNumFunctions.
>> > > What is the best way to handle this, and does it matter that the dofs
>> are ordererd xxxyyyzzz rather than xyzxyzxyz ?
>> >
>> >    I don't think BoomerAMG supports xxxyyyzzz, I think it will just get
>> very confused trying to do algebraic multigrid with this form. Read up on
>> it but my guess is you need to rewrite the code that prepares the system to
>> do the interlacing.
>> >
>> >   Barry
>> >
>> > >
>> > >
>> > > Thanks,
>> > > Sander
>> > >
>> > >
>> > >
>> > > On Fri, Jul 10, 2015 at 7:44 PM, Matthew Knepley <knepley at gmail.com>
>> wrote:
>> > > On Tue, Jun 30, 2015 at 3:10 PM, Sander Land <sander.land at 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 you
>> > > set 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 have
>> > > started to use the DM object to hold this kind of information. For
>> FieldSplit, I think it is easier to tell
>> > > a DMShell about your field division, and then have it pass this on to
>> PCFIELDSPLIT. So you would
>> > >
>> > >   a) Create a DMSHELL
>> > >
>> > >   b) 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 1
>> > >
>> > > Then everything should work, and can work in any embedded context.
>> Does this make sense?
>> > >
>> > >   Thanks,
>> > >
>> > >     Matt
>> > >
>> > > Thanks,
>> > > Sander
>> > >
>> > > On Tue, Jun 30, 2015 at 2:09 PM, Matthew Knepley <knepley at gmail.com>
>> wrote:
>> > > On Tue, Jun 30, 2015 at 11:43 AM, Sander Land <sander.land at 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.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
>> > >
>> > >
>> > >
>> > >
>> > > --
>> > > 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
>> > >
>> >
>> >
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150716/d2de6542/attachment.html>


More information about the petsc-users mailing list