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

 17: static int PetscViewerDestroy_Silo(PetscViewer viewer)
 18: {
 19:   Viewer_Silo *silo = (Viewer_Silo *) viewer->data;
 20:   int          rank;
 21:   int          ierr;

 24:   MPI_Comm_rank(viewer->comm, &rank);
 25:   if(!rank) {
 26:     DBClose(silo->file_pointer);
 27:   }
 28:   return(0);
 29: }

 33: int PetscViewerFlush_Silo(PetscViewer viewer)
 34: {
 35:   int rank;
 37:   MPI_Comm_rank(viewer->comm, &rank);
 38:   if (rank) return(0);
 39:   return(0);
 40: }

 42: /*-----------------------------------------Public Functions-----------------------------------------------------------*/
 45: /*@C
 46:   PetscViewerSiloGetFilePointer - Extracts the file pointer from a Silo viewer.

 48:   Input Parameter:
 49: . viewer - viewer context, obtained from PetscViewerSiloOpen()

 51:   Output Parameter:
 52: . fd     - file pointer

 54:   Level: advanced

 56: .keywords: PetscViewer, file, get, pointer
 57: .seealso: PetscViewerSiloOpen()
 58: @*/
 59: int PetscViewerSiloGetFilePointer(PetscViewer viewer, DBfile **fd)
 60: {
 61:   Viewer_Silo *silo = (Viewer_Silo *) viewer->data;

 66:   *fd = silo->file_pointer;
 67:   return(0);
 68: }

 72: /*@C
 73:   PetscViewerSiloOpen - This routine writes the mesh and the partition in the 
 74:   SILO format used by MeshTv, which can be used to create plots and
 75:   MPEG movies.

 77:   Collectiveon MPI_Comm

 79:   Input Parameters:
 80: + comm - The MPI communicator
 81: - name - The name for the Silo files

 83:   Output Parameter:
 84: . viewer  - A viewer

 86:   Notes:
 87:   This viewer is intended to work with the SILO portable database format.
 88:   Details on SILO, MeshTv, and companion software can be obtained by sending
 89:   mail to meshtv@viper.llnl.gov

 91:   Options Database Keys:

 93:   Level: beginner

 95: .keywords: PetscViewer, Silo, open
 96: @*/
 97: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
 98: {
 99:   PetscViewer       v;
100:   Viewer_Silo *silo;
101:   char         filename[PETSC_MAX_PATH_LEN];
102:   char         filetemp[PETSC_MAX_PATH_LEN];
103:   int          ierr;

106:   PetscHeaderCreate(v, _p_PetscViewer, struct _PetscViewerOps, PETSC_VIEWER_COOKIE, -1, PETSC_VIEWER_SILO, comm, PetscViewerDestroy, 0);
107:   PLogObjectCreate(v);
108:   silo            = PetscNew(Viewer_Silo); CHKPTRQ(silo);
109:   v->data         = silo;
110:   v->ops->destroy = PetscViewerDestroy_Silo;
111:   v->ops->flush   = PetscViewerFlush_Silo;
112:   PetscStrallocpy(PETSC_VIEWER_SILO, &v->type_name);

114:   PetscStrncpy(filetemp, name, 251);
115:   PetscStrcat(filetemp, ".pdb");
116:   PetscFixFilename(filetemp, filename);

118:   silo->file_pointer = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
119:   if (!silo->file_pointer) SETERRQ(PETSC_ERR_FILE_OPEN,"Cannot open Silo viewer file");
120: #if defined(PETSC_USE_LOG)
121:   PLogObjectState((PetscObject) v, "Silo File: %s", name);
122: #endif
123:   silo->meshName = PETSC_NULL;
124:   silo->objName  = PETSC_NULL;

126:   *viewer = v;
127:   return(0);
128: }

132: /*@C
133:   PetscViewerSiloCheckMesh - This routine checks a Silo viewer to determine whether the
134:                         mesh has already been put in the .silo file. It also checks for type,
135:                         and at the moment accepts only UCD_MESH meshes.

137:   Not collective

139:   Input Parameters:
140: + mesh - The mesh that should be in place
141: . viewer - The viewer that should contain the mesh
142: - fp - The pointer to the DBFile that should contain the mesh 

144:   Level: intermediate

146: .keywords: viewer, Silo, mesh
147: .seealso: PetscViewerSiloOpen()
148: @*/
149: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
150: {
151:   Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;
152:   DBfile      *fp;
153:   int          mesh_type;
154:   int          ierr;

157:   PetscViewerSiloGetFilePointer(viewer, &fp);
158:   if (vsilo->meshName == PETSC_NULL) {
159:     mesh_type = DBInqMeshtype(fp, "PetscMesh");
160:   } else {
161:     mesh_type = DBInqMeshtype(fp, vsilo->meshName);
162:   }
163:   if(mesh_type != DB_UCDMESH) {
164:     /* DBInqMeshType returns -1 if the mesh is not found*/
165:     MeshView(mesh, viewer);
166:   }
167:   return(0);
168: }

172: /*@C
173:   PetscViewerSiloGetName - Retrieve the default name for objects communicated to Silo

175:   Input Parameter:
176: . viewer - The Silo viewer

178:   Output Parameter:
179: . name   - The name for new objects created in Silo

181:   Level: intermediate

183: .keywords PetscViewer, Silo, name
184: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
185: @*/
186: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
187: {
188:   PetscViewer_Silo *vsilo = (PetscViewer_Silo *) viewer->data;

193:   *name = vsilo->objName;
194:   return(0);
195: }

199: /*@C
200:   PetscViewerSiloSetName - Override the default name for objects communicated to Silo

202:   Input Parameters:
203: . viewer - The Silo viewer
204: . name   - The name for new objects created in Silo

206:   Level: intermediate

208: .keywords PetscViewer, Silo, name
209: .seealso PetscViewerSiloSetName(), PetscViewerSiloClearName()
210: @*/
211: int PetscViewerSiloSetName(PetscViewer viewer, char *name)
212: {
213:   Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;

218:   vsilo->objName = name;
219:   return(0);
220: }

224: /*@C
225:   PetscViewerSiloClearName - Use the default name for objects communicated to Silo

227:   Input Parameter:
228: . viewer - The Silo viewer

230:   Level: intermediate

232: .keywords PetscViewer, Silo, name
233: .seealso PetscViewerSiloGetName(), PetscViewerSiloSetName()
234: @*/
235: int PetscViewerSiloClearName(PetscViewer viewer)
236: {
237:   Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;

241:   vsilo->objName = PETSC_NULL;
242:   return(0);
243: }

247: /*@C
248:   PetscViewerSiloGetMeshName - Retrieve the default name for the mesh in Silo

250:   Input Parameter:
251: . viewer - The Silo viewer

253:   Output Parameter:
254: . name   - The name for new objects created in Silo

256:   Level: intermediate

258: .keywords PetscViewer, Silo, name, mesh
259: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
260: @*/
261: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
262: {
263:   Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;

268:   *name = vsilo->meshName;
269:   return(0);
270: }

274: /*@C
275:   PetscViewerSiloSetMeshName - Override the default name for the mesh in Silo

277:   Input Parameters:
278: + viewer - The Silo viewer
279: - name   - The name for new objects created in Silo

281:   Level: intermediate

283: .keywords PetscViewer, Silo, name, mesh
284: .seealso PetscViewerSiloSetMeshName(), PetscViewerSiloClearMeshName()
285: @*/
286: int PetscViewerSiloSetMeshName(PetscViewer viewer, char *name)
287: {
288:   Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;

293:   vsilo->meshName = name;
294:   return(0);
295: }

299: /*@C
300:   PetscViewerSiloClearMeshName - Use the default name for the mesh in Silo

302:   Input Parameter:
303: . viewer - The Silo viewer

305:   Level: intermediate

307: .keywords PetscViewer, Silo, name, mesh
308: .seealso PetscViewerSiloGetMeshName(), PetscViewerSiloSetMeshName()
309: @*/
310: int PetscViewerSiloClearMeshName(PetscViewer viewer)
311: {
312:   Viewer_Silo *vsilo = (Viewer_Silo *) viewer->data;

316:   vsilo->meshName = PETSC_NULL;
317:   return(0);
318: }

320: #else

322: int PetscViewerSiloOpen(MPI_Comm comm, const char name[], PetscViewer *viewer)
323: {
324:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
325: }

327: int PetscViewerSiloCheckMesh(PetscViewer viewer, Mesh mesh)
328: {
329:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
330: }

332: int PetscViewerSiloGetName(PetscViewer viewer, char **name)
333: {
334:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
335: }

337: int PetscViewerSiloSetName(PetscViewer viewer, const char name[])
338: {
339:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
340: }

342: int PetscViewerSiloClearName(PetscViewer viewer)
343: {
344:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
345: }

347: int PetscViewerSiloGetMeshName(PetscViewer viewer, char **name)
348: {
349:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
350: }

352: int PetscViewerSiloSetMeshName(PetscViewer viewer, const char name[])
353: {
354:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
355: }

357: int PetscViewerSiloClearMeshName(PetscViewer viewer)
358: {
359:   SETERRQ(PETSC_ERR_SUP, "You must install the SILO package from LLNL");
360: }

362: #endif /* PETSC_HAVE_SILO */