[petsc-users] PETSCFE_CLASSID/PETSCVF_CLASSID
Jacob Faibussowitsch
jacob.fai at gmail.com
Fri Dec 11 11:17:32 CST 2020
Nicolas,
> I am trying to understand how the class IDs of a DM field are set
Class ID’s are unique (internal) identifiers that every type of object of a petsc-created class shares to identify them. This is especially useful when these objects are passed around semi-opaquely by casting to PetscObject. Think of it as similar to c++ typeid https://en.cppreference.com/w/cpp/language/typeid <https://en.cppreference.com/w/cpp/language/typeid>
> ierr = PetscFECreateDefault(PetscObjectComm((PetscObject) dmGrad), dim, coordDim, PETSC_TRUE, NULL, -1, &feGrad);CHKERRQ(ierr);
> ierr = PetscDSSetDiscretization(probGrad, f, (PetscObject) feGrad);CHKERRQ(ierr);
> ierr = PetscFEDestroy(&feGrad);CHKERRQ(ierr);
>
> Yet, when I call DMPlexComputeGradientClementInterpolant, I get the following error:
> [0]PETSC ERROR: Unknown discretization type for field 0
This function walks through all of the fields you have added to the DM and performs a sanity check (using the classics) to determine whether they are all the correct object.
It seems like you’ve missed a step here. Have you called DMAddField()/DMSetField() to associate your PetscFE with your plex? Note that
> ierr = PetscFECreateDefault(PetscObjectComm((PetscObject) dmGrad), dim, coordDim, PETSC_TRUE, NULL, -1, &feGrad);CHKERRQ(ierr);
Does not directly tie the feGrad to your dmGrad, rather just gives it the same MPI_Comm.
Best regards,
Jacob Faibussowitsch
(Jacob Fai - booss - oh - vitch)
Cell: (312) 694-3391
> On Dec 11, 2020, at 11:02, Nicolas Barral <nicolas.barral at math.u-bordeaux.fr> wrote:
>
> Hi all (and probably more specifically Matt ?)
>
> I am trying to understand how the class IDs of a DM field are set, and can't find it in the documentation.
>
> A little background, I am mimicking SNES/utils/dmadapt.c/DMAdaptorAdapt_Sequence_Private for a specific case (I'm trying to build the same kind of metric from a single sensor field, without all the SNES layer).
>
> I need to compute the gradient of the sensor field, using DMPlexComputeGradientClementInterpolant, for which I create a DM, to which I associate a PetscFE, a DS, like in existing code:
>
> PetscFE feGrad
> PetscDS probGrad
>
> ierr = PetscFECreateDefault(PetscObjectComm((PetscObject) dmGrad), dim, coordDim, PETSC_TRUE, NULL, -1, &feGrad);CHKERRQ(ierr);
> ierr = PetscDSSetDiscretization(probGrad, f, (PetscObject) feGrad);CHKERRQ(ierr);
> ierr = PetscFEDestroy(&feGrad);CHKERRQ(ierr);
>
> Yet, when I call DMPlexComputeGradientClementInterpolant, I get the following error:
> [0]PETSC ERROR: Unknown discretization type for field 0
>
> I don't fully understand what all these objects are (FE, DS and Field), and how they are related, where would that be documented ?
> And what else do I need to do to make my example work ?
>
> Thanks
>
> --
> Nicolas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20201211/83cb53f9/attachment.html>
More information about the petsc-users
mailing list