Actual source code: vsilo.c
1: #ifdef PETSC_RCS_HEADER
2: static char vcid[] = "$Id: vsilo.c,v 1.4 2000/01/10 03:27:03 knepley Exp $";
3: #endif
5: /*
6: Written by Matt Dorbin, mrdorbin@cs.purdue.edu 3/1/99
7: For database format and API from LLNL
8: Updated by Matt Knepley, knepley@cs.purdue.edu 11/16/99
9: */
10: #include vsilo.h
11: #include "gvec.h"
13: #ifdef PETSC_HAVE_SILO
15: static int PetscViewerDestroy_Silo(PetscViewer viewer)
16: {
17: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
18: int rank;
19: int ierr;
22: MPI_Comm_rank(viewer->comm, &rank);
23: if(!rank) {
24: DBClose(silo->file_pointer);
25: }
26: return(0);
27: }
29: int PetscViewerFlush_Silo(PetscViewer viewer)
30: {
31: int rank;
33: MPI_Comm_rank(viewer->comm, &rank);
34: if (rank) return(0);
35: return(0);
36: }
38: /*-----------------------------------------Public Functions-----------------------------------------------------------*/
39: /*@C
40: PetscViewerSiloGetFilePointer - Extracts the file pointer from a Silo viewer.
42: Input Parameter:
43: . viewer - viewer context, obtained from PetscViewerSiloOpen()
45: Output Parameter:
46: . fd - file pointer
48: Level: advanced
50: .keywords: PetscViewer, file, get, pointer
51: .seealso: PetscViewerSiloOpen()
52: @*/
53: int PetscViewerSiloGetFilePointer(PetscViewer viewer, DBfile **fd)
54: {
55: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
60: *fd = silo->file_pointer;
61: return(0);
62: }
64: /*@C
65: PetscViewerSiloOpen - This routine writes the mesh and the partition in the
66: SILO format used by MeshTv, which can be used to create plots and
67: MPEG movies.
69: Collectiveon MPI_Comm
71: Input Parameters:
72: + comm - The MPI communicator
73: - name - The name for the Silo files
75: Output Parameter:
76: . viewer - A viewer
78: Notes:
79: This viewer is intended to work with the SILO portable database format.
80: Details on SILO, MeshTv, and companion software can be obtained by sending
81: mail to meshtv@viper.llnl.gov
83: Options Database Keys:
85: Level: beginner
87: .keywords: PetscViewer, Silo, open
88: @*/
89: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
90: {
91: PetscViewer v;
92: Viewer_Silo *silo;
93: char filename[256];
94: char filetemp[256];
95: int ierr;
98: PetscHeaderCreate(v, _p_PetscViewer, struct _PetscViewerOps, PETSC_VIEWER_COOKIE, -1, PETSC_VIEWER_SILO, comm, PetscViewerDestroy, 0);
99: PLogObjectCreate(v);
100: silo = PetscNew(Viewer_Silo); CHKPTRQ(silo);
101: v->data = silo;
102: v->ops->destroy = PetscViewerDestroy_Silo;
103: v->ops->flush = PetscViewerFlush_Silo;
104: ierr = PetscStrallocpy(PETSC_VIEWER_SILO, &v->type_name);
106: PetscStrncpy(filetemp, name, 251);
107: PetscStrcat(filetemp, ".pdb");
108: PetscFixFilename(filetemp, filename);
110: silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
111: if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
112: #if defined(PETSC_USE_LOG)
113: PLogObjectState((PetscObject) v, "Silo File: %s", name);
114: #endif
115: silo->meshName = PETSC_NULL;
116: silo->objName = PETSC_NULL;
118: *viewer = v;
119: return(0);
120: }
122: /*@C
123: PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
124: mesh has already been put in the .silo file. It also checks for type,
125: and at the moment accepts only UCD_MESH meshes.
127: Not collective
129: Input Parameters:
130: + mesh - The mesh that should be in place
131: . viewer - The viewer that should contain the mesh
132: - fp - The pointer to the DBFile that should contain the mesh
134: Level: intermediate
136: .keywords: viewer, Silo, mesh
137: .seealso: PetscViewerSiloOpen()
138: @*/
139: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
140: {
141: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
142: DBfile *fp;
143: int mesh_type;
144: int ierr;
147: PetscViewerSiloGetFilePointer(viewer, &fp);
148: if (vsilo->meshName == PETSC_NULL) {
149: mesh_type = DBInqMeshtype(fp, "PetscMesh");
150: } else {
151: mesh_type = DBInqMeshtype(fp, vsilo->meshName);
152: }
153: if(mesh_type != DB_UCDMESH) {
154: /* DBInqMeshType returns -1 if the mesh is not found*/
155: MeshView(mesh, viewer);
156: }
157: return(0);
158: }
160: /*@C
161: PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo
163: Input Parameter:
164: . viewer - The Silo viewer
166: Output Parameter:
167: . name - The name for new objects created in Silo
169: Level: intermediate
171: .keywords PetscViewer, Silo, name
172: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
173: @*/
174: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
175: {
176: PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;
181: *name = vsilo->objName;
182: return(0);
183: }
185: /*@C
186: PetscViewerSiloSetName - Override the default name for objects communicated to Silo
188: Input Parameters:
189: . viewer - The Silo viewer
190: . name - The name for new objects created in Silo
192: Level: intermediate
194: .keywords PetscViewer, Silo, name
195: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
196: @*/
197: int PetscViewerSiloSetName(PetscViewer viewer, char *name)
198: {
199: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
204: vsilo->objName = name;
205: return(0);
206: }
208: /*@C
209: PetscViewerSiloClearName - Use the default name for objects communicated to Silo
211: Input Parameter:
212: . viewer - The Silo viewer
214: Level: intermediate
216: .keywords PetscViewer, Silo, name
217: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
218: @*/
219: int PetscViewerSiloClearName(PetscViewer viewer)
220: {
221: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
225: vsilo->objName = PETSC_NULL;
226: return(0);
227: }
229: /*@C
230: PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo
232: Input Parameter:
233: . viewer - The Silo viewer
235: Output Parameter:
236: . name - The name for new objects created in Silo
238: Level: intermediate
240: .keywords PetscViewer, Silo, name, mesh
241: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
242: @*/
243: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
244: {
245: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
250: *name = vsilo->meshName;
251: return(0);
252: }
254: /*@C
255: PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo
257: Input Parameters:
258: + viewer - The Silo viewer
259: - name - The name for new objects created in Silo
261: Level: intermediate
263: .keywords PetscViewer, Silo, name, mesh
264: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
265: @*/
266: int PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
267: {
268: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
273: vsilo->meshName = name;
274: return(0);
275: }
277: /*@C
278: PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo
280: Input Parameter:
281: . viewer - The Silo viewer
283: Level: intermediate
285: .keywords PetscViewer, Silo, name, mesh
286: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
287: @*/
288: int PetscViewerSiloClearMeshName(PetscViewer viewer)
289: {
290: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
294: vsilo->meshName = PETSC_NULL;
295: return(0);
296: }
298: #else
300: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
301: {
302: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
303: }
305: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
306: {
307: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
308: }
310: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
311: {
312: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
313: }
315: int PetscViewerSiloSetName(PetscViewer viewer, const char name[])
316: {
317: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
318: }
320: int PetscViewerSiloClearName(PetscViewer viewer)
321: {
322: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
323: }
325: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
326: {
327: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
328: }
330: int PetscViewerSiloSetMeshName(PetscViewer viewer, const char name[])
331: {
332: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
333: }
335: int PetscViewerSiloClearMeshName(PetscViewer viewer)
336: {
337: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
338: }
340: #endif /* PETSC_HAVE_SILO */