[petsc-dev] mesh face areas with DMPlexComputeCellGeometryFVM()
Adrian Croucher
a.croucher at auckland.ac.nz
Thu Apr 10 19:57:35 CDT 2014
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?
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
More information about the petsc-dev
mailing list