Actual source code: ex3f90.F90

  1: ! setting up 3-D DMPlex using DMPlexCreateFromDAG(), DMPlexInterpolate() and
  2: ! DMPlexComputeCellGeometryFVM()
  3: ! Contributed by Adrian Croucher <a.croucher@auckland.ac.nz>
  4: program main
  5: #include <petsc/finclude/petscsys.h>
  6: #include <petsc/finclude/petscdmplex.h>
  7:   use petscdmplex
  8:   implicit none
  9:   DM :: dm, dmi
 10:   PetscFV :: fvm
 11:   PetscInt, parameter :: dim = 3

 13:   PetscInt :: depth = 1
 14:   PetscErrorCode :: ierr
 15:   PetscInt, dimension(2) :: numPoints
 16:   PetscInt, dimension(14) :: coneSize
 17:   PetscInt, dimension(16) :: cones
 18:   PetscInt, dimension(16) :: coneOrientations
 19:   PetscScalar, dimension(36) :: vertexCoords
 20:   PetscReal ::  vol = 0.
 21:   PetscReal, target, dimension(dim)  :: centroid
 22:   PetscReal, target, dimension(dim)  :: normal
 23:   PetscReal, pointer :: pcentroid(:)
 24:   PetscReal, pointer :: pnormal(:)

 26:   PetscReal, target, dimension(dim)  :: v0
 27:   PetscReal, target, dimension(dim*dim)  :: J
 28:   PetscReal, target, dimension(dim*dim)  :: invJ
 29:   PetscReal, pointer :: pv0(:)
 30:   PetscReal, pointer :: pJ(:)
 31:   PetscReal, pointer :: pinvJ(:)
 32:   PetscReal :: detJ

 34:   PetscInt :: i

 36:   numPoints = [12, 2]
 37:   coneSize = [8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 38:   cones = [2, 5, 4, 3, 6, 7, 8, 9, 3, 4, 11, 10, 7, 12, 13, 8]
 39:   coneOrientations = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 40:   vertexCoords = [                                                  &
 41:  &  -0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.5, 1.0, 0.0,           &
 42:  &  -0.5, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, -0.5, 1.0, 1.0,           &
 43:  &   0.5, 0.0, 0.0, 0.5, 1.0, 0.0, 0.5, 0.0, 1.0, 0.5, 1.0, 1.0]
 44:   pcentroid => centroid
 45:   pnormal => normal

 47:   pv0 => v0
 48:   pJ => J
 49:   pinvJ => invJ

 51:   PetscCallA(PetscInitialize(ierr))
 52:   PetscCallA(DMPlexCreate(PETSC_COMM_WORLD, dm, ierr))
 53:   PetscCallA(PetscObjectSetName(dm, 'testplex', ierr))
 54:   PetscCallA(DMSetDimension(dm, dim, ierr))

 56:   PetscCallA(DMPlexCreateFromDAG(dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords, ierr))

 58:   PetscCallA(DMPlexInterpolate(dm, dmi, ierr))
 59:   PetscCallA(DMPlexCopyCoordinates(dm, dmi, ierr))
 60:   PetscCallA(DMDestroy(dm, ierr))
 61:   dm = dmi

 63:   PetscCallA(DMView(dm, PETSC_VIEWER_STDOUT_WORLD, ierr))

 65:   do i = 0, 1
 66:     PetscCallA(DMPlexComputeCellGeometryFVM(dm, i, vol, pcentroid, pnormal, ierr))
 67:     write (*, '(a, i2, a, f8.4, a, 3(f8.4, 1x))') 'cell: ', i, ' volume: ', vol, ' centroid: ', pcentroid(1), pcentroid(2), pcentroid(3)
 68:     PetscCallA(DMPlexComputeCellGeometryAffineFEM(dm, i, pv0, pJ, pinvJ, detJ, ierr))
 69:   end do

 71:   PetscCallA(PetscFVCreate(PETSC_COMM_WORLD, fvm, ierr))
 72:   PetscCallA(PetscFVSetUp(fvm, ierr))
 73:   PetscCallA(PetscFVDestroy(fvm, ierr))

 75:   PetscCallA(DMDestroy(dm, ierr))
 76:   PetscCallA(PetscFinalize(ierr))
 77: end program main

 79: !/*TEST
 80: !
 81: !   test:
 82: !      suffix: 0
 83: !
 84: !TEST*/