xref: /petsc/src/dm/impls/plex/tests/ex95.c (revision a3f1d042deeee8d591d0e166df91c7782e45ac59)
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   const char *varName         = NULL;
21 
22   PetscFunctionBeginUser;
23   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
24   PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "PetscViewer_ExodusII test", "ex95");
25   PetscCall(PetscOptionsString("-i", "Filename to read", "ex95", ifilename, ifilename, sizeof(ifilename), NULL));
26   PetscCall(PetscOptionsString("-o", "Filename to write", "ex95", 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, "ex95"));
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]VariableName
64   */
65   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing PetscViewerExodusIISet[Nodal/Zonal]VariableName\n"));
66   for (int i = 0; i < nNodalVar; i++) { PetscCall(PetscViewerExodusIISetNodalVariableName(viewer, i, nodalVarName[i])); }
67   for (int i = 0; i < nZonalVar; i++) { PetscCall(PetscViewerExodusIISetZonalVariableName(viewer, i, zonalVarName[i])); }
68   PetscCall(PetscViewerView(viewer, PETSC_VIEWER_STDOUT_WORLD));
69   PetscCall(PetscViewerDestroy(&viewer));
70 
71   /*
72     Test of PetscViewerExodusIIGet[Nodal/Zonal]VariableName
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]VariableName\n"));
76   PetscCall(PetscViewerExodusIIOpen(PETSC_COMM_WORLD, ofilename, FILE_MODE_APPEND, &viewer));
77   PetscCall(PetscViewerExodusIISetOrder(viewer, order));
78   PetscCall(PetscViewerExodusIIGetZonalVariable(viewer, &numZVars));
79   PetscCall(PetscViewerExodusIIGetNodalVariable(viewer, &numNVars));
80 
81   for (int i = 0; i < numNVars; i++) {
82     PetscCall(PetscViewerExodusIIGetNodalVariableName(viewer, i, &varName));
83     PetscCall(PetscViewerExodusIIGetNodalVariableIndex(viewer, varName, &index));
84     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Nodal variable %d: %s, index in file %d\n", i, varName, index));
85   }
86   for (int i = 0; i < 3; i++) {
87     PetscCall(PetscViewerExodusIIGetNodalVariableIndex(viewer, testNames[i], &index));
88     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Nodal variable %d: %s, index in file %d\n", i, testNames[i], index));
89   }
90   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n"));
91 
92   for (int i = 0; i < numZVars; i++) {
93     PetscCall(PetscViewerExodusIIGetZonalVariableName(viewer, i, &varName));
94     PetscCall(PetscViewerExodusIIGetZonalVariableIndex(viewer, varName, &index));
95     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Zonal variable %d: %s, index in file %d\n", i, varName, index));
96   }
97   for (int i = 0; i < 3; i++) {
98     PetscCall(PetscViewerExodusIIGetZonalVariableIndex(viewer, testNames[i], &index));
99     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   Zonal variable %d: %s, index in file %d\n", i, testNames[i], index));
100   }
101 
102   PetscCall(PetscViewerDestroy(&viewer));
103   PetscCall(DMDestroy(&dm));
104   PetscCall(PetscFinalize());
105   return 0;
106 }
107 
108 /*TEST
109 
110   build:
111     requires: exodusii pnetcdf !complex
112   test:
113     suffix: 0
114     nsize: 1
115     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/FourSquareT-large.exo -o FourSquareT-large_out.exo
116 
117 TEST*/
118