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: }