Actual source code: vsilo.c
1: #define PETSC_DLL
2: /*
3: Written by Matt Dorbin, mrdorbin@cs.purdue.edu 3/1/99
4: For database format and API from LLNL
5: Updated by Matt Knepley, knepley@cs.purdue.edu 11/16/99
6: */
7: #include vsilo.h
11: static PetscErrorCode PetscViewerDestroy_Silo(PetscViewer viewer)
12: {
13: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
14: int rank;
18: MPI_Comm_rank(viewer->comm, &rank);
19: if(!rank) {
20: DBClose(silo->file_pointer);
21: }
22: return(0);
23: }
27: PetscErrorCode PetscViewerFlush_Silo(PetscViewer viewer)
28: {
29: int rank;
33: MPI_Comm_rank(viewer->comm, &rank);
34: if (rank) return(0);
35: return(0);
36: }
38: /*-----------------------------------------Public Functions-----------------------------------------------------------*/
41: /*@C
42: PetscViewerSiloGetFilePointer - Extracts the file pointer from a Silo viewer.
44: Input Parameter:
45: . viewer - viewer context, obtained from PetscViewerSiloOpen()
47: Output Parameter:
48: . fd - file pointer
50: Level: advanced
52: .keywords: PetscViewer, file, get, pointer
53: .seealso: PetscViewerSiloOpen()
54: @*/
55: PetscErrorCode PetscViewerSiloGetFilePointer(PetscViewer viewer, DBfile **fd)
56: {
57: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
62: *fd = silo->file_pointer;
63: return(0);
64: }
68: /*@C
69: PetscViewerSiloOpen - This routine writes the mesh and the partition in the
70: SILO format used by MeshTv, which can be used to create plots and
71: MPEG movies.
73: Collectiveon MPI_Comm
75: Input Parameters:
76: + comm - The MPI communicator
77: - name - The name for the Silo files
79: Output Parameter:
80: . viewer - A viewer
82: Notes:
83: This viewer is intended to work with the SILO portable database format.
84: Details on SILO, MeshTv, and companion software can be obtained by sending
85: mail to meshtv@viper.llnl.gov
87: Options Database Keys:
89: Level: beginner
91: .keywords: PetscViewer, Silo, open
92: @*/
93: PetscErrorCode PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
94: {
95: PetscViewer v;
96: Viewer_Silo *silo;
97: char filename[PETSC_MAX_PATH_LEN], filetemp[PETSC_MAX_PATH_LEN];
101: PetscHeaderCreate(v, _p_PetscViewer, struct _PetscViewerOps, PETSC_VIEWER_COOKIE, -1, PETSC_VIEWER_SILO, comm, PetscViewerDestroy, 0);
102: PetscLogObjectCreate(v);
103: silo = PetscNew(Viewer_Silo); CHKPTRQ(silo);
104: v->data = silo;
105: v->ops->destroy = PetscViewerDestroy_Silo;
106: v->ops->flush = PetscViewerFlush_Silo;
107: PetscStrallocpy(PETSC_VIEWER_SILO, &v->type_name);
109: PetscStrncpy(filetemp, name, 251);
110: PetscStrcat(filetemp, ".pdb");
111: PetscFixFilename(filetemp, filename);
113: silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
114: if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
115: #if defined(PETSC_USE_LOG)
116: PLogObjectState((PetscObject) v, "Silo File: %s", name);
117: #endif
118: silo->meshName = PETSC_NULL;
119: silo->objName = PETSC_NULL;
121: *viewer = v;
122: return(0);
123: }
127: /*@C
128: PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
129: mesh has already been put in the .silo file. It also checks for type,
130: and at the moment accepts only UCD_MESH meshes.
132: Not collective
134: Input Parameters:
135: + mesh - The mesh that should be in place
136: . viewer - The viewer that should contain the mesh
137: - fp - The pointer to the DBFile that should contain the mesh
139: Level: intermediate
141: .keywords: viewer, Silo, mesh
142: .seealso: PetscViewerSiloOpen()
143: @*/
144: PetscErrorCode PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
145: {
146: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
147: DBfile *fp;
148: int mesh_type;
152: PetscViewerSiloGetFilePointer(viewer, &fp);
153: if (!vsilo->meshName) {
154: mesh_type = DBInqMeshtype(fp, "PetscMesh");
155: } else {
156: mesh_type = DBInqMeshtype(fp, vsilo->meshName);
157: }
158: if(mesh_type != DB_UCDMESH) {
159: /* DBInqMeshType returns -1 if the mesh is not found*/
160: MeshView(mesh, viewer);
161: }
162: return(0);
163: }
167: /*@C
168: PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo
170: Input Parameter:
171: . viewer - The Silo viewer
173: Output Parameter:
174: . name - The name for new objects created in Silo
176: Level: intermediate
178: .keywords PetscViewer, Silo, name
179: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
180: @*/
181: PetscErrorCode PetscViewerSiloGetName(PetscViewer viewer, char **name)
182: {
183: PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;
188: *name = vsilo->objName;
189: return(0);
190: }
194: /*@C
195: PetscViewerSiloSetName - Override the default name for objects communicated to Silo
197: Input Parameters:
198: . viewer - The Silo viewer
199: . name - The name for new objects created in Silo
201: Level: intermediate
203: .keywords PetscViewer, Silo, name
204: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
205: @*/
206: PetscErrorCode PetscViewerSiloSetName(PetscViewer viewer, char *name)
207: {
208: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
213: vsilo->objName = name;
214: return(0);
215: }
219: /*@C
220: PetscViewerSiloClearName - Use the default name for objects communicated to Silo
222: Input Parameter:
223: . viewer - The Silo viewer
225: Level: intermediate
227: .keywords PetscViewer, Silo, name
228: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
229: @*/
230: PetscErrorCode PetscViewerSiloClearName(PetscViewer viewer)
231: {
232: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
236: vsilo->objName = PETSC_NULL;
237: return(0);
238: }
242: /*@C
243: PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo
245: Input Parameter:
246: . viewer - The Silo viewer
248: Output Parameter:
249: . name - The name for new objects created in Silo
251: Level: intermediate
253: .keywords PetscViewer, Silo, name, mesh
254: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
255: @*/
256: PetscErrorCode PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
257: {
258: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
263: *name = vsilo->meshName;
264: return(0);
265: }
269: /*@C
270: PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo
272: Input Parameters:
273: + viewer - The Silo viewer
274: - name - The name for new objects created in Silo
276: Level: intermediate
278: .keywords PetscViewer, Silo, name, mesh
279: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
280: @*/
281: PetscErrorCode PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
282: {
283: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
288: vsilo->meshName = name;
289: return(0);
290: }
294: /*@C
295: PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo
297: Input Parameter:
298: . viewer - The Silo viewer
300: Level: intermediate
302: .keywords PetscViewer, Silo, name, mesh
303: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
304: @*/
305: PetscErrorCode PetscViewerSiloClearMeshName(PetscViewer viewer)
306: {
307: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
311: vsilo->meshName = PETSC_NULL;
312: return(0);
313: }
315: