[petsc-users] Local columns of A10 do not equal local rows of A00

Alexander Lindsay alexlindsay239 at gmail.com
Mon Nov 7 13:09:34 CST 2022


The libMesh/MOOSE specific code that identifies dof indices for
ISCreateGeneral is in DMooseGetEmbedding_Private. I can share that function
(it's quite long) or more details if that could be helpful.

On Mon, Nov 7, 2022 at 10:55 AM Alexander Lindsay <alexlindsay239 at gmail.com>
wrote:

> I'm not sure exactly what you mean, but I'll try to give more details. We
> have our own DM class (DM_Moose) and we set our own field and domain
> decomposition routines:
>
>   dm->ops->createfielddecomposition = DMCreateFieldDecomposition_Moose;
>
>   dm->ops->createdomaindecomposition = DMCreateDomainDecomposition_Moose;
>
>
> The field and domain decomposition routines are as follows (can see also
> at
> https://github.com/idaholab/moose/blob/next/framework/src/utils/PetscDMMoose.C
> ):
>
> static PetscErrorCode
> DMCreateFieldDecomposition_Moose(
>     DM dm, PetscInt * len, char *** namelist, IS ** islist, DM ** dmlist)
> {
>   PetscErrorCode ierr;
>   DM_Moose * dmm = (DM_Moose *)(dm->data);
>
>   PetscFunctionBegin;
>   /* Only called after DMSetUp(). */
>   if (!dmm->_splitlocs)
>     PetscFunctionReturn(0);
>   *len = dmm->_splitlocs->size();
>   if (namelist)
>   {
>     ierr = PetscMalloc(*len * sizeof(char *), namelist);
>     CHKERRQ(ierr);
>   }
>   if (islist)
>   {
>     ierr = PetscMalloc(*len * sizeof(IS), islist);
>     CHKERRQ(ierr);
>   }
>   if (dmlist)
>   {
>     ierr = PetscMalloc(*len * sizeof(DM), dmlist);
>     CHKERRQ(ierr);
>   }
>   for (const auto & dit : *(dmm->_splitlocs))
>   {
>     unsigned int d = dit.second;
>     std::string dname = dit.first;
>     DM_Moose::SplitInfo & dinfo = (*dmm->_splits)[dname];
>     if (!dinfo._dm)
>     {
>       ierr = DMCreateMoose(((PetscObject)dm)->comm, *dmm->_nl, &dinfo._dm);
>       CHKERRQ(ierr);
>       ierr = PetscObjectSetOptionsPrefix((PetscObject)dinfo._dm,
> ((PetscObject)dm)->prefix);
>       CHKERRQ(ierr);
>       std::string suffix = std::string("fieldsplit_") + dname + "_";
>       ierr = PetscObjectAppendOptionsPrefix((PetscObject)dinfo._dm,
> suffix.c_str());
>       CHKERRQ(ierr);
>     }
>     ierr = DMSetFromOptions(dinfo._dm);
>     CHKERRQ(ierr);
>     ierr = DMSetUp(dinfo._dm);
>     CHKERRQ(ierr);
>     if (namelist)
>     {
>       ierr = PetscStrallocpy(dname.c_str(), (*namelist) + d);
>       CHKERRQ(ierr);
>     }
>     if (islist)
>     {
>       if (!dinfo._rembedding)
>       {
>         IS dembedding, lembedding;
>         ierr = DMMooseGetEmbedding_Private(dinfo._dm, &dembedding);
>         CHKERRQ(ierr);
>         if (dmm->_embedding)
>         {
>           // Create a relative embedding into the parent's index space.
>           ierr = ISEmbed(dembedding, dmm->_embedding, PETSC_TRUE,
> &lembedding);
>           CHKERRQ(ierr);
>           const PetscInt * lindices;
>           PetscInt len, dlen, llen, *rindices, off, i;
>           ierr = ISGetLocalSize(dembedding, &dlen);
>           CHKERRQ(ierr);
>           ierr = ISGetLocalSize(lembedding, &llen);
>           CHKERRQ(ierr);
>           if (llen != dlen)
>             SETERRQ1(((PetscObject)dm)->comm, PETSC_ERR_PLIB, "Failed to
> embed split %D", d);
>           ierr = ISDestroy(&dembedding);
>           CHKERRQ(ierr);
>           // Convert local embedding to global (but still relative)
> embedding
>           ierr = PetscMalloc(llen * sizeof(PetscInt), &rindices);
>           CHKERRQ(ierr);
>           ierr = ISGetIndices(lembedding, &lindices);
>           CHKERRQ(ierr);
>           ierr = PetscMemcpy(rindices, lindices, llen * sizeof(PetscInt));
>           CHKERRQ(ierr);
>           ierr = ISDestroy(&lembedding);
>           CHKERRQ(ierr);
>           // We could get the index offset from a corresponding global
> vector, but subDMs don't yet
>           // have global vectors
>           ierr = ISGetLocalSize(dmm->_embedding, &len);
>           CHKERRQ(ierr);
>
>           ierr = MPI_Scan(&len,
>                           &off,
>                           1,
> #ifdef PETSC_USE_64BIT_INDICES
>                           MPI_LONG_LONG_INT,
> #else
>                           MPI_INT,
> #endif
>                           MPI_SUM,
>                           ((PetscObject)dm)->comm);
>           CHKERRQ(ierr);
>
>           off -= len;
>           for (i = 0; i < llen; ++i)
>             rindices[i] += off;
>           ierr = ISCreateGeneral(
>               ((PetscObject)dm)->comm, llen, rindices, PETSC_OWN_POINTER,
> &(dinfo._rembedding));
>           CHKERRQ(ierr);
>         }
>         else
>         {
>           dinfo._rembedding = dembedding;
>         }
>       }
>       ierr = PetscObjectReference((PetscObject)(dinfo._rembedding));
>       CHKERRQ(ierr);
>       (*islist)[d] = dinfo._rembedding;
>     }
>     if (dmlist)
>     {
>       ierr = PetscObjectReference((PetscObject)dinfo._dm);
>       CHKERRQ(ierr);
>       (*dmlist)[d] = dinfo._dm;
>     }
>   }
>   PetscFunctionReturn(0);
> }
>
> static PetscErrorCode
> DMCreateDomainDecomposition_Moose(
>     DM dm, PetscInt * len, char *** namelist, IS ** innerislist, IS **
> outerislist, DM ** dmlist)
> {
>   PetscErrorCode ierr;
>
>   PetscFunctionBegin;
>   /* Use DMCreateFieldDecomposition_Moose() to obtain everything but
> outerislist, which is currently
>    * PETSC_NULL. */
>   if (outerislist)
>     *outerislist = PETSC_NULL; /* FIX: allow mesh-based overlap. */
>   ierr = DMCreateFieldDecomposition_Moose(dm, len, namelist, innerislist,
> dmlist);
>   CHKERRQ(ierr);
>   PetscFunctionReturn(0);
> }
>
>
>
> On Thu, Nov 3, 2022 at 5:19 PM Matthew Knepley <knepley at gmail.com> wrote:
>
>> On Thu, Nov 3, 2022 at 7:52 PM Alexander Lindsay <
>> alexlindsay239 at gmail.com> wrote:
>>
>>> I have errors on quite a few (but not all) processes of the like
>>>
>>> [1]PETSC ERROR: --------------------- Error Message
>>> --------------------------------------------------------------
>>> [1]PETSC ERROR: Nonconforming object sizes
>>> [1]PETSC ERROR: Local columns of A10 4137 do not equal local rows of A00
>>> 4129
>>>
>>> when performing field splits. We (MOOSE) have some code for identifying
>>> the index sets for each split. However, the code was written by some
>>> authors who are no longer with us. Normally I would chase this down in a
>>> debugger, but this error only seems to crop up for pretty complex and large
>>> meshes. If anyone has an idea for what we might be doing wrong, that might
>>> help me chase this down faster. I guess intuitively I'm pretty perplexed
>>> that we could get ourselves into this pickle as it almost appears that we
>>> have two different local dof index counts for a given block (0 in this
>>> case). More background, if helpful, can be found in
>>> https://github.com/idaholab/moose/issues/22359 as well as
>>> https://github.com/idaholab/moose/discussions/22468.
>>>
>>
>> How are you specifying the blocks? I would not have thought this was
>> possible.
>>
>>   Thanks,
>>
>>      Matt
>>
>>
>>> I should note that we are currently running with 3.16.6 as our PETSc
>>> submodule hash (we are talking about updating to 3.18 soon).
>>>
>>
>>
>> --
>> 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
>>
>> https://www.cse.buffalo.edu/~knepley/
>> <http://www.cse.buffalo.edu/~knepley/>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20221107/4c8f36b6/attachment-0001.html>


More information about the petsc-users mailing list