xref: /petsc/src/dm/impls/plex/plexvtk.c (revision b8cfa2af93c3fd6671a3f8741bd8c27dcc5fe8ba)
1 #define PETSCDM_DLL
2 #include <petsc/private/dmpleximpl.h> /*I   "petscdmplex.h"   I*/
3 #include <../src/sys/classes/viewer/impls/vtk/vtkvimpl.h>
4 
5 PetscErrorCode DMPlexVTKGetCellType_Internal(DM dm, PetscInt dim, PetscInt corners, PetscInt *cellType)
6 {
7   PetscFunctionBegin;
8   *cellType = -1;
9   switch (dim) {
10   case 0:
11     switch (corners) {
12     case 1:
13       *cellType = 1; /* VTK_VERTEX */
14       break;
15     default:
16       break;
17     }
18     break;
19   case 1:
20     switch (corners) {
21     case 2:
22       *cellType = 3; /* VTK_LINE */
23       break;
24     case 3:
25       *cellType = 21; /* VTK_QUADRATIC_EDGE */
26       break;
27     default:
28       break;
29     }
30     break;
31   case 2:
32     switch (corners) {
33     case 3:
34       *cellType = 5; /* VTK_TRIANGLE */
35       break;
36     case 4:
37       *cellType = 9; /* VTK_QUAD */
38       break;
39     case 6:
40       *cellType = 22; /* VTK_QUADRATIC_TRIANGLE */
41       break;
42     case 9:
43       *cellType = 23; /* VTK_QUADRATIC_QUAD */
44       break;
45     default:
46       break;
47     }
48     break;
49   case 3:
50     switch (corners) {
51     case 4:
52       *cellType = 10; /* VTK_TETRA */
53       break;
54     case 5:
55       *cellType = 14; /* VTK_PYRAMID */
56       break;
57     case 6:
58       *cellType = 13; /* VTK_WEDGE */
59       break;
60     case 8:
61       *cellType = 12; /* VTK_HEXAHEDRON */
62       break;
63     case 10:
64       *cellType = 24; /* VTK_QUADRATIC_TETRA */
65       break;
66     case 27:
67       *cellType = 29; /* VTK_QUADRATIC_HEXAHEDRON */
68       break;
69     default:
70       break;
71     }
72   }
73   PetscFunctionReturn(PETSC_SUCCESS);
74 }
75 
76 /*@
77   DMPlexVTKWriteAll - Write a file containing all the fields that have been provided to the viewer
78 
79   Collective
80 
81   Input Parameters:
82 + odm    - The `DMPLEX` specifying the mesh, passed as a `PetscObject`
83 - viewer - viewer of type `PETSCVIEWERVTK`
84 
85   Level: developer
86 
87   Note:
88   This function is a callback used by the VTK viewer to actually write the file.
89   The reason for this odd model is that the VTK file format does not provide any way to write one field at a time.
90   Instead, metadata for the entire file needs to be available up-front before you can start writing the file.
91 
92 .seealso: [](ch_unstructured), `DM`, `PETSCVIEWEREXODUSII`, `DMPLEX`, `PETSCVIEWERVTK`
93 @*/
94 PetscErrorCode DMPlexVTKWriteAll(PetscObject odm, PetscViewer viewer)
95 {
96   DM dm = (DM)odm;
97 
98   PetscFunctionBegin;
99   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
100   PetscValidHeaderSpecificType(viewer, PETSC_VIEWER_CLASSID, 2, PETSCVIEWERVTK);
101   switch (viewer->format) {
102   case PETSC_VIEWER_DEFAULT:
103   case PETSC_VIEWER_VTK_VTU:
104     PetscCall(DMPlexVTKWriteAll_VTU(dm, viewer));
105     break;
106   default:
107     SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "No support for format '%s'", PetscViewerFormats[viewer->format]);
108   }
109   PetscFunctionReturn(PETSC_SUCCESS);
110 }
111