! setting up DMPlex for finite elements
! Contributed by Pratheek Shanthraj
program main
#include
use petsc
implicit none
DM :: dm
PetscDS :: ds
PetscInt :: dim = 3, zero = 0
PetscBool :: simplex = PETSC_TRUE
PetscBool :: interpolate = PETSC_TRUE
PetscReal :: refinementLimit = 0.0
PetscErrorCode :: ierr
PetscTabulation, pointer :: tab(:)
PetscFE fe,rfe
PetscObject obj
PetscInt :: one = 1, mone = -1
PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
PetscCallA(DMPlexCreateDoublet(PETSC_COMM_WORLD, dim, simplex,interpolate, refinementLimit, dm, ierr))
PetscCallA(PetscFECreateDefault(PETSC_COMM_WORLD, dim, one, simplex, 'name', mone, fe, ierr));
PetscCallA(PetscObjectSetName(fe, 'name', ierr));
PetscCallA(DMSetField(dm, zero, PETSC_NULL_DMLABEL, PetscObjectCast(fe), ierr));
PetscCallA(DMSetField(dm, one, PETSC_NULL_DMLABEL, PetscObjectCast(fe), ierr));
PetscCallA(DMSetUp(dm,ierr))
PetscCallA(DMCreateDS(dm,ierr))
PetscCallA(DMGetDS(dm,ds,ierr))
PetscCallA(PetscDSGetTabulation(ds,tab,ierr))
print*,tab(1)%ptr%T(1)%ptr
print*,tab(1)%ptr%T(2)%ptr
print*,tab(2)%ptr%T(1)%ptr
print*,tab(2)%ptr%T(2)%ptr
PetscCallA(PetscDSRestoreTabulation(ds,tab,ierr))
PetscCallA(PetscDSGetDiscretization(ds,zero,obj,ierr))
PetscObjectSpecificCast(rfe,obj)
PetscCallA(PetscFEDestroy(fe, ierr));
PetscCallA(DMDestroy(dm, ierr))
PetscCallA(PetscFinalize(ierr))
end program main
!/*TEST
!
! test:
! nsize: 1
!
!TEST*/