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