Actual source code: petscvu.c

  1: /* $Id: petscvu.c,v 1.0 2001/04/10 19:34:05 knepley Exp $ */

 3:  #include src/sys/src/viewer/viewerimpl.h
  4: #include <stdarg.h>
  5: #include "petscfix.h"

  7: #define QUEUESTRINGSIZE 1024

  9: typedef struct _PrintfQueue *PrintfQueue;
 10: struct _PrintfQueue {
 11:   char        string[QUEUESTRINGSIZE];
 12:   PrintfQueue next;
 13: };

 15: typedef struct {
 16:   FILE         *fd;
 17:   PetscFileMode mode;     /* The mode in which to open the file */
 18:   char         *filename;
 19:   PetscTruth    vecSeen;  /* The flag indicating whether any vector has been viewed so far */
 20:   PrintfQueue   queue, queueBase;
 21:   int           queueLength;
 22: } PetscViewer_VU;

 24: #undef __FUNCT__  
 26: int PetscViewerDestroy_VU(PetscViewer viewer)
 27: {
 28:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;
 29:   int             ierr;

 32:   if (vu->vecSeen == PETSC_TRUE) {
 33:     PetscViewerVUPrintDeferred(viewer, "};nn");
 34:   }
 35:   PetscViewerVUFlushDeferred(viewer);
 36:   PetscFClose(viewer->comm, vu->fd);
 37:   PetscStrfree(vu->filename);
 38:   PetscFree(vu);
 39:   return(0);
 40: }

 42: #undef __FUNCT__  
 44: int PetscViewerFlush_VU(PetscViewer viewer)
 45: {
 46:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;
 47:   int             rank;
 48:   int             ierr;

 51:   MPI_Comm_rank(viewer->comm, &rank);
 52:   if (rank == 0) fflush(vu->fd);
 53:   return(0);
 54: }

 56: EXTERN_C_BEGIN
 57: #undef __FUNCT__  
 59: int PetscViewerGetFilename_VU(PetscViewer viewer, char **name)
 60: {
 61:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;

 64:   *name = vu->filename;
 65:   return(0);
 66: }
 67: EXTERN_C_END

 69: EXTERN_C_BEGIN
 70: #undef __FUNCT__  
 72: int PetscViewerSetFilename_VU(PetscViewer viewer, const char name[])
 73: {
 74:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;
 75:   char            fname[PETSC_MAX_PATH_LEN];
 76:   int             rank;
 77:   int             ierr;

 80:   if (name == PETSC_NULL) return(0);
 81:   MPI_Comm_rank(viewer->comm, &rank);
 82:   if (rank != 0) return(0);
 83:   PetscStrallocpy(name, &vu->filename);
 84:   PetscFixFilename(name, fname);
 85:   switch(vu->mode) {
 86:   case FILE_MODE_READ:
 87:     vu->fd = fopen(fname, "r");
 88:     break;
 89:   case FILE_MODE_WRITE:
 90:     vu->fd = fopen(fname, "w");
 91:     break;
 92:   case FILE_MODE_APPEND:
 93:     vu->fd = fopen(fname, "a");
 94:     break;
 95:   case FILE_MODE_UPDATE:
 96:     vu->fd = fopen(fname, "r+");
 97:     if (vu->fd == PETSC_NULL) {
 98:       vu->fd = fopen(fname, "w+");
 99:     }
100:     break;
101:   case FILE_MODE_APPEND_UPDATE:
102:     /* I really want a file which is opened at the end for updating,
103:        not a+, which opens at the beginning, but makes writes at the end.
104:     */
105:     vu->fd = fopen(fname, "r+");
106:     if (vu->fd == PETSC_NULL) {
107:       vu->fd = fopen(fname, "w+");
108:     } else {
109:       fseek(vu->fd, 0, SEEK_END);
110:     }
111:     break;
112:   default:
113:     SETERRQ1(PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vu->mode);
114:   }

116:   if (!vu->fd) SETERRQ1(PETSC_ERR_FILE_OPEN, "Cannot open PetscViewer file: %s", fname);
117: #if defined(PETSC_USE_LOG)
118:   PetscLogObjectState((PetscObject) viewer, "File: %s", name);
119: #endif

121:   return(0);
122: }
123: EXTERN_C_END

125: EXTERN_C_BEGIN
126: #undef __FUNCT__  
128: int PetscViewerCreate_VU(PetscViewer viewer)
129: {
130:   PetscViewer_VU *vu;
131:   int             ierr;

134:   ierr         = PetscNew(PetscViewer_VU, &vu);
135:   viewer->data = (void*) vu;

137:   viewer->ops->destroy          = PetscViewerDestroy_VU;
138:   viewer->ops->flush            = PetscViewerFlush_VU;
139:   viewer->ops->getsingleton     = PETSC_NULL;
140:   viewer->ops->restoresingleton = PETSC_NULL;
141:   viewer->format                = PETSC_VIEWER_ASCII_DEFAULT;
142:   viewer->iformat               = 0;

144:   vu->fd          = PETSC_NULL;
145:   vu->mode        = FILE_MODE_WRITE;
146:   vu->filename    = PETSC_NULL;
147:   vu->vecSeen     = PETSC_FALSE;
148:   vu->queue       = PETSC_NULL;
149:   vu->queueBase   = PETSC_NULL;
150:   vu->queueLength = 0;

152:   PetscObjectComposeFunctionDynamic((PetscObject) viewer,"PetscViewerSetFilename_C", "PetscViewerSetFilename_VU",
153:                                            PetscViewerSetFilename_VU);
154:   PetscObjectComposeFunctionDynamic((PetscObject) viewer,"PetscViewerGetFilename_C", "PetscViewerGetFilename_VU",
155:                                            PetscViewerGetFilename_VU);

157:   return(0);
158: }
159: EXTERN_C_END

161: #undef __FUNCT__  
163: /*@C
164:   PetscViewerVUGetPointer - Extracts the file pointer from a VU PetscViewer.

166:   Not Collective

168:   Input Parameter:
169: . viewer - The PetscViewer

171:   Output Parameter:
172: . fd     - The file pointer

174:   Level: intermediate

176:   Concepts: PetscViewer^file pointer
177:   Concepts: file pointer^getting from PetscViewer

179: .seealso: PetscViewerASCIIGetPointer()
180: @*/
181: int PetscViewerVUGetPointer(PetscViewer viewer, FILE **fd)
182: {
183:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;

187:   *fd = vu->fd;
188:   return(0);
189: }

191: #undef __FUNCT__  
193: /*@C
194:   PetscViewerVUSetMode - Sets the mode in which to open the file.

196:   Not Collective

198:   Input Parameters:
199: + viewer - The PetscViewer
200: - mode   - The file mode

202:   Level: intermediate

204: .keywords: Viewer, file, get, pointer
205: .seealso: PetscViewerASCIISetMode()
206: @*/
207: int PetscViewerVUSetMode(PetscViewer viewer, PetscFileMode mode)
208: {
209:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;

212:   vu->mode = mode;
213:   return(0);
214: }

216: #undef __FUNCT__  
218: /*@C
219:   PetscViewerVUSetVecSeen - Sets the flag which indicates whether we have viewed
220:   a vector. This is usually called internally rather than by a user.

222:   Not Collective

224:   Input Parameters:
225: + viewer  - The PetscViewer
226: - vecSeen - The flag which indicates whether we have viewed a vector

228:   Level: advanced

230: .keywords: Viewer, Vec
231: .seealso: PetscViewerVUGetVecSeen()
232: @*/
233: int PetscViewerVUSetVecSeen(PetscViewer viewer, PetscTruth vecSeen)
234: {
235:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;

238:   vu->vecSeen = vecSeen;
239:   return(0);
240: }

242: #undef __FUNCT__  
244: /*@C
245:   PetscViewerVUGetVecSeen - Gets the flag which indicates whether we have viewed
246:   a vector. This is usually called internally rather than by a user.

248:   Not Collective

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

253:   Output Parameter:
254: . vecSeen - The flag which indicates whether we have viewed a vector

256:   Level: advanced

258: .keywords: Viewer, Vec
259: .seealso: PetscViewerVUGetVecSeen()
260: @*/
261: int PetscViewerVUGetVecSeen(PetscViewer viewer, PetscTruth *vecSeen)
262: {
263:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;

267:   *vecSeen = vu->vecSeen;
268:   return(0);
269: }

271: #undef __FUNCT__  
273: /*@C
274:   PetscViewerVUPrintDeferred - Prints to the deferred write cache instead of the file.

276:   Not Collective

278:   Input Parameters:
279: + viewer - The PetscViewer
280: - format - The format string

282:   Level: intermediate

284: .keywords: Viewer, print, deferred
285: .seealso: PetscViewerVUFlushDeferred()
286: @*/
287: int PetscViewerVUPrintDeferred(PetscViewer viewer, const char format[], ...)
288: {
289:   PetscViewer_VU *vu = (PetscViewer_VU *) viewer->data;
290:   va_list         Argp;
291:   PrintfQueue     next;
292:   int             len;
293:   int             ierr;

296:   PetscNew(struct _PrintfQueue, &next);
297:   if (vu->queue != PETSC_NULL) {
298:     vu->queue->next = next;
299:     vu->queue       = next;
300:     vu->queue->next = PETSC_NULL;
301:   } else {
302:     vu->queueBase   = vu->queue = next;
303:   }
304:   vu->queueLength++;

306:   va_start(Argp, format);
307: #if defined(PETSC_HAVE_VPRINTF_CHAR)
308:   vsprintf(next->string, format, (char *) Argp);
309: #else
310:   vsprintf(next->string, format, Argp);
311: #endif
312:   va_end(Argp);
313:   PetscStrlen(next->string, &len);
314:   if (len > QUEUESTRINGSIZE) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Formatted string longer than %d bytes", QUEUESTRINGSIZE);
315:   return(0);
316: }

318: #undef __FUNCT__  
320: /*@C
321:   PetscViewerVUFlushDeferred - Flushes the deferred write cache to the file.

323:   Not Collective

325:   Input Parameter:
326: + viewer - The PetscViewer

328:   Level: intermediate

330: .keywords: Viewer, flush, deferred
331: .seealso: PetscViewerVUPrintDeferred()
332: @*/
333: int PetscViewerVUFlushDeferred(PetscViewer viewer)
334: {
335:   PetscViewer_VU *vu   = (PetscViewer_VU *) viewer->data;
336:   PrintfQueue     next = vu->queueBase;
337:   PrintfQueue     previous;
338:   int             i;
339:   int             ierr;

342:   for(i = 0; i < vu->queueLength; i++) {
343:     PetscFPrintf(viewer->comm, vu->fd, "%s", next->string);
344:     previous = next;
345:     next     = next->next;
346:     ierr     = PetscFree(previous);
347:   }
348:   vu->queue       = PETSC_NULL;
349:   vu->queueLength = 0;
350:   return(0);
351: }