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