Actual source code: ex95f90.F90

  1: program ex95f90
  2: #include "petsc/finclude/petsc.h"
  3:   use petsc
  4:   implicit none
  5: #include "exodusII.inc"

  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

 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

 31:   PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
 32:   if (ierr /= 0) then
 33:     print *, 'Unable to initialize PETSc'
 34:     stop
 35:   end if

 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 ')
 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 ')
 42:   PetscCallA(PetscOptionsEnd(ierr))

 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))

 51:   ! enable exodus debugging information
 52: #ifdef PETSC_USE_DEBUG
 53:   PetscCallA(exopts(EXVRBS + EXDEBG, ierr))
 54: #endif

 56:   ! Create the exodus file
 57:   PetscCallA(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_WRITE, viewer, ierr))

 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))

 65:   PetscCallA(DMPlexDistribute(dm, 0_kPI, PETSC_NULL_SF, pdm, ierr))
 66:   if (pdm /= PETSC_NULL_DM) Then
 67:     pdm = dm
 68:   end if

 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))

 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))

 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))

 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))

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))

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

128:   PetscCallA(DMDestroy(dm, ierr))
129:   PetscCallA(PetscViewerDestroy(viewer, ierr))
130:   PetscCallA(PetscFinalize(ierr))
131: end program ex95f90

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*/