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