Actual source code: vsilo.c
1: /*
2: Written by Matt Dorbin, mrdorbin@cs.purdue.edu 3/1/99
3: For database format and API from LLNL
4: Updated by Matt Knepley, knepley@cs.purdue.edu 11/16/99
5: */
6: #include vsilo.h
8: #ifdef PETSC_HAVE_SILO
12: static PetscErrorCode PetscViewerDestroy_Silo(PetscViewer viewer)
13: {
14: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
15: int rank;
19: MPI_Comm_rank(viewer->comm, &rank);
20: if(!rank) {
21: DBClose(silo->file_pointer);
22: }
23: return(0);
24: }
28: PetscErrorCode PetscViewerFlush_Silo(PetscViewer viewer)
29: {
30: int rank;
34: MPI_Comm_rank(viewer->comm, &rank);
35: if (rank) return(0);
36: return(0);
37: }
39: /*-----------------------------------------Public Functions-----------------------------------------------------------*/
42: /*@C
43: PetscViewerSiloGetFilePointer - Extracts the file pointer from a Silo viewer.
45: Input Parameter:
46: . viewer - viewer context, obtained from PetscViewerSiloOpen()
48: Output Parameter:
49: . fd - file pointer
51: Level: advanced
53: .keywords: PetscViewer, file, get, pointer
54: .seealso: PetscViewerSiloOpen()
55: @*/
56: PetscErrorCode PetscViewerSiloGetFilePointer(PetscViewer viewer, DBfile **fd)
57: {
58: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
63: *fd = silo->file_pointer;
64: return(0);
65: }
69: /*@C
70: PetscViewerSiloOpen - This routine writes the mesh and the partition in the
71: SILO format used by MeshTv, which can be used to create plots and
72: MPEG movies.
74: Collectiveon MPI_Comm
76: Input Parameters:
77: + comm - The MPI communicator
78: - name - The name for the Silo files
80: Output Parameter:
81: . viewer - A viewer
83: Notes:
84: This viewer is intended to work with the SILO portable database format.
85: Details on SILO, MeshTv, and companion software can be obtained by sending
86: mail to meshtv@viper.llnl.gov
88: Options Database Keys:
90: Level: beginner
92: .keywords: PetscViewer, Silo, open
93: @*/
94: PetscErrorCode PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
95: {
96: PetscViewer v;
97: Viewer_Silo *silo;
98: char filename[PETSC_MAX_PATH_LEN];
99: char filetemp[PETSC_MAX_PATH_LEN];
103: PetscHeaderCreate(v, _p_PetscViewer, struct _PetscViewerOps, PETSC_VIEWER_COOKIE, -1, PETSC_VIEWER_SILO, comm, PetscViewerDestroy, 0);
104: PLogObjectCreate(v);
105: silo = PetscNew(Viewer_Silo); CHKPTRQ(silo);
106: v->data = silo;
107: v->ops->destroy = PetscViewerDestroy_Silo;
108: v->ops->flush = PetscViewerFlush_Silo;
109: PetscStrallocpy(PETSC_VIEWER_SILO, &v->type_name);
111: PetscStrncpy(filetemp, name, 251);
112: PetscStrcat(filetemp, ".pdb");
113: PetscFixFilename(filetemp, filename);
115: silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
116: if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
117: #if defined(PETSC_USE_LOG)
118: PLogObjectState((PetscObject) v, "Silo File: %s", name);
119: #endif
120: silo->meshName = PETSC_NULL;
121: silo->objName = PETSC_NULL;
123: *viewer = v;
124: return(0);
125: }
129: /*@C
130: PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
131: mesh has already been put in the .silo file. It also checks for type,
132: and at the moment accepts only UCD_MESH meshes.
134: Not collective
136: Input Parameters:
137: + mesh - The mesh that should be in place
138: . viewer - The viewer that should contain the mesh
139: - fp - The pointer to the DBFile that should contain the mesh
141: Level: intermediate
143: .keywords: viewer, Silo, mesh
144: .seealso: PetscViewerSiloOpen()
145: @*/
146: PetscErrorCode PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
147: {
148: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
149: DBfile *fp;
150: int mesh_type;
154: PetscViewerSiloGetFilePointer(viewer, &fp);
155: if (!vsilo->meshName) {
156: mesh_type = DBInqMeshtype(fp, "PetscMesh");
157: } else {
158: mesh_type = DBInqMeshtype(fp, vsilo->meshName);
159: }
160: if(mesh_type != DB_UCDMESH) {
161: /* DBInqMeshType returns -1 if the mesh is not found*/
162: MeshView(mesh, viewer);
163: }
164: return(0);
165: }
169: /*@C
170: PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo
172: Input Parameter:
173: . viewer - The Silo viewer
175: Output Parameter:
176: . name - The name for new objects created in Silo
178: Level: intermediate
180: .keywords PetscViewer, Silo, name
181: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
182: @*/
183: PetscErrorCode PetscViewerSiloGetName(PetscViewer viewer, char **name)
184: {
185: PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;
190: *name = vsilo->objName;
191: return(0);
192: }
196: /*@C
197: PetscViewerSiloSetName - Override the default name for objects communicated to Silo
199: Input Parameters:
200: . viewer - The Silo viewer
201: . name - The name for new objects created in Silo
203: Level: intermediate
205: .keywords PetscViewer, Silo, name
206: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
207: @*/
208: PetscErrorCode PetscViewerSiloSetName(PetscViewer viewer, char *name)
209: {
210: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
215: vsilo->objName = name;
216: return(0);
217: }
221: /*@C
222: PetscViewerSiloClearName - Use the default name for objects communicated to Silo
224: Input Parameter:
225: . viewer - The Silo viewer
227: Level: intermediate
229: .keywords PetscViewer, Silo, name
230: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
231: @*/
232: PetscErrorCode PetscViewerSiloClearName(PetscViewer viewer)
233: {
234: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
238: vsilo->objName = PETSC_NULL;
239: return(0);
240: }
244: /*@C
245: PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo
247: Input Parameter:
248: . viewer - The Silo viewer
250: Output Parameter:
251: . name - The name for new objects created in Silo
253: Level: intermediate
255: .keywords PetscViewer, Silo, name, mesh
256: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
257: @*/
258: PetscErrorCode PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
259: {
260: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
265: *name = vsilo->meshName;
266: return(0);
267: }
271: /*@C
272: PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo
274: Input Parameters:
275: + viewer - The Silo viewer
276: - name - The name for new objects created in Silo
278: Level: intermediate
280: .keywords PetscViewer, Silo, name, mesh
281: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
282: @*/
283: PetscErrorCode PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
284: {
285: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
290: vsilo->meshName = name;
291: return(0);
292: }
296: /*@C
297: PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo
299: Input Parameter:
300: . viewer - The Silo viewer
302: Level: intermediate
304: .keywords PetscViewer, Silo, name, mesh
305: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
306: @*/
307: PetscErrorCode PetscViewerSiloClearMeshName(PetscViewer viewer)
308: {
309: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
313: vsilo->meshName = PETSC_NULL;
314: return(0);
315: }
317: #else
319: PetscErrorCode PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
320: {
321: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
322: }
324: PetscErrorCode PetscViewerSiloGetName(PetscViewer viewer, char **name)
325: {
326: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
327: }
329: PetscErrorCode PetscViewerSiloSetName(PetscViewer viewer, const char name[])
330: {
331: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
332: }
334: PetscErrorCode PetscViewerSiloClearName(PetscViewer viewer)
335: {
336: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
337: }
339: PetscErrorCode PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
340: {
341: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
342: }
344: PetscErrorCode PetscViewerSiloSetMeshName(PetscViewer viewer, const char name[])
345: {
346: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
347: }
349: PetscErrorCode PetscViewerSiloClearMeshName(PetscViewer viewer)
350: {
351: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
352: }
354: #endif /* PETSC_HAVE_SILO */
355: