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! 142!TEST*/ 143