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*/