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