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
17: static int PetscViewerDestroy_Silo(PetscViewer viewer)
18: {
19: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
20: int rank;
21: int ierr;
24: MPI_Comm_rank(viewer->comm, &rank);
25: if(!rank) {
26: DBClose(silo->file_pointer);
27: }
28: return(0);
29: }
33: int PetscViewerFlush_Silo(PetscViewer viewer)
34: {
35: int rank;
37: MPI_Comm_rank(viewer->comm, &rank);
38: if (rank) return(0);
39: return(0);
40: }
42: /*-----------------------------------------Public Functions-----------------------------------------------------------*/
45: /*@C
46: PetscViewerSiloGetFilePointer - Extracts the file pointer from a Silo viewer.
48: Input Parameter:
49: . viewer - viewer context, obtained from PetscViewerSiloOpen()
51: Output Parameter:
52: . fd - file pointer
54: Level: advanced
56: .keywords: PetscViewer, file, get, pointer
57: .seealso: PetscViewerSiloOpen()
58: @*/
59: int PetscViewerSiloGetFilePointer(PetscViewer viewer, DBfile **fd)
60: {
61: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
66: *fd = silo->file_pointer;
67: return(0);
68: }
72: /*@C
73: PetscViewerSiloOpen - This routine writes the mesh and the partition in the
74: SILO format used by MeshTv, which can be used to create plots and
75: MPEG movies.
77: Collectiveon MPI_Comm
79: Input Parameters:
80: + comm - The MPI communicator
81: - name - The name for the Silo files
83: Output Parameter:
84: . viewer - A viewer
86: Notes:
87: This viewer is intended to work with the SILO portable database format.
88: Details on SILO, MeshTv, and companion software can be obtained by sending
89: mail to meshtv@viper.llnl.gov
91: Options Database Keys:
93: Level: beginner
95: .keywords: PetscViewer, Silo, open
96: @*/
97: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
98: {
99: PetscViewer v;
100: Viewer_Silo *silo;
101: char filename[PETSC_MAX_PATH_LEN];
102: char filetemp[PETSC_MAX_PATH_LEN];
103: int ierr;
106: PetscHeaderCreate(v, _p_PetscViewer, struct _PetscViewerOps, PETSC_VIEWER_COOKIE, -1, PETSC_VIEWER_SILO, comm, PetscViewerDestroy, 0);
107: PLogObjectCreate(v);
108: silo = PetscNew(Viewer_Silo); CHKPTRQ(silo);
109: v->data = silo;
110: v->ops->destroy = PetscViewerDestroy_Silo;
111: v->ops->flush = PetscViewerFlush_Silo;
112: PetscStrallocpy(PETSC_VIEWER_SILO, &v->type_name);
114: PetscStrncpy(filetemp, name, 251);
115: PetscStrcat(filetemp, ".pdb");
116: PetscFixFilename(filetemp, filename);
118: silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
119: if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
120: #if defined(PETSC_USE_LOG)
121: PLogObjectState((PetscObject) v, "Silo File: %s", name);
122: #endif
123: silo->meshName = PETSC_NULL;
124: silo->objName = PETSC_NULL;
126: *viewer = v;
127: return(0);
128: }
132: /*@C
133: PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
134: mesh has already been put in the .silo file. It also checks for type,
135: and at the moment accepts only UCD_MESH meshes.
137: Not collective
139: Input Parameters:
140: + mesh - The mesh that should be in place
141: . viewer - The viewer that should contain the mesh
142: - fp - The pointer to the DBFile that should contain the mesh
144: Level: intermediate
146: .keywords: viewer, Silo, mesh
147: .seealso: PetscViewerSiloOpen()
148: @*/
149: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
150: {
151: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
152: DBfile *fp;
153: int mesh_type;
154: int ierr;
157: PetscViewerSiloGetFilePointer(viewer, &fp);
158: if (vsilo->meshName == PETSC_NULL) {
159: mesh_type = DBInqMeshtype(fp, "PetscMesh");
160: } else {
161: mesh_type = DBInqMeshtype(fp, vsilo->meshName);
162: }
163: if(mesh_type != DB_UCDMESH) {
164: /* DBInqMeshType returns -1 if the mesh is not found*/
165: MeshView(mesh, viewer);
166: }
167: return(0);
168: }
172: /*@C
173: PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo
175: Input Parameter:
176: . viewer - The Silo viewer
178: Output Parameter:
179: . name - The name for new objects created in Silo
181: Level: intermediate
183: .keywords PetscViewer, Silo, name
184: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
185: @*/
186: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
187: {
188: PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;
193: *name = vsilo->objName;
194: return(0);
195: }
199: /*@C
200: PetscViewerSiloSetName - Override the default name for objects communicated to Silo
202: Input Parameters:
203: . viewer - The Silo viewer
204: . name - The name for new objects created in Silo
206: Level: intermediate
208: .keywords PetscViewer, Silo, name
209: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
210: @*/
211: int PetscViewerSiloSetName(PetscViewer viewer, char *name)
212: {
213: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
218: vsilo->objName = name;
219: return(0);
220: }
224: /*@C
225: PetscViewerSiloClearName - Use the default name for objects communicated to Silo
227: Input Parameter:
228: . viewer - The Silo viewer
230: Level: intermediate
232: .keywords PetscViewer, Silo, name
233: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
234: @*/
235: int PetscViewerSiloClearName(PetscViewer viewer)
236: {
237: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
241: vsilo->objName = PETSC_NULL;
242: return(0);
243: }
247: /*@C
248: PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo
250: Input Parameter:
251: . viewer - The Silo viewer
253: Output Parameter:
254: . name - The name for new objects created in Silo
256: Level: intermediate
258: .keywords PetscViewer, Silo, name, mesh
259: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
260: @*/
261: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
262: {
263: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
268: *name = vsilo->meshName;
269: return(0);
270: }
274: /*@C
275: PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo
277: Input Parameters:
278: + viewer - The Silo viewer
279: - name - The name for new objects created in Silo
281: Level: intermediate
283: .keywords PetscViewer, Silo, name, mesh
284: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
285: @*/
286: int PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
287: {
288: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
293: vsilo->meshName = name;
294: return(0);
295: }
299: /*@C
300: PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo
302: Input Parameter:
303: . viewer - The Silo viewer
305: Level: intermediate
307: .keywords PetscViewer, Silo, name, mesh
308: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
309: @*/
310: int PetscViewerSiloClearMeshName(PetscViewer viewer)
311: {
312: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
316: vsilo->meshName = PETSC_NULL;
317: return(0);
318: }
320: #else
322: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
323: {
324: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
325: }
327: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
328: {
329: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
330: }
332: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
333: {
334: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
335: }
337: int PetscViewerSiloSetName(PetscViewer viewer, const char name[])
338: {
339: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
340: }
342: int PetscViewerSiloClearName(PetscViewer viewer)
343: {
344: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
345: }
347: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
348: {
349: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
350: }
352: int PetscViewerSiloSetMeshName(PetscViewer viewer, const char name[])
353: {
354: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
355: }
357: int PetscViewerSiloClearMeshName(PetscViewer viewer)
358: {
359: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
360: }
362: #endif /* PETSC_HAVE_SILO */