1 #include "petscsystypes.h"
2 static char help[] = "Test PetscViewer_ExodusII\n\n";
3
4 #include <petsc.h>
5 #include <exodusII.h>
6
main(int argc,char ** argv)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