[petsc-dev] mesh face areas with DMPlexComputeCellGeometryFVM()
Matthew Knepley
knepley at gmail.com
Sat Apr 12 23:08:30 CDT 2014
On Thu, Apr 10, 2014 at 7:57 PM, Adrian Croucher
<a.croucher at auckland.ac.nz>wrote:
> hi
>
> I am getting some slightly weird results from
> DMPlexComputeCellGeometryFVM() when I use it to compute mesh face areas and
> centroids. The Fortran code below demonstrates the problem.
>
> It constructs a very simple mesh with 2 cube cells, length 1.0 along each
> side. So the face areas should all be 1.0.
>
> Most of them are, but the two bottom faces (z = 0) are returning areas of
> 0.5, and the wrong centroids. It appears they're being computed based on
> triangles with one of the face corners left out.
>
> Any clues, or could this be a bug?
>
Thanks for the test. It was a bug in a special case:
- coords[3] = PetscRealPart(coords[3*dim+0] - coords[0*dim+0]);
+ coords[3] = PetscRealPart(coords[3*dim+1] - coords[0*dim+1]);
I will push it to next
Thanks,
Matt
> Cheers, Adrian
> --
>
> program main
>
> ! test using DMPlexComputeCellGeometryFVM() to compute face areas,
> ! on simple mesh of two cubes
>
> implicit none
>
> #include <finclude/petsc.h90>
>
> DM :: dm, dmi
> PetscInt, parameter :: dim = 3
> PetscInt :: depth = 1
> PetscErrorCode :: ierr
> PetscInt, allocatable :: numPoints(:)
> PetscInt, allocatable :: coneSize(:)
> PetscInt, allocatable :: cones(:)
> PetscInt, allocatable :: coneOrientations(:)
> PetscScalar, allocatable :: vertexCoords(:)
> PetscReal :: vol = 0.
> PetscReal, target, dimension(dim) :: centroid = 0., normal = 0.
> PetscReal, pointer :: pcentroid(:), pnormal(:)
> PetscInt :: i, fStart, fEnd, f
> PetscScalar :: facearea
>
> numPoints = [12, 2]
> coneSize = [8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
> cones = [2,5,4,3,6,7,8,9, 3,4,11,10,7,12,13,8]
> coneOrientations = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
> vertexCoords = [ &
> -1.0,0.0,0.0, 0.0,0.0,0.0, 0.0,1.0,0.0, -1.0,1.0,0.0, &
> -1.0,0.0,1.0, 0.0,0.0,1.0, 0.0,1.0,1.0, -1.0,1.0,1.0, &
> 1.0,0.0,0.0, 1.0,1.0,0.0, 1.0,0.0,1.0, 1.0,1.0,1.0 ]
>
> call PetscInitialize(PETSC_NULL_CHARACTER,ierr); CHKERRQ(ierr)
>
> call DMPlexCreate(PETSC_COMM_WORLD, dm, ierr); CHKERRQ(ierr)
> call DMPlexSetDimension(dm, dim, ierr); CHKERRQ(ierr)
>
> call DMPlexCreateFromDAG(dm, depth, numPoints, coneSize, cones, &
> coneOrientations, vertexCoords, ierr); CHKERRQ(ierr)
>
> dmi = PETSC_NULL_OBJECT
> call DMPlexInterpolate(dm, dmi, ierr); CHKERRQ(ierr)
> call DMPlexCopyCoordinates(dm, dmi, ierr); CHKERRQ(ierr)
> call DMDestroy(dm, ierr); CHKERRQ(ierr)
> dm = dmi
>
> pcentroid => centroid
> pnormal => normal
> call DMPlexGetHeightStratum(dm, 1, fStart, fEnd, ierr); CHKERRQ(ierr)
> write(*,'(a2, 1x, 2a10)'), ' f', 'area', 'centroid'
> do f = fStart, fEnd-1
> call DMPlexComputeCellGeometryFVM(dm, f, facearea, pcentroid,
> pnormal, ierr)
> write(*,'(i2, 1x, 4f10.4)'), f, facearea, centroid
> end do
>
> call DMDestroy(dm, ierr); CHKERRQ(ierr)
> call PetscFinalize(ierr); CHKERRQ(ierr)
>
> end program main
>
> --
> Dr Adrian Croucher
> Department of Engineering Science
> University of Auckland
> New Zealand
> tel 64-9-373-7599 ext 84611
>
>
--
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-dev/attachments/20140412/95405449/attachment.html>
More information about the petsc-dev
mailing list