Actual source code: ex95.c

  1: #include "petscsystypes.h"
  2: static char help[] = "Test PetscViewer_ExodusII\n\n";

  4: #include <petsc.h>
  5: #include <exodusII.h>

  7: int main(int argc, char **argv)
  8: {
  9:   DM               dm, pdm;
 10:   PetscInt         ovlp = 0;
 11:   char             ifilename[PETSC_MAX_PATH_LEN], ofilename[PETSC_MAX_PATH_LEN];
 12:   PetscExodusIIInt numZVars, numNVars;
 13:   PetscExodusIIInt nNodalVar = 4;
 14:   PetscExodusIIInt nZonalVar = 3;
 15:   PetscInt         order     = 1;
 16:   PetscViewer      viewer;
 17:   PetscExodusIIInt index           = -1;
 18:   const char      *nodalVarName[4] = {"U_x", "U_y", "Alpha", "Beta"};
 19:   const char      *zonalVarName[3] = {"Sigma_11", "Sigma_12", "Sigma_22"};
 20:   const char      *testNames[3]    = {"U", "Sigma", "Gamma"};
 21:   const char      *varName         = NULL;

 23:   PetscFunctionBeginUser;
 24:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 25:   PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "PetscViewer_ExodusII test", "ex95");
 26:   PetscCall(PetscOptionsString("-i", "Filename to read", "ex95", ifilename, ifilename, sizeof(ifilename), NULL));
 27:   PetscCall(PetscOptionsString("-o", "Filename to write", "ex95", ofilename, ofilename, sizeof(ofilename), NULL));
 28:   PetscOptionsEnd();

 30: #ifdef PETSC_USE_DEBUG
 31:   PetscCallExternal(ex_opts, EX_VERBOSE + EX_DEBUG);
 32: #endif

 34:   PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, ifilename, NULL, PETSC_TRUE, &dm));
 35:   PetscCall(DMPlexDistributeSetDefault(dm, PETSC_FALSE));
 36:   PetscCall(DMSetFromOptions(dm));
 37:   PetscCall(PetscObjectSetName((PetscObject)dm, "ex95"));
 38:   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));

 40:   PetscCall(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_WRITE, &viewer));

 42:   /* Save the geometry to the file, erasing all previous content */
 43:   PetscCall(PetscViewerExodusIISetOrder(viewer, order));
 44:   PetscCall(DMView(dm, viewer));
 45:   PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD));
 46:   PetscCall(PetscViewerFlush(viewer));

 48:   PetscCall(DMPlexDistribute(dm, ovlp, NULL, &pdm));
 49:   if (!pdm) pdm = dm;

 51:   /* Testing Variable Number*/
 52:   PetscCall(PetscViewerExodusIISetZonalVariable(viewer, nZonalVar));
 53:   nZonalVar = -1;
 54:   PetscCall(PetscViewerExodusIIGetZonalVariable(viewer, &nZonalVar));
 55:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of zonal variables: %d\n", nZonalVar));

 57:   PetscCall(PetscViewerExodusIISetNodalVariable(viewer, nNodalVar));
 58:   nNodalVar = -1;
 59:   PetscCall(PetscViewerExodusIIGetNodalVariable(viewer, &nNodalVar));
 60:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of nodal variables: %d\n", nNodalVar));
 61:   PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD));

 63:   /*
 64:     Test of PetscViewerExodusIISet[Nodal/Zonal]VariableName
 65:   */
 66:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIISet[Nodal/Zonal]VariableName\n"));
 67:   for (PetscExodusIIInt i = 0; i < nNodalVar; i++) { PetscCall(PetscViewerExodusIISetNodalVariableName(viewer, i, nodalVarName[i])); }
 68:   for (PetscExodusIIInt i = 0; i < nZonalVar; i++) { PetscCall(PetscViewerExodusIISetZonalVariableName(viewer, i, zonalVarName[i])); }
 69:   PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD));
 70:   PetscCall(PetscViewerDestroy(&viewer));

 72:   /*
 73:     Test of PetscViewerExodusIIGet[Nodal/Zonal]VariableName
 74:   */
 75:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n\nReopenning the output file in Read-only mode\n"));
 76:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIIGet[Nodal/Zonal]VariableName\n"));
 77:   PetscCall(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_APPEND, &viewer));
 78:   PetscCall(PetscViewerExodusIISetOrder(viewer, order));
 79:   PetscCall(PetscViewerExodusIIGetZonalVariable(viewer, &numZVars));
 80:   PetscCall(PetscViewerExodusIIGetNodalVariable(viewer, &numNVars));

 82:   for (PetscExodusIIInt i = 0; i < numNVars; i++) {
 83:     PetscCall(PetscViewerExodusIIGetNodalVariableName(viewer, i, &varName));
 84:     PetscCall(PetscViewerExodusIIGetNodalVariableIndex(viewer, varName, &index));
 85:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Nodal variable %d: %s, index in file %d\n", i, varName, index));
 86:   }
 87:   for (PetscExodusIIInt i = 0; i < 3; i++) {
 88:     PetscCall(PetscViewerExodusIIGetNodalVariableIndex(viewer, testNames[i], &index));
 89:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Nodal variable %d: %s, index in file %d\n", i, testNames[i], index));
 90:   }
 91:   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n"));

 93:   for (PetscExodusIIInt i = 0; i < numZVars; i++) {
 94:     PetscCall(PetscViewerExodusIIGetZonalVariableName(viewer, i, &varName));
 95:     PetscCall(PetscViewerExodusIIGetZonalVariableIndex(viewer, varName, &index));
 96:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Zonal variable %d: %s, index in file %d\n", i, varName, index));
 97:   }
 98:   for (PetscExodusIIInt i = 0; i < 3; i++) {
 99:     PetscCall(PetscViewerExodusIIGetZonalVariableIndex(viewer, testNames[i], &index));
100:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Zonal variable %d: %s, index in file %d\n", i, testNames[i], index));
101:   }

103:   PetscCall(PetscViewerDestroy(&viewer));
104:   PetscCall(DMDestroy(&dm));
105:   PetscCall(PetscFinalize());
106:   return 0;
107: }

109: /*TEST

111:   build:
112:     requires: exodusii pnetcdf !complex
113:   test:
114:     suffix: 0
115:     nsize: 1
116:     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/FourSquareT-large.exo -o FourSquareT-large_out.exo

118: TEST*/