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: