[petsc-users] dmplex face normals orientation

Ingo Gaertner ingogaertner.tus at gmail.com
Tue Apr 18 00:46:32 CDT 2017


Dear Matt,
please explain your previous answer ("The normal should be outward, unless
the face has orientation < 0") with respect to my example.
As I think, the example shows that the face normals for faces 11 and 12 are
pointing outward, although they have orientation=-2. For all other faces
the normal direction and their orientation sign agree with what you said.

Thanks
Ingo

2017-04-14 11:28 GMT+02:00 Ingo Gaertner <ingogaertner.tus at gmail.com>:

> Thank you, Matt,
> as you say, the face orientations do change sign when switching between
> the two adjacent cells. (I confused my program output. You are right.) But
> it seems not to be always correct to keep the normal direction for
> orientation>=0 and invert it for orientation<0:
>
> I include sample code below to make my question more clear. The program
> creates a HexBoxMesh split horizontally in two cells (at x=0.5) It produces
> this output:
>
> "Face centroids (c) and normals(n):
> face #008 c=(0.250000 0.000000 0.000000) n=(-0.000000 -0.500000 0.000000)
> face #009 c=(0.750000 0.000000 0.000000) n=(-0.000000 -0.500000 0.000000)
> face #010 c=(0.250000 1.000000 0.000000) n=(0.000000 0.500000 0.000000)
> face #011 c=(0.750000 1.000000 0.000000) n=(0.000000 0.500000 0.000000)
> face #012 c=(0.000000 0.500000 0.000000) n=(-1.000000 -0.000000 0.000000)
> face #013 c=(0.500000 0.500000 0.000000) n=(1.000000 0.000000 0.000000)
> face #014 c=(1.000000 0.500000 0.000000) n=(1.000000 0.000000 0.000000)
> Cell faces orientations:
> cell #0, faces:[8 13 10 12] orientations:[0 0 -2 -2]
> cell #1, faces:[9 14 11 13] orientations:[0 0 -2 -2]"
>
> Looking at the face normals, all boundary normals point outside (good).
> The normal of face #013 points outside with respect to the left cell #0,
> but inside w.r.t. the right cell #1.
>
> Face 13 is shared between both cells. It has orientation 0 for cell #0,
> but orientation -2 for cell #1 (good).
> What I don't understand is the orientation of face 12 (cell 0) and of face
> 11 (cell 1). These are negative, which would make them point into the cell.
> Have I done some other stupid mistake?
>
> Thanks
> Ingo
>
> Here is the code:
>
> static char help[] = "Check face normals orientations.\n\n";
> #include <petscdmplex.h>
> #undef __FUNCT__
> #define __FUNCT__ "main"
>
> int main(int argc, char **argv)
> {
>   DM             dm;
>   PetscErrorCode ierr;
>   PetscFVCellGeom *cgeom;
>   PetscFVFaceGeom *fgeom;
>   Vec cellgeom,facegeom;
>   int dim=2;
>   int cells[]={2,1};
>   int cStart,cEnd,fStart,fEnd;
>   int coneSize,supportSize;
>   const int *cone,*coneOrientation;
>
>   ierr = PetscInitialize(&argc, &argv, NULL, help);CHKERRQ(ierr);
>   ierr = PetscOptionsGetInt(NULL, NULL, "-dim", &dim, NULL);CHKERRQ(ierr);
>   ierr = DMPlexCreateHexBoxMesh(PETSC_COMM_WORLD, dim,
> cells,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,
> &dm);CHKERRQ(ierr);
>
>   ierr = DMPlexComputeGeometryFVM(dm, &cellgeom,&facegeom);CHKERRQ(ierr);
>   ierr = VecGetArray(cellgeom, (PetscScalar**)&cgeom);CHKERRQ(ierr);
>   ierr = VecGetArray(facegeom, (PetscScalar**)&fgeom);CHKERRQ(ierr);
>   ierr = DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);CHKERRQ(ierr);
>   ierr = DMPlexGetHeightStratum(dm, 1, &fStart, &fEnd);CHKERRQ(ierr);
>
>   fprintf(stderr,"Face centroids (c) and normals(n):\n");
>   for (int f=fStart;f<fEnd;f++){
>     fprintf(stderr,"face #%03d c=(%03f %03f %03f) n=(%03f %03f %03f)\n",f,
>       fgeom[f-fStart].centroid[0],fgeom[f-fStart].centroid[1],fgeo
> m[f-fStart].centroid[2],
>       fgeom[f-fStart].normal[0],fgeom[f-fStart].normal[1],fgeom[f-
> fStart].normal[2]);
>   }
>
>   fprintf(stderr,"Cell faces orientations:\n");
>   for (int c=cStart;c<cEnd;c++){
>       ierr = DMPlexGetConeSize(dm, c, &coneSize);CHKERRQ(ierr);
>       ierr = DMPlexGetCone(dm, c, &cone);CHKERRQ(ierr);
>       ierr = DMPlexGetConeOrientation(dm, c, &coneOrientation);CHKERRQ(ierr
> );
>       if (dim==2){
>         if (coneSize!=4){
>           fprintf(stderr,"Expected coneSize 4, got %d.\n",coneSize);
>           exit(1);
>         }
>         fprintf(stderr,"cell #%d, faces:[%d %d %d %d] orientations:[%d %d
> %d %d]\n",c,
>           cone[0],cone[1],cone[2],cone[3],
>           coneOrientation[0],coneOrientation[1],coneOrientation[2],con
> eOrientation[3]
>         );
>       } else if (dim==3){
>         if (coneSize!=6){
>           fprintf(stderr,"Expected coneSize 6, got %d.\n",coneSize);
>           exit(1);
>         }
>         fprintf(stderr,"cell #%d, faces:[%d %d %d %d %d %d]
> orientations:[%d %d %d %d %d %d]\n",c,
>           cone[0],cone[1],cone[2],cone[3],cone[4],cone[5],
>           coneOrientation[0],coneOrientation[1],coneOrientation[2],con
> eOrientation[3],coneOrientation[4],coneOrientation[5]
>         );
>       } else {
>         fprintf(stderr,"Dimension %d not implemented.\n",dim);
>         exit(1);
>       }
>   }
>   ierr = PetscFinalize();
>
> }
>
>
> 2017-04-14 11:00 GMT+02:00 Matthew Knepley <knepley at gmail.com>:
>
>> On Wed, Apr 12, 2017 at 10:52 AM, Ingo Gaertner <
>> ingogaertner.tus at gmail.com> wrote:
>>
>>> Hello,
>>> I have problems determining the orientation of the face normals of a
>>> DMPlex.
>>>
>>> I create a DMPlex, for example with DMPlexCreateHexBoxMesh().
>>> Next, I get the face normals using DMPlexComputeGeometryFVM(DM dm, Vec
>>> *cellgeom, Vec *facegeom). facegeom gives the correct normals, but I don't
>>> know how the inside/outside is defined with respect to the adjacant cells?
>>>
>>
>> The normal should be outward, unless the face has orientation < 0.
>>
>>
>>> Finally, I iterate over all cells. For each cell I iterate over the
>>> bounding faces (obtained from DMPlexGetCone) and try to obtain their
>>> orientation with respect to the current cell using
>>> DMPlexGetConeOrientation(). However, the six integers for the orientation
>>> are the same for each cell. I expect them to flip between neighbour cells,
>>> because if a face normal is pointing outside for any cell, the same normal
>>> is pointing inside for its neighbour. Apparently I have a misunderstanding
>>> here.
>>>
>>
>> I see the orientations changing sign for adjacent cells. Want to send a
>> simple code? You should see this
>> for examples. You can run SNES ex12 with -dm_view ::ascii_info_detail to
>> see the change in sign.
>>
>>   Thanks,
>>
>>      Matt
>>
>>
>>> How can I make use of the face normals in facegeom and the orientation
>>> values from DMPlexGetConeOrientation() to get the outside face normals for
>>> each cell?
>>>
>>> Thank you
>>> Ingo
>>>
>>>
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> Virenfrei.
>>> www.avast.com
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
>>> <#m_2360740100696784902_m_-1897645241821352774_m_-6432344443275881332_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>>>
>>
>>
>>
>> --
>> 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/20170418/a8b0144b/attachment.html>


More information about the petsc-users mailing list