1 #include "petscsystypes.h" 2 static char help[] = "Test PetscViewer_ExodusII\n\n"; 3 4 #include <petsc.h> 5 #include <exodusII.h> 6 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; 22 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(); 29 30 #ifdef PETSC_USE_DEBUG 31 PetscCallExternal(ex_opts, EX_VERBOSE + EX_DEBUG); 32 #endif 33 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")); 39 40 PetscCall(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_WRITE, &viewer)); 41 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)); 47 48 PetscCall(DMPlexDistribute(dm, ovlp, NULL, &pdm)); 49 if (!pdm) pdm = dm; 50 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)); 56 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)); 62 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)); 71 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)); 81 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")); 92 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 } 102 103 PetscCall(PetscViewerDestroy(&viewer)); 104 PetscCall(DMDestroy(&dm)); 105 PetscCall(PetscFinalize()); 106 return 0; 107 } 108 109 /*TEST 110 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 117 118 TEST*/ 119