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(((PetscObject)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(((PetscObject)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: PetscNewLog(v,Viewer_Silo,&silo); CHKPTRQ(silo);
103: v->data = (void*)silo;
104: v->ops->destroy = PetscViewerDestroy_Silo;
105: v->ops->flush = PetscViewerFlush_Silo;
106: PetscStrallocpy(PETSC_VIEWER_SILO, &((PetscObject)v)->type_name);
108: PetscStrncpy(filetemp, name, 251);
109: PetscStrcat(filetemp, ".pdb");
110: PetscFixFilename(filetemp, filename);
112: silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
113: if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
114: #if defined(PETSC_USE_LOG)
115: PLogObjectState((PetscObject) v, "Silo File: %s", name);
116: #endif
117: silo->meshName = PETSC_NULL;
118: silo->objName = PETSC_NULL;
120: *viewer = v;
121: return(0);
122: }
126: /*@C
127: PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
128: mesh has already been put in the .silo file. It also checks for type,
129: and at the moment accepts only UCD_MESH meshes.
131: Not collective
133: Input Parameters:
134: + mesh - The mesh that should be in place
135: . viewer - The viewer that should contain the mesh
136: - fp - The pointer to the DBFile that should contain the mesh
138: Level: intermediate
140: .keywords: viewer, Silo, mesh
141: .seealso: PetscViewerSiloOpen()
142: @*/
143: PetscErrorCode PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
144: {
145: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
146: DBfile *fp;
147: int mesh_type;
151: PetscViewerSiloGetFilePointer(viewer, &fp);
152: if (!vsilo->meshName) {
153: mesh_type = DBInqMeshtype(fp, "PetscMesh");
154: } else {
155: mesh_type = DBInqMeshtype(fp, vsilo->meshName);
156: }
157: if(mesh_type != DB_UCDMESH) {
158: /* DBInqMeshType returns -1 if the mesh is not found*/
159: MeshView(mesh, viewer);
160: }
161: return(0);
162: }
166: /*@C
167: PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo
169: Input Parameter:
170: . viewer - The Silo viewer
172: Output Parameter:
173: . name - The name for new objects created in Silo
175: Level: intermediate
177: .keywords PetscViewer, Silo, name
178: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
179: @*/
180: PetscErrorCode PetscViewerSiloGetName(PetscViewer viewer, char **name)
181: {
182: PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;
187: *name = vsilo->objName;
188: return(0);
189: }
193: /*@C
194: PetscViewerSiloSetName - Override the default name for objects communicated to Silo
196: Input Parameters:
197: . viewer - The Silo viewer
198: . name - The name for new objects created in Silo
200: Level: intermediate
202: .keywords PetscViewer, Silo, name
203: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
204: @*/
205: PetscErrorCode PetscViewerSiloSetName(PetscViewer viewer, char *name)
206: {
207: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
212: vsilo->objName = name;
213: return(0);
214: }
218: /*@C
219: PetscViewerSiloClearName - Use the default name for objects communicated to Silo
221: Input Parameter:
222: . viewer - The Silo viewer
224: Level: intermediate
226: .keywords PetscViewer, Silo, name
227: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
228: @*/
229: PetscErrorCode PetscViewerSiloClearName(PetscViewer viewer)
230: {
231: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
235: vsilo->objName = PETSC_NULL;
236: return(0);
237: }
241: /*@C
242: PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo
244: Input Parameter:
245: . viewer - The Silo viewer
247: Output Parameter:
248: . name - The name for new objects created in Silo
250: Level: intermediate
252: .keywords PetscViewer, Silo, name, mesh
253: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
254: @*/
255: PetscErrorCode PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
256: {
257: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
262: *name = vsilo->meshName;
263: return(0);
264: }
268: /*@C
269: PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo
271: Input Parameters:
272: + viewer - The Silo viewer
273: - name - The name for new objects created in Silo
275: Level: intermediate
277: .keywords PetscViewer, Silo, name, mesh
278: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
279: @*/
280: PetscErrorCode PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
281: {
282: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
287: vsilo->meshName = name;
288: return(0);
289: }
293: /*@C
294: PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo
296: Input Parameter:
297: . viewer - The Silo viewer
299: Level: intermediate
301: .keywords PetscViewer, Silo, name, mesh
302: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
303: @*/
304: PetscErrorCode PetscViewerSiloClearMeshName(PetscViewer viewer)
305: {
306: Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
310: vsilo->meshName = PETSC_NULL;
311: return(0);
312: }
314: