xref: /petsc/src/dm/impls/plex/tutorials/ex4f90.F90 (revision 2ff79c18c26c94ed8cb599682f680f231dca6444)
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
18
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))
25
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))
35
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*/
48