Actual source code: ex2f90.F90
1: #include <petsc/finclude/petscdmplex.h>
2: program main
3: use petscdm
4: use petscdmplex
5: implicit none
7: DM dm
8: PetscInt, target, dimension(3) :: EC
9: PetscInt, target, dimension(2) :: VE
10: PetscInt, pointer, dimension(:) :: pEC, pVE, nClosure, nJoin, nMeet
11: PetscInt, parameter :: dim = 2
12: PetscInt cell, size, nC
13: PetscErrorCode ierr
15: PetscCallA(PetscInitialize(ierr))
17: PetscCallA(DMPlexCreate(PETSC_COMM_WORLD, dm, ierr))
18: PetscCallA(PetscObjectSetName(dm, 'Mesh', ierr))
19: PetscCallA(DMSetDimension(dm, dim, ierr))
21: ! Make Doublet Mesh from Fig 2 of Flexible Representation of Computational Meshes,
22: ! except indexing is from 0 instead of 1 and we obey the new restrictions on
23: ! numbering: cells, vertices, faces, edges
24: PetscCallA(DMPlexSetChart(dm, 0_PETSC_INT_KIND, 11_PETSC_INT_KIND, ierr))
25: ! cells
26: PetscCallA(DMPlexSetConeSize(dm, 0_PETSC_INT_KIND, 3_PETSC_INT_KIND, ierr))
27: PetscCallA(DMPlexSetConeSize(dm, 1_PETSC_INT_KIND, 3_PETSC_INT_KIND, ierr))
28: ! edges
29: PetscCallA(DMPlexSetConeSize(dm, 6_PETSC_INT_KIND, 2_PETSC_INT_KIND, ierr))
30: PetscCallA(DMPlexSetConeSize(dm, 7_PETSC_INT_KIND, 2_PETSC_INT_KIND, ierr))
31: PetscCallA(DMPlexSetConeSize(dm, 8_PETSC_INT_KIND, 2_PETSC_INT_KIND, ierr))
32: PetscCallA(DMPlexSetConeSize(dm, 9_PETSC_INT_KIND, 2_PETSC_INT_KIND, ierr))
33: PetscCallA(DMPlexSetConeSize(dm, 10_PETSC_INT_KIND, 2_PETSC_INT_KIND, ierr))
35: PetscCallA(DMSetUp(dm, ierr))
37: EC = [6, 7, 8]
38: pEC => EC
39: PetscCallA(DMPlexSetCone(dm, 0_PETSC_INT_KIND, pEC, ierr))
40: EC = [7, 9, 10]
41: pEC => EC
42: PetscCallA(DMPlexSetCone(dm, 1_PETSC_INT_KIND, pEC, ierr))
44: VE = [2, 3]
45: pVE => VE
46: PetscCallA(DMPlexSetCone(dm, 6_PETSC_INT_KIND, pVE, ierr))
47: VE = [3, 4]
48: pVE => VE
49: PetscCallA(DMPlexSetCone(dm, 7_PETSC_INT_KIND, pVE, ierr))
50: VE = [4, 2]
51: pVE => VE
52: PetscCallA(DMPlexSetCone(dm, 8_PETSC_INT_KIND, pVE, ierr))
53: VE = [3, 5]
54: pVE => VE
55: PetscCallA(DMPlexSetCone(dm, 9_PETSC_INT_KIND, pVE, ierr))
56: VE = [5, 4]
57: pVE => VE
58: PetscCallA(DMPlexSetCone(dm, 10_PETSC_INT_KIND, pVE, ierr))
60: PetscCallA(DMPlexSymmetrize(dm, ierr))
61: PetscCallA(DMPlexStratify(dm, ierr))
62: PetscCallA(DMView(dm, PETSC_VIEWER_STDOUT_WORLD, ierr))
64: ! Test Closure
65: do cell = 0, 1
66: PetscCallA(DMPlexGetTransitiveClosure(dm, cell, PETSC_TRUE, nC, nClosure, ierr))
67: ! Different Fortran compilers print a different number of columns
68: ! per row producing different outputs in the test runs hence
69: ! do not print the nClosure
70: write (*, 1000) 'nClosure ', nClosure
71: 1000 format(a, 30i4)
72: PetscCallA(DMPlexRestoreTransitiveClosure(dm, cell, PETSC_TRUE, nC, nClosure, ierr))
73: end do
75: ! Test Join
76: size = 2
77: VE = [6, 7]
78: pVE => VE
79: PetscCallA(DMPlexGetJoin(dm, size, pVE, PETSC_NULL_INTEGER, nJoin, ierr))
80: write (*, 1001) 'Join of', pVE
81: write (*, 1002) ' is', nJoin
82: PetscCallA(DMPlexRestoreJoin(dm, size, pVE, PETSC_NULL_INTEGER, nJoin, ierr))
83: size = 2
84: VE = [9, 7]
85: pVE => VE
86: PetscCallA(DMPlexGetJoin(dm, size, pVE, PETSC_NULL_INTEGER, nJoin, ierr))
87: write (*, 1001) 'Join of', pVE
88: 1001 format(a, 10i5)
89: write (*, 1002) ' is', nJoin
90: 1002 format(a, 10i5)
91: PetscCallA(DMPlexRestoreJoin(dm, size, pVE, PETSC_NULL_INTEGER, nJoin, ierr))
92: ! Test Full Join
93: size = 3
94: EC = [3, 4, 5]
95: pEC => EC
96: PetscCallA(DMPlexGetFullJoin(dm, size, pEC, PETSC_NULL_INTEGER, nJoin, ierr))
97: write (*, 1001) 'Full Join of', pEC
98: write (*, 1002) ' is', nJoin
99: PetscCallA(DMPlexRestoreJoin(dm, size, pEC, PETSC_NULL_INTEGER, nJoin, ierr))
100: ! Test Meet
101: size = 2
102: VE = [0, 1]
103: pVE => VE
104: PetscCallA(DMPlexGetMeet(dm, size, pVE, PETSC_NULL_INTEGER, nMeet, ierr))
105: write (*, 1001) 'Meet of', pVE
106: write (*, 1002) ' is', nMeet
107: PetscCallA(DMPlexRestoreMeet(dm, size, pVE, PETSC_NULL_INTEGER, nMeet, ierr))
108: size = 2
109: VE = [6, 7]
110: pVE => VE
111: PetscCallA(DMPlexGetMeet(dm, size, pVE, PETSC_NULL_INTEGER, nMeet, ierr))
112: write (*, 1001) 'Meet of', pVE
113: write (*, 1002) ' is', nMeet
114: PetscCallA(DMPlexRestoreMeet(dm, size, pVE, PETSC_NULL_INTEGER, nMeet, ierr))
116: PetscCallA(DMDestroy(dm, ierr))
117: PetscCallA(PetscFinalize(ierr))
118: end
119: !
120: !/*TEST
121: !
122: ! test:
123: ! suffix: 0
124: !
125: !TEST*/