Actual source code: ex26f90.F90
1: #include "petsc/finclude/petscdmplex.h"
2: program ex26f90
3: use petscdmplex
4: implicit none
5: #include "exodusII.inc"
7: type(tDM) :: dm, dmU, dmA, dmS, dmUA, dmUA2, pDM
8: type(tDM), dimension(:), pointer :: dmList
9: type(tVec) :: X, U, A, S, UA, UA2
10: type(tIS) :: isU, isA, isS, isUA
11: type(tPetscSection) :: section
12: PetscInt, parameter :: fieldU = 0, fieldS = 1, fieldA = 2
13: PetscInt, parameter, dimension(2) :: fieldUA = [0, 2]
14: character(len=PETSC_MAX_PATH_LEN) :: ifilename, ofilename, IOBuffer
15: integer :: exoid = -1
16: type(tIS) :: csIS
17: PetscInt, dimension(:), pointer :: csID
18: PetscInt, dimension(:), pointer :: pStartDepth, pEndDepth
19: PetscInt :: order = 1
20: integer :: i
21: PetscInt :: sdim, d, pStart, pEnd, p, numCS, set, j, k
22: PetscMPIInt :: rank, numProc
23: PetscBool :: flg
24: PetscErrorCode :: ierr
25: MPIU_Comm :: comm
26: type(tPetscViewer) :: viewer
28: character(len=MXSTLN) :: sJunk
29: PetscInt, parameter :: numstep = 3
30: PetscInt :: step
31: integer :: numNodalVar, numZonalVar
32: character(len=MXNAME), dimension(4) :: nodalVarName2D = ["U_x ", &
33: "U_y ", &
34: "Alpha", &
35: "Beta "]
36: character(len=MXNAME), dimension(3) :: zonalVarName2D = ["Sigma_11", &
37: "Sigma_12", &
38: "Sigma_22"]
39: character(len=MXNAME), dimension(5) :: nodalVarName3D = ["U_x ", &
40: "U_y ", &
41: "U_z ", &
42: "Alpha", &
43: "Beta "]
44: character(len=MXNAME), dimension(6) :: zonalVarName3D = ["Sigma_11", &
45: "Sigma_22", &
46: "Sigma_33", &
47: "Sigma_23", &
48: "Sigma_13", &
49: "Sigma_12"]
50: logical, dimension(:, :), pointer :: truthtable
52: type(tIS) :: cellIS
53: PetscInt, dimension(:), pointer :: cellID
54: PetscInt :: numCells, cell, closureSize
55: PetscInt, dimension(:), pointer :: closureA, closure
57: type(tPetscSection) :: sectionUA, coordSection
58: type(tVec) :: UALoc, coord
59: PetscScalar, dimension(:), pointer :: cval, xyz
60: PetscInt :: dofUA, offUA, c
62: ! dof layout ordered by increasing height in the DAG: cell, face, edge, vertex
63: PetscInt, dimension(3), target :: dofS2D = [0, 0, 3]
64: PetscInt, dimension(3), target :: dofUP1Tri = [2, 0, 0]
65: PetscInt, dimension(3), target :: dofAP1Tri = [1, 0, 0]
66: PetscInt, dimension(3), target :: dofUP2Tri = [2, 2, 0]
67: PetscInt, dimension(3), target :: dofAP2Tri = [1, 1, 0]
68: PetscInt, dimension(3), target :: dofUP1Quad = [2, 0, 0]
69: PetscInt, dimension(3), target :: dofAP1Quad = [1, 0, 0]
70: PetscInt, dimension(3), target :: dofUP2Quad = [2, 2, 2]
71: PetscInt, dimension(3), target :: dofAP2Quad = [1, 1, 1]
72: PetscInt, dimension(4), target :: dofS3D = [0, 0, 0, 6]
73: PetscInt, dimension(4), target :: dofUP1Tet = [3, 0, 0, 0]
74: PetscInt, dimension(4), target :: dofAP1Tet = [1, 0, 0, 0]
75: PetscInt, dimension(4), target :: dofUP2Tet = [3, 3, 0, 0]
76: PetscInt, dimension(4), target :: dofAP2Tet = [1, 1, 0, 0]
77: PetscInt, dimension(4), target :: dofUP1Hex = [3, 0, 0, 0]
78: PetscInt, dimension(4), target :: dofAP1Hex = [1, 0, 0, 0]
79: PetscInt, dimension(4), target :: dofUP2Hex = [3, 3, 3, 3]
80: PetscInt, dimension(4), target :: dofAP2Hex = [1, 1, 1, 1]
81: PetscInt, dimension(:), pointer :: dofU, dofA, dofS
83: type(tPetscSF) :: migrationSF
84: PetscPartitioner :: part
85: PetscLayout :: layout
87: type(tVec) :: tmpVec
88: PetscReal :: norm
89: PetscReal :: time
91: PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
92: if (ierr /= 0) then
93: print *, 'Unable to initialize PETSc'
94: stop
95: end if
97: PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
98: PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, numProc, ierr))
99: PetscCallA(PetscOptionsGetString(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-i', ifilename, flg, ierr))
100: PetscCheckA(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, 'missing input file name -i ')
101: PetscCallA(PetscOptionsGetString(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-o', ofilename, flg, ierr))
102: PetscCheckA(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, 'missing output file name -o