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