149c89c76SBlaise Bourdin#include "petsc/finclude/petsc.h" 2c5e229c2SMartin Diehlprogram ex95f90 349c89c76SBlaise Bourdin use petsc 449c89c76SBlaise Bourdin implicit none 549c89c76SBlaise Bourdin#include "exodusII.inc" 649c89c76SBlaise Bourdin 749c89c76SBlaise Bourdin ! Get the Fortran kind associated with PetscInt and PetscReal so that we can use literal constants. 849c89c76SBlaise Bourdin PetscInt :: dummyPetscInt 949c89c76SBlaise Bourdin PetscReal :: dummyPetscreal 1049c89c76SBlaise Bourdin PetscBool :: flg 1149c89c76SBlaise Bourdin integer, parameter :: kPI = kind(dummyPetscInt) 1249c89c76SBlaise Bourdin integer, parameter :: kPR = kind(dummyPetscReal) 1349c89c76SBlaise Bourdin integer :: nNodalVar = 4 1449c89c76SBlaise Bourdin integer :: nZonalVar = 3 1549c89c76SBlaise Bourdin integer :: i 1649c89c76SBlaise Bourdin 1749c89c76SBlaise Bourdin PetscErrorCode :: ierr 1849c89c76SBlaise Bourdin type(tDM) :: dm, pdm 1949c89c76SBlaise Bourdin character(len=PETSC_MAX_PATH_LEN) :: ifilename, ofilename, IOBuffer 200a5cf5d8SBlaise Bourdin PetscInt :: order = 1 2149c89c76SBlaise Bourdin type(tPetscViewer) :: viewer 2249c89c76SBlaise Bourdin character(len=MXNAME), dimension(4) :: nodalVarName = ["U_x ", & 2349c89c76SBlaise Bourdin "U_y ", & 2449c89c76SBlaise Bourdin "Alpha", & 2549c89c76SBlaise Bourdin "Beta "] 2649c89c76SBlaise Bourdin character(len=MXNAME), dimension(3) :: zonalVarName = ["Sigma_11", & 2749c89c76SBlaise Bourdin "Sigma_12", & 2849c89c76SBlaise Bourdin "Sigma_22"] 2949c89c76SBlaise Bourdin character(len=MXNAME) :: varName 3049c89c76SBlaise Bourdin 3149c89c76SBlaise Bourdin PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr)) 3249c89c76SBlaise Bourdin if (ierr /= 0) then 3349c89c76SBlaise Bourdin print *, 'Unable to initialize PETSc' 3449c89c76SBlaise Bourdin stop 3549c89c76SBlaise Bourdin end if 3649c89c76SBlaise Bourdin 3749c89c76SBlaise Bourdin PetscCallA(PetscOptionsBegin(PETSC_COMM_WORLD, PETSC_NULL_CHARACTER, 'PetscViewer_ExodusII test', 'ex95f90', ierr)) 38ccfd86f1SBarry Smith PetscCallA(PetscOptionsString("-i", "Filename to read", "ex95f90", ifilename, ifilename, flg, ierr)) 3949c89c76SBlaise Bourdin PetscCheckA(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, 'missing input file name -i <input file name>') 40ccfd86f1SBarry Smith PetscCallA(PetscOptionsString("-o", "Filename to write", "ex95f90", ofilename, ofilename, flg, ierr)) 4149c89c76SBlaise Bourdin PetscCheckA(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, 'missing output file name -o <output file name>') 4249c89c76SBlaise Bourdin PetscCallA(PetscOptionsEnd(ierr)) 4349c89c76SBlaise Bourdin 4449c89c76SBlaise Bourdin ! Read the mesh in any supported format 4549c89c76SBlaise Bourdin PetscCallA(DMPlexCreateFromFile(PETSC_COMM_WORLD, ifilename, PETSC_NULL_CHARACTER, PETSC_TRUE, dm, ierr)) 46ccfd86f1SBarry Smith PetscCallA(DMPlexDistributeSetDefault(dm, PETSC_FALSE, ierr)) 47ccfd86f1SBarry Smith PetscCallA(DMSetFromOptions(dm, ierr)) 48ccfd86f1SBarry Smith PetscCallA(PetscObjectSetName(dm, "ex95f90", ierr)) 49ccfd86f1SBarry Smith PetscCallA(DMViewFromOptions(dm, PETSC_NULL_OBJECT, '-dm_view', ierr)) 5049c89c76SBlaise Bourdin 5149c89c76SBlaise Bourdin ! enable exodus debugging information 5249c89c76SBlaise Bourdin#ifdef PETSC_USE_DEBUG 5349c89c76SBlaise Bourdin PetscCallA(exopts(EXVRBS + EXDEBG, ierr)) 5449c89c76SBlaise Bourdin#endif 5549c89c76SBlaise Bourdin 5649c89c76SBlaise Bourdin ! Create the exodus file 5749c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_WRITE, viewer, ierr)) 5849c89c76SBlaise Bourdin 5949c89c76SBlaise Bourdin ! Save the geometry to the file, erasing all previous content 6049c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIISetOrder(viewer, order, ierr)) 6149c89c76SBlaise Bourdin PetscCallA(DMView(dm, viewer, ierr)) 6249c89c76SBlaise Bourdin PetscCallA(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD, ierr)) 6349c89c76SBlaise Bourdin PetscCall(PetscViewerFlush(viewer, ierr)) 6449c89c76SBlaise Bourdin 6549c89c76SBlaise Bourdin PetscCallA(DMPlexDistribute(dm, 0_kPI, PETSC_NULL_SF, pdm, ierr)) 66*02c639afSMartin Diehl if (pdm /= PETSC_NULL_DM) then 6749c89c76SBlaise Bourdin pdm = dm 6849c89c76SBlaise Bourdin end if 6949c89c76SBlaise Bourdin 7049c89c76SBlaise Bourdin ! Testing Variable Number 7149c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIISetZonalVariable(viewer, nZonalVar, ierr)) 7249c89c76SBlaise Bourdin nZonalVar = -1 7349c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetZonalVariable(viewer, nZonalVar, ierr)) 74*02c639afSMartin Diehl write (IOBuffer, '("Number of zonal variables:", I2,"\n")') nZonalVar 7549c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr)) 7649c89c76SBlaise Bourdin 7749c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIISetNodalVariable(viewer, nNodalVar, ierr)) 7849c89c76SBlaise Bourdin nNodalVar = -1 7949c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetNodalVariable(viewer, nNodalVar, ierr)) 80*02c639afSMartin Diehl write (IOBuffer, '("Number of nodal variables:", I2,"\n")') nNodalVar 8149c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr)) 8249c89c76SBlaise Bourdin PetscCallA(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD, ierr)) 8349c89c76SBlaise Bourdin 8449c89c76SBlaise Bourdin ! Test of PetscViewerExodusIISet[Nodal/Zonal]VariableName 8549c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIISet[Nodal/Zonal]VariableName\n", ierr)) 8649c89c76SBlaise Bourdin do i = 1, nZonalVar 8749c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIISetZonalVariableName(viewer, i - 1, zonalVarName(i), ierr)) 8849c89c76SBlaise Bourdin end do 8949c89c76SBlaise Bourdin do i = 1, nNodalVar 9049c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIISetNodalVariableName(viewer, i - 1, nodalVarName(i), ierr)) 9149c89c76SBlaise Bourdin end do 9249c89c76SBlaise Bourdin PetscCall(PetscViewerFlush(viewer, ierr)) 9349c89c76SBlaise Bourdin PetscCallA(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD, ierr)) 9449c89c76SBlaise Bourdin 9549c89c76SBlaise Bourdin do i = 1, nZonalVar 9649c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetZonalVariableName(viewer, i - 1, varName, ierr)) 97*02c639afSMartin Diehl write (IOBuffer, '(" zonal variable:", I2,": ",A,"\n")') i, varName 9849c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr)) 9949c89c76SBlaise Bourdin end do 10049c89c76SBlaise Bourdin do i = 1, nNodalVar 10149c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetNodalVariableName(viewer, i - 1, varName, ierr)) 102*02c639afSMartin Diehl write (IOBuffer, '(" nodal variable:", I2,": ",A,"\n")') i, varName 10349c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr)) 10449c89c76SBlaise Bourdin end do 10549c89c76SBlaise Bourdin PetscCallA(PetscViewerDestroy(viewer, ierr)) 10649c89c76SBlaise Bourdin 10749c89c76SBlaise Bourdin ! Test of PetscViewerExodusIIGet[Nodal/Zonal]VariableName 10849c89c76SBlaise Bourdin nZonalVar = -1 10949c89c76SBlaise Bourdin nNodalVar = -1 11049c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, "\n\nReopenning the output file in Read-only mode\n", ierr)) 11149c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIIGet[Nodal/Zonal]VariableName\n", ierr)) 11249c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_APPEND, viewer, ierr)) 11349c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIISetOrder(viewer, order, ierr)) 11449c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetZonalVariable(viewer, nZonalVar, ierr)) 11549c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetNodalVariable(viewer, nNodalVar, ierr)) 11649c89c76SBlaise Bourdin 11749c89c76SBlaise Bourdin do i = 1, nZonalVar 11849c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetZonalVariableName(viewer, i - 1, varName, ierr)) 119*02c639afSMartin Diehl write (IOBuffer, '(" zonal variable:", I2,": ",A,"\n")') i, varName 12049c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr)) 12149c89c76SBlaise Bourdin end do 12249c89c76SBlaise Bourdin do i = 1, nNodalVar 12349c89c76SBlaise Bourdin PetscCallA(PetscViewerExodusIIGetNodalVariableName(viewer, i - 1, varName, ierr)) 124*02c639afSMartin Diehl write (IOBuffer, '(" nodal variable:", I2,": ",A,"\n")') i, varName 12549c89c76SBlaise Bourdin PetscCallA(PetscPrintf(PETSC_COMM_WORLD, IOBuffer, ierr)) 12649c89c76SBlaise Bourdin end do 12749c89c76SBlaise Bourdin 12849c89c76SBlaise Bourdin PetscCallA(DMDestroy(dm, ierr)) 12949c89c76SBlaise Bourdin PetscCallA(PetscViewerDestroy(viewer, ierr)) 13049c89c76SBlaise Bourdin PetscCallA(PetscFinalize(ierr)) 13149c89c76SBlaise Bourdinend program ex95f90 13249c89c76SBlaise Bourdin 1336449c900SBarry Smith!/*TEST 1346449c900SBarry Smith! 1356449c900SBarry Smith! build: 1366449c900SBarry Smith! requires: exodusii pnetcdf !complex 1376449c900SBarry Smith! test: 1386449c900SBarry Smith! suffix: 0 1396449c900SBarry Smith! nsize: 1 1406449c900SBarry Smith! args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/FourSquareT-large.exo -o FourSquareT-large_out.exo 1416449c900SBarry Smith! 1426449c900SBarry Smith!TEST*/ 143