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: