xref: /petsc/src/dm/impls/plex/tests/ex95f90.F90 (revision ccfb0f9f40a0131988d7995ed9679700dae2a75a)
1#include "petsc/finclude/petsc.h"
2program ex95f90
3  use petsc
4  implicit none
5#include "exodusII.inc"
6
7  ! Get the Fortran kind associated with PetscInt and PetscReal so that we can use literal constants.
8  PetscInt                             :: dummyPetscInt
9  PetscReal                            :: dummyPetscreal
10  PetscBool                            :: flg
11  integer, parameter                    :: kPI = kind(dummyPetscInt)
12  integer, parameter                    :: kPR = kind(dummyPetscReal)
13  integer                              :: nNodalVar = 4
14  integer                              :: nZonalVar = 3
15  integer                              :: i
16
17  PetscErrorCode                       :: ierr
18  type(tDM)                            :: dm, pdm
19  character(len=PETSC_MAX_PATH_LEN)    :: ifilename, ofilename, IOBuffer
20  PetscInt                             :: order = 1
21  type(tPetscViewer)                   :: viewer
22  character(len=MXNAME), dimension(4) :: nodalVarName = ["U_x  ", &
23                                                         "U_y  ", &
24                                                         "Alpha", &
25                                                         "Beta "]
26  character(len=MXNAME), dimension(3) :: zonalVarName = ["Sigma_11", &
27                                                         "Sigma_12", &
28                                                         "Sigma_22"]
29  character(len=MXNAME)              :: varName
30
31  PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
32  if (ierr /= 0) then
33    print *, 'Unable to initialize PETSc'
34    stop
35  end if
36
37  PetscCallA(PetscOptionsBegin(PETSC_COMM_WORLD, PETSC_NULL_CHARACTER, 'PetscViewer_ExodusII test', 'ex95f90', ierr))
38  PetscCallA(PetscOptionsString("-i", "Filename to read", "ex95f90", ifilename, ifilename, flg, ierr))
39  PetscCheckA(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, 'missing input file name -i <input file name>')
40  PetscCallA(PetscOptionsString("-o", "Filename to write", "ex95f90", ofilename, ofilename, flg, ierr))
41  PetscCheckA(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, 'missing output file name -o <output file name>')
42  PetscCallA(PetscOptionsEnd(ierr))
43
44  ! Read the mesh in any supported format
45  PetscCallA(DMPlexCreateFromFile(PETSC_COMM_WORLD, ifilename, PETSC_NULL_CHARACTER, PETSC_TRUE, dm, ierr))
46  PetscCallA(DMPlexDistributeSetDefault(dm, PETSC_FALSE, ierr))
47  PetscCallA(DMSetFromOptions(dm, ierr))
48  PetscCallA(PetscObjectSetName(dm, "ex95f90", ierr))
49  PetscCallA(DMViewFromOptions(dm, PETSC_NULL_OBJECT, '-dm_view', ierr))
50
51  ! enable exodus debugging information
52#ifdef PETSC_USE_DEBUG
53  PetscCallA(exopts(EXVRBS + EXDEBG, ierr))
54#endif
55
56  ! Create the exodus file
57  PetscCallA(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_WRITE, viewer, ierr))
58
59  ! Save the geometry to the file, erasing all previous content
60  PetscCallA(PetscViewerExodusIISetOrder(viewer, order, ierr))
61  PetscCallA(DMView(dm, viewer, ierr))
62  PetscCallA(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD, ierr))
63  PetscCall(PetscViewerFlush(viewer, ierr))
64
65  PetscCallA(DMPlexDistribute(dm, 0_kPI, PETSC_NULL_SF, pdm, ierr))
66  if (pdm /= PETSC_NULL_DM) Then
67    pdm = dm
68  end if
69
70  ! Testing Variable Number
71  PetscCallA(PetscViewerExodusIISetZonalVariable(viewer, nZonalVar, ierr))
72  nZonalVar = -1
73  PetscCallA(PetscViewerExodusIIGetZonalVariable(viewer, nZonalVar, ierr))
74  Write (IOBuffer, '("Number of zonal variables:", I2,"\n")') nZonalVar
75  PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr))
76
77  PetscCallA(PetscViewerExodusIISetNodalVariable(viewer, nNodalVar, ierr))
78  nNodalVar = -1
79  PetscCallA(PetscViewerExodusIIGetNodalVariable(viewer, nNodalVar, ierr))
80  Write (IOBuffer, '("Number of nodal variables:", I2,"\n")') nNodalVar
81  PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr))
82  PetscCallA(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD, ierr))
83
84  ! Test of PetscViewerExodusIISet[Nodal/Zonal]VariableName
85  PetscCallA(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIISet[Nodal/Zonal]VariableName\n", ierr))
86  do i = 1, nZonalVar
87    PetscCallA(PetscViewerExodusIISetZonalVariableName(viewer, i - 1, zonalVarName(i), ierr))
88  end do
89  do i = 1, nNodalVar
90    PetscCallA(PetscViewerExodusIISetNodalVariableName(viewer, i - 1, nodalVarName(i), ierr))
91  end do
92  PetscCall(PetscViewerFlush(viewer, ierr))
93  PetscCallA(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD, ierr))
94
95  do i = 1, nZonalVar
96    PetscCallA(PetscViewerExodusIIGetZonalVariableName(viewer, i - 1, varName, ierr))
97    Write (IOBuffer, '("   zonal variable:", I2,": ",A,"\n")') i, varName
98    PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr))
99  end do
100  do i = 1, nNodalVar
101    PetscCallA(PetscViewerExodusIIGetNodalVariableName(viewer, i - 1, varName, ierr))
102    Write (IOBuffer, '("   nodal variable:", I2,": ",A,"\n")') i, varName
103    PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr))
104  end do
105  PetscCallA(PetscViewerDestroy(viewer, ierr))
106
107  ! Test of PetscViewerExodusIIGet[Nodal/Zonal]VariableName
108  nZonalVar = -1
109  nNodalVar = -1
110  PetscCallA(PetscPrintf(PETSC_COMM_WORLD, "\n\nReopenning the output file in Read-only mode\n", ierr))
111  PetscCallA(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIIGet[Nodal/Zonal]VariableName\n", ierr))
112  PetscCallA(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_APPEND, viewer, ierr))
113  PetscCallA(PetscViewerExodusIISetOrder(viewer, order, ierr))
114  PetscCallA(PetscViewerExodusIIGetZonalVariable(viewer, nZonalVar, ierr))
115  PetscCallA(PetscViewerExodusIIGetNodalVariable(viewer, nNodalVar, ierr))
116
117  do i = 1, nZonalVar
118    PetscCallA(PetscViewerExodusIIGetZonalVariableName(viewer, i - 1, varName, ierr))
119    Write (IOBuffer, '("   zonal variable:", I2,": ",A,"\n")') i, varName
120    PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr))
121  end do
122  do i = 1, nNodalVar
123    PetscCallA(PetscViewerExodusIIGetNodalVariableName(viewer, i - 1, varName, ierr))
124    Write (IOBuffer, '("   nodal variable:", I2,": ",A,"\n")') i, varName
125    PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr))
126  end do
127
128  PetscCallA(DMDestroy(dm, ierr))
129  PetscCallA(PetscViewerDestroy(viewer, ierr))
130  PetscCallA(PetscFinalize(ierr))
131end program ex95f90
132
133!/*TEST
134!
135!  build:
136!    requires: exodusii pnetcdf !complex
137!  test:
138!    suffix: 0
139!    nsize: 1
140!    args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/FourSquareT-large.exo -o FourSquareT-large_out.exo
141!
142!TEST*/
143