Actual source code: ex4f90.F90
1: ! setting up DMPlex for finite elements
2: ! Contributed by Pratheek Shanthraj <p.shanthraj@mpie.de>
3: program main
4: #include <petsc/finclude/petsc.h>
5: use petsc
6: implicit none
7: DM :: dm
8: PetscDS :: ds
9: PetscInt :: dim = 3, zero = 0
10: PetscBool :: simplex = PETSC_TRUE
11: PetscBool :: interpolate = PETSC_TRUE
12: PetscReal :: refinementLimit = 0.0
13: PetscErrorCode :: ierr
14: PetscTabulation, pointer :: tab(:)
15: PetscFE fe, rfe
16: PetscObject obj
17: PetscInt :: one = 1, mone = -1
19: PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
20: PetscCallA(DMPlexCreateDoublet(PETSC_COMM_WORLD, dim, simplex, interpolate, refinementLimit, dm, ierr))
21: PetscCallA(PetscFECreateDefault(PETSC_COMM_WORLD, dim, one, simplex, 'name', mone, fe, ierr))
22: PetscCallA(PetscObjectSetName(fe, 'name', ierr))
23: PetscCallA(DMSetField(dm, zero, PETSC_NULL_DMLABEL, PetscObjectCast(fe), ierr))
24: PetscCallA(DMSetField(dm, one, PETSC_NULL_DMLABEL, PetscObjectCast(fe), ierr))
26: PetscCallA(DMSetUp(dm, ierr))
27: PetscCallA(DMCreateDS(dm, ierr))
28: PetscCallA(DMGetDS(dm, ds, ierr))
29: PetscCallA(PetscDSGetTabulation(ds, tab, ierr))
30: print *, tab(1)%ptr%T(1)%ptr
31: print *, tab(1)%ptr%T(2)%ptr
32: print *, tab(2)%ptr%T(1)%ptr
33: print *, tab(2)%ptr%T(2)%ptr
34: PetscCallA(PetscDSRestoreTabulation(ds, tab, ierr))
36: PetscCallA(PetscDSGetDiscretization(ds, zero, obj, ierr))
37: PetscObjectSpecificCast(rfe, obj)
38: PetscCallA(PetscFEDestroy(fe, ierr))
39: PetscCallA(DMDestroy(dm, ierr))
40: PetscCallA(PetscFinalize(ierr))
41: end program main
42: !/*TEST
43: !
44: ! test:
45: ! nsize: 1
46: !
47: !TEST*/