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:     endif

 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_OPTIONS,'-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

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

142: TEST*/