xref: /petsc/src/dm/impls/plex/tests/ex95f90.F90 (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
1program ex95f90
2#include "petsc/finclude/petsc.h"
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    endif
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
142TEST*/
143