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
12: #ifdef PETSC_HAVE_SILO
16: static int PetscViewerDestroy_Silo(PetscViewer viewer)
17: {
18: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
19: int rank;
20: int ierr;
23: MPI_Comm_rank(viewer->comm, &rank);
24: if(!rank) {
25: DBClose(silo->file_pointer);
26: }
27: return(0);
28: }
32: int PetscViewerFlush_Silo(PetscViewer viewer)
33: {
34: int rank;
36: MPI_Comm_rank(viewer->comm, &rank);
37: if (rank) return(0);
38: return(0);
39: }
41: /*-----------------------------------------Public Functions-----------------------------------------------------------*/
44: /*@C
45: PetscViewerSiloGetFilePointer - Extracts the file pointer from a Silo viewer.
47: Input Parameter:
48: . viewer - viewer context, obtained from PetscViewerSiloOpen()
50: Output Parameter:
51: . fd - file pointer
53: Level: advanced
55: .keywords: PetscViewer, file, get, pointer
56: .seealso: PetscViewerSiloOpen()
57: @*/
58: int PetscViewerSiloGetFilePointer(PetscViewer viewer, DBfile **fd)
59: {
60: Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
65: *fd = silo->file_pointer;
66: return(0);
67: }
71: /*@C
72: PetscViewerSiloOpen - This routine writes the mesh and the partition in the
73: SILO format used by MeshTv, which can be used to create plots and
74: MPEG movies.
76: Collectiveon MPI_Comm
78: Input Parameters:
79: + comm - The MPI communicator
80: - name - The name for the Silo files
82: Output Parameter:
83: . viewer - A viewer
85: Notes:
86: This viewer is intended to work with the SILO portable database format.
87: Details on SILO, MeshTv, and companion software can be obtained by sending
88: mail to meshtv@viper.llnl.gov
90: Options Database Keys:
92: Level: beginner
94: .keywords: PetscViewer, Silo, open
95: @*/
96: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
97: {
98: PetscViewer v;
99: Viewer_Silo *silo;
100: char filename[PETSC_MAX_PATH_LEN];
101: char filetemp[PETSC_MAX_PATH_LEN];
102: int ierr;
105: PetscHeaderCreate(v, _p_PetscViewer, struct _PetscViewerOps, PETSC_VIEWER_COOKIE, -1, PETSC_VIEWER_SILO, comm, PetscViewerDestroy, 0);
106: PLogObjectCreate(v);
107: silo = PetscNew(Viewer_Silo); CHKPTRQ(silo);
108: v->data = silo;
109: v->ops->destroy = PetscViewerDestroy_Silo;
110: v->ops->flush = PetscViewerFlush_Silo;
111: PetscStrallocpy(PETSC_VIEWER_SILO, &v->type_name);
113: PetscStrncpy(filetemp, name, 251);
114: PetscStrcat(filetemp, ".pdb");
115: PetscFixFilename(filetemp, filename);
117: silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
118: if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
119: #if defined(PETSC_USE_LOG)
120: PLogObjectState((PetscObject) v, "Silo File: %s", name);
121: #endif
122: silo->meshName = PETSC_NULL;
123: silo->objName = PETSC_NULL;
125: *viewer = v;
126: return(0);
127: }
131: /*@C
132: PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
133: mesh has already been put in the .silo file. It also checks for type,
134: and at the moment accepts only UCD_MESH meshes.
136: Not collective
138: Input Parameters:
139: + mesh - The mesh that should be in place
140: . viewer - The viewer that should contain the mesh
141: - fp - The pointer to the DBFile that should contain the mesh
143: Level: intermediate
145: .keywords: viewer, Silo, mesh
146: .seealso: PetscViewerSiloOpen()
147: @*/
148: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
149: {
150: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
151: DBfile *fp;
152: int mesh_type;
153: int ierr;
156: PetscViewerSiloGetFilePointer(viewer, &fp);
157: if (vsilo->meshName == PETSC_NULL) {
158: mesh_type = DBInqMeshtype(fp, "PetscMesh");
159: } else {
160: mesh_type = DBInqMeshtype(fp, vsilo->meshName);
161: }
162: if(mesh_type != DB_UCDMESH) {
163: /* DBInqMeshType returns -1 if the mesh is not found*/
164: MeshView(mesh, viewer);
165: }
166: return(0);
167: }
171: /*@C
172: PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo
174: Input Parameter:
175: . viewer - The Silo viewer
177: Output Parameter:
178: . name - The name for new objects created in Silo
180: Level: intermediate
182: .keywords PetscViewer, Silo, name
183: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
184: @*/
185: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
186: {
187: PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;
192: *name = vsilo->objName;
193: return(0);
194: }
198: /*@C
199: PetscViewerSiloSetName - Override the default name for objects communicated to Silo
201: Input Parameters:
202: . viewer - The Silo viewer
203: . name - The name for new objects created in Silo
205: Level: intermediate
207: .keywords PetscViewer, Silo, name
208: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
209: @*/
210: int PetscViewerSiloSetName(PetscViewer viewer, char *name)
211: {
212: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
217: vsilo->objName = name;
218: return(0);
219: }
223: /*@C
224: PetscViewerSiloClearName - Use the default name for objects communicated to Silo
226: Input Parameter:
227: . viewer - The Silo viewer
229: Level: intermediate
231: .keywords PetscViewer, Silo, name
232: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
233: @*/
234: int PetscViewerSiloClearName(PetscViewer viewer)
235: {
236: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
240: vsilo->objName = PETSC_NULL;
241: return(0);
242: }
246: /*@C
247: PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo
249: Input Parameter:
250: . viewer - The Silo viewer
252: Output Parameter:
253: . name - The name for new objects created in Silo
255: Level: intermediate
257: .keywords PetscViewer, Silo, name, mesh
258: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
259: @*/
260: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
261: {
262: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
267: *name = vsilo->meshName;
268: return(0);
269: }
273: /*@C
274: PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo
276: Input Parameters:
277: + viewer - The Silo viewer
278: - name - The name for new objects created in Silo
280: Level: intermediate
282: .keywords PetscViewer, Silo, name, mesh
283: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
284: @*/
285: int PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
286: {
287: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
292: vsilo->meshName = name;
293: return(0);
294: }
298: /*@C
299: PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo
301: Input Parameter:
302: . viewer - The Silo viewer
304: Level: intermediate
306: .keywords PetscViewer, Silo, name, mesh
307: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
308: @*/
309: int PetscViewerSiloClearMeshName(PetscViewer viewer)
310: {
311: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
315: vsilo->meshName = PETSC_NULL;
316: return(0);
317: }
319: #else
321: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
322: {
323: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
324: }
326: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
327: {
328: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
329: }
331: int PetscViewerSiloSetName(PetscViewer viewer, const char name[])
332: {
333: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
334: }
336: int PetscViewerSiloClearName(PetscViewer viewer)
337: {
338: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
339: }
341: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
342: {
343: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
344: }
346: int PetscViewerSiloSetMeshName(PetscViewer viewer, const char name[])
347: {
348: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
349: }
351: int PetscViewerSiloClearMeshName(PetscViewer viewer)
352: {
353: SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
354: }
356: #endif /* PETSC_HAVE_SILO */