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 */