1 static char help[] = "Test PetscViewer_ExodusII\n\n"; 2 3 #include <petsc.h> 4 #include <exodusII.h> 5 6 int main(int argc, char **argv) 7 { 8 DM dm, pdm; 9 PetscInt ovlp = 0; 10 char ifilename[PETSC_MAX_PATH_LEN], ofilename[PETSC_MAX_PATH_LEN]; 11 int numZVars, numNVars; 12 int nNodalVar = 4; 13 int nZonalVar = 3; 14 int order = 1; 15 PetscViewer viewer; 16 int index = -1; 17 const char *nodalVarName[4] = {"U_x", "U_y", "Alpha", "Beta"}; 18 const char *zonalVarName[3] = {"Sigma_11", "Sigma_12", "Sigma_22"}; 19 const char *testNames[3] = {"U", "Sigma", "Gamma"}; 20 char **varNames; 21 22 PetscFunctionBeginUser; 23 PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 24 PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "PetscViewer_ExodusII test", "ex96"); 25 PetscCall(PetscOptionsString("-i", "Filename to read", "ex96", ifilename, ifilename, sizeof(ifilename), NULL)); 26 PetscCall(PetscOptionsString("-o", "Filename to write", "ex96", ofilename, ofilename, sizeof(ofilename), NULL)); 27 PetscOptionsEnd(); 28 29 #ifdef PETSC_USE_DEBUG 30 PetscCallExternal(ex_opts, EX_VERBOSE + EX_DEBUG); 31 #endif 32 33 PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, ifilename, NULL, PETSC_TRUE, &dm)); 34 PetscCall(DMPlexDistributeSetDefault(dm, PETSC_FALSE)); 35 PetscCall(DMSetFromOptions(dm)); 36 PetscCall(PetscObjectSetName((PetscObject)dm, "ex96")); 37 PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 38 39 PetscCall(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_WRITE, &viewer)); 40 41 /* Save the geometry to the file, erasing all previous content */ 42 PetscCall(PetscViewerExodusIISetOrder(viewer, order)); 43 PetscCall(DMView(dm, viewer)); 44 PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD)); 45 PetscCall(PetscViewerFlush(viewer)); 46 47 PetscCall(DMPlexDistribute(dm, ovlp, NULL, &pdm)); 48 if (!pdm) pdm = dm; 49 50 /* Testing Variable Number*/ 51 PetscCall(PetscViewerExodusIISetZonalVariable(viewer, nZonalVar)); 52 nZonalVar = -1; 53 PetscCall(PetscViewerExodusIIGetZonalVariable(viewer, &nZonalVar)); 54 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of zonal variables: %d\n", nZonalVar)); 55 56 PetscCall(PetscViewerExodusIISetNodalVariable(viewer, nNodalVar)); 57 nNodalVar = -1; 58 PetscCall(PetscViewerExodusIIGetNodalVariable(viewer, &nNodalVar)); 59 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of nodal variables: %d\n", nNodalVar)); 60 PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD)); 61 62 /* 63 Test of PetscViewerExodusIISet[Nodal/Zonal]VariableNames 64 */ 65 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIISet[Nodal/Zonal]VariableNames\n")); 66 PetscCall(PetscViewerExodusIISetZonalVariableNames(viewer, zonalVarName)); 67 PetscCall(PetscViewerExodusIISetNodalVariableNames(viewer, nodalVarName)); 68 PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD)); 69 PetscCall(PetscViewerDestroy(&viewer)); 70 71 /* 72 Test of PetscViewerExodusIIGet[Nodal/Zonal]VariableNames 73 */ 74 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n\nReopenning the output file in Read-only mode\n")); 75 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIIGet[Nodal/Zonal]VariableNames\n")); 76 PetscCall(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_APPEND, &viewer)); 77 PetscCall(PetscViewerExodusIISetOrder(viewer, order)); 78 79 PetscCall(PetscViewerExodusIIGetNodalVariableNames(viewer, &numNVars, &varNames)); 80 for (int i = 0; i < numNVars; i++) { 81 PetscCall(PetscViewerExodusIIGetNodalVariableIndex(viewer, varNames[i], &index)); 82 PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Nodal variable %d: %s, index in file %d\n", i, varNames[i], index)); 83 } 84 for (int i = 0; i < 3; i++) { 85 PetscCall(PetscViewerExodusIIGetNodalVariableIndex(viewer, testNames[i], &index)); 86 PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Nodal variable %d: %s, index in file %d\n", i, testNames[i], index)); 87 } 88 89 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n")); 90 PetscCall(PetscViewerExodusIIGetZonalVariableNames(viewer, &numZVars, &varNames)); 91 for (int i = 0; i < numZVars; i++) { 92 PetscCall(PetscViewerExodusIIGetZonalVariableIndex(viewer, varNames[i], &index)); 93 PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Zonal variable %d: %s, index in file %d\n", i, varNames[i], index)); 94 } 95 for (int i = 0; i < 3; i++) { 96 PetscCall(PetscViewerExodusIIGetZonalVariableIndex(viewer, testNames[i], &index)); 97 PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Zonal variable %d: %s, index in file %d\n", i, testNames[i], index)); 98 } 99 100 PetscCall(PetscViewerDestroy(&viewer)); 101 PetscCall(DMDestroy(&dm)); 102 PetscCall(PetscFinalize()); 103 return 0; 104 } 105 106 /*TEST 107 108 build: 109 requires: exodusii pnetcdf !complex 110 test: 111 suffix: 0 112 nsize: 1 113 args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/FourSquareT-large.exo -o FourSquareT-large_out.exo 114 115 TEST*/ 116