xref: /petsc/src/dm/impls/plex/tests/ex95f90.F90 (revision 9b88ac225e01f016352a5f4cd90e158abe5f5675)
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