xref: /petsc/src/dm/impls/plex/tests/ex95.c (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
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