xref: /petsc/src/sys/classes/viewer/impls/vu/petscvu.c (revision e8e8640d1cb9a3a2f50c0c0d7b26e5c4d521e2e4)
1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I     "petscsys.h"   I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith #define QUEUESTRINGSIZE 1024
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith typedef struct _PrintfQueue *PrintfQueue;
65c6c1daeSBarry Smith struct _PrintfQueue {
75c6c1daeSBarry Smith   char        string[QUEUESTRINGSIZE];
85c6c1daeSBarry Smith   PrintfQueue next;
95c6c1daeSBarry Smith };
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith typedef struct {
125c6c1daeSBarry Smith   FILE         *fd;
135c6c1daeSBarry Smith   PetscFileMode mode; /* The mode in which to open the file */
145c6c1daeSBarry Smith   char         *filename;
155c6c1daeSBarry Smith   PetscBool     vecSeen; /* The flag indicating whether any vector has been viewed so far */
165c6c1daeSBarry Smith   PrintfQueue   queue, queueBase;
175c6c1daeSBarry Smith   int           queueLength;
185c6c1daeSBarry Smith } PetscViewer_VU;
195c6c1daeSBarry Smith 
PetscViewerFileClose_VU(PetscViewer viewer)20d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_VU(PetscViewer viewer)
21d71ae5a4SJacob Faibussowitsch {
225c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith   PetscFunctionBegin;
2548a46eb9SPierre Jolivet   if (vu->vecSeen) PetscCall(PetscViewerVUPrintDeferred(viewer, "};\n\n"));
269566063dSJacob Faibussowitsch   PetscCall(PetscViewerVUFlushDeferred(viewer));
279566063dSJacob Faibussowitsch   PetscCall(PetscFClose(PetscObjectComm((PetscObject)viewer), vu->fd));
280298fd71SBarry Smith   vu->fd = NULL;
299566063dSJacob Faibussowitsch   PetscCall(PetscFree(vu->filename));
303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
315c6c1daeSBarry Smith }
325c6c1daeSBarry Smith 
PetscViewerDestroy_VU(PetscViewer viewer)33*34e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_VU(PetscViewer viewer)
34d71ae5a4SJacob Faibussowitsch {
355c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith   PetscFunctionBegin;
389566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_VU(viewer));
399566063dSJacob Faibussowitsch   PetscCall(PetscFree(vu));
402e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", NULL));
412e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", NULL));
422e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", NULL));
432e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", NULL));
443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
455c6c1daeSBarry Smith }
465c6c1daeSBarry Smith 
PetscViewerFlush_VU(PetscViewer viewer)47*34e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerFlush_VU(PetscViewer viewer)
48d71ae5a4SJacob Faibussowitsch {
495c6c1daeSBarry Smith   PetscMPIInt rank;
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith   PetscFunctionBegin;
529566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
53c69effb2SJacob Faibussowitsch   if (rank == 0) PetscCall(PetscFFlush(((PetscViewer_VU *)viewer->data)->fd));
543ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
555c6c1daeSBarry Smith }
565c6c1daeSBarry Smith 
PetscViewerFileSetMode_VU(PetscViewer viewer,PetscFileMode mode)57d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetMode_VU(PetscViewer viewer, PetscFileMode mode)
58d71ae5a4SJacob Faibussowitsch {
597e4fd573SVaclav Hapla   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
607e4fd573SVaclav Hapla 
617e4fd573SVaclav Hapla   PetscFunctionBegin;
627e4fd573SVaclav Hapla   vu->mode = mode;
633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
647e4fd573SVaclav Hapla }
657e4fd573SVaclav Hapla 
PetscViewerFileGetMode_VU(PetscViewer viewer,PetscFileMode * type)66d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetMode_VU(PetscViewer viewer, PetscFileMode *type)
67d71ae5a4SJacob Faibussowitsch {
687e4fd573SVaclav Hapla   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
697e4fd573SVaclav Hapla 
707e4fd573SVaclav Hapla   PetscFunctionBegin;
717e4fd573SVaclav Hapla   *type = vu->mode;
723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
737e4fd573SVaclav Hapla }
747e4fd573SVaclav Hapla 
PetscViewerFileGetName_VU(PetscViewer viewer,const char ** name)75d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetName_VU(PetscViewer viewer, const char **name)
76d71ae5a4SJacob Faibussowitsch {
775c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith   PetscFunctionBegin;
805c6c1daeSBarry Smith   *name = vu->filename;
813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
825c6c1daeSBarry Smith }
835c6c1daeSBarry Smith 
PetscViewerFileSetName_VU(PetscViewer viewer,const char name[])84d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetName_VU(PetscViewer viewer, const char name[])
85d71ae5a4SJacob Faibussowitsch {
865c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
875c6c1daeSBarry Smith   char            fname[PETSC_MAX_PATH_LEN];
885c6c1daeSBarry Smith   int             rank;
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith   PetscFunctionBegin;
913ba16761SJacob Faibussowitsch   if (!name) PetscFunctionReturn(PETSC_SUCCESS);
929566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileClose_VU(viewer));
939566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
943ba16761SJacob Faibussowitsch   if (rank != 0) PetscFunctionReturn(PETSC_SUCCESS);
959566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &vu->filename));
969566063dSJacob Faibussowitsch   PetscCall(PetscFixFilename(name, fname));
975c6c1daeSBarry Smith   switch (vu->mode) {
98d71ae5a4SJacob Faibussowitsch   case FILE_MODE_READ:
99d71ae5a4SJacob Faibussowitsch     vu->fd = fopen(fname, "r");
100d71ae5a4SJacob Faibussowitsch     break;
101d71ae5a4SJacob Faibussowitsch   case FILE_MODE_WRITE:
102d71ae5a4SJacob Faibussowitsch     vu->fd = fopen(fname, "w");
103d71ae5a4SJacob Faibussowitsch     break;
104d71ae5a4SJacob Faibussowitsch   case FILE_MODE_APPEND:
105d71ae5a4SJacob Faibussowitsch     vu->fd = fopen(fname, "a");
106d71ae5a4SJacob Faibussowitsch     break;
1075c6c1daeSBarry Smith   case FILE_MODE_UPDATE:
1085c6c1daeSBarry Smith     vu->fd = fopen(fname, "r+");
109a297a907SKarl Rupp     if (!vu->fd) vu->fd = fopen(fname, "w+");
1105c6c1daeSBarry Smith     break;
1115c6c1daeSBarry Smith   case FILE_MODE_APPEND_UPDATE:
1125c6c1daeSBarry Smith     /* I really want a file which is opened at the end for updating,
1135c6c1daeSBarry Smith        not a+, which opens at the beginning, but makes writes at the end.
1145c6c1daeSBarry Smith     */
1155c6c1daeSBarry Smith     vu->fd = fopen(fname, "r+");
116a297a907SKarl Rupp     if (!vu->fd) vu->fd = fopen(fname, "w+");
1173ba16761SJacob Faibussowitsch     else {
1183ba16761SJacob Faibussowitsch       int ret = fseek(vu->fd, 0, SEEK_END);
1193ba16761SJacob Faibussowitsch       PetscCheck(!ret, PETSC_COMM_SELF, PETSC_ERR_LIB, "fseek() failed with error code %d", ret);
1203ba16761SJacob Faibussowitsch     }
1215c6c1daeSBarry Smith     break;
122d71ae5a4SJacob Faibussowitsch   default:
123d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[vu->mode]);
1245c6c1daeSBarry Smith   }
1255c6c1daeSBarry Smith 
12628b400f6SJacob Faibussowitsch   PetscCheck(vu->fd, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open PetscViewer file: %s", fname);
1273ba16761SJacob Faibussowitsch   PetscCall(PetscLogObjectState((PetscObject)viewer, "File: %s", name));
1283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1295c6c1daeSBarry Smith }
1305c6c1daeSBarry Smith 
131811af0c4SBarry Smith /*MC
132811af0c4SBarry Smith    PETSCVIEWERVU - A viewer that prints to a VU file
133811af0c4SBarry Smith 
134811af0c4SBarry Smith   Level: beginner
135811af0c4SBarry Smith 
136d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerVUFlushDeferred()`, `PetscViewerVUGetPointer()`, `PetscViewerVUSetVecSeen()`, `PetscViewerVUGetVecSeen()`,
137811af0c4SBarry Smith           `PetscViewerVUPrintDeferred()`, `PetscViewerVUFlushDeferred()`
138811af0c4SBarry Smith M*/
PetscViewerCreate_VU(PetscViewer viewer)139d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_VU(PetscViewer viewer)
140d71ae5a4SJacob Faibussowitsch {
1415c6c1daeSBarry Smith   PetscViewer_VU *vu;
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith   PetscFunctionBegin;
1444dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&vu));
1455c6c1daeSBarry Smith   viewer->data = (void *)vu;
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_VU;
1485c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_VU;
149559f443fSBarry Smith   viewer->ops->getsubviewer     = NULL;
150559f443fSBarry Smith   viewer->ops->restoresubviewer = NULL;
1515c6c1daeSBarry Smith 
1520298fd71SBarry Smith   vu->fd          = NULL;
1535c6c1daeSBarry Smith   vu->mode        = FILE_MODE_WRITE;
1540298fd71SBarry Smith   vu->filename    = NULL;
1555c6c1daeSBarry Smith   vu->vecSeen     = PETSC_FALSE;
1560298fd71SBarry Smith   vu->queue       = NULL;
1570298fd71SBarry Smith   vu->queueBase   = NULL;
1585c6c1daeSBarry Smith   vu->queueLength = 0;
1595c6c1daeSBarry Smith 
1609566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", PetscViewerFileSetName_VU));
1619566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", PetscViewerFileGetName_VU));
1629566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_VU));
1639566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", PetscViewerFileGetMode_VU));
1643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1655c6c1daeSBarry Smith }
1665c6c1daeSBarry Smith 
1675c6c1daeSBarry Smith /*@C
168811af0c4SBarry Smith   PetscViewerVUGetPointer - Extracts the file pointer from a `PETSCVIEWERVU` `PetscViewer`.
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith   Not Collective
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith   Input Parameter:
173811af0c4SBarry Smith . viewer - The `PetscViewer`
1745c6c1daeSBarry Smith 
1755c6c1daeSBarry Smith   Output Parameter:
1765c6c1daeSBarry Smith . fd - The file pointer
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith   Level: intermediate
1795c6c1daeSBarry Smith 
180d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERVU`, `PetscViewerASCIIGetPointer()`
1815c6c1daeSBarry Smith @*/
PetscViewerVUGetPointer(PetscViewer viewer,FILE ** fd)182d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerVUGetPointer(PetscViewer viewer, FILE **fd)
183d71ae5a4SJacob Faibussowitsch {
1845c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith   PetscFunctionBegin;
1875c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
1884f572ea9SToby Isaac   PetscAssertPointer(fd, 2);
1895c6c1daeSBarry Smith   *fd = vu->fd;
1903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1915c6c1daeSBarry Smith }
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith /*@C
1945c6c1daeSBarry Smith   PetscViewerVUSetVecSeen - Sets the flag which indicates whether we have viewed
1955c6c1daeSBarry Smith   a vector. This is usually called internally rather than by a user.
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith   Not Collective
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith   Input Parameters:
200811af0c4SBarry Smith + viewer  - The `PETSCVIEWERVU` `PetscViewer`
2015c6c1daeSBarry Smith - vecSeen - The flag which indicates whether we have viewed a vector
2025c6c1daeSBarry Smith 
203811af0c4SBarry Smith   Level: developer
2045c6c1daeSBarry Smith 
205d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERVU`, `PetscViewerVUGetVecSeen()`
2065c6c1daeSBarry Smith @*/
PetscViewerVUSetVecSeen(PetscViewer viewer,PetscBool vecSeen)207d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerVUSetVecSeen(PetscViewer viewer, PetscBool vecSeen)
208d71ae5a4SJacob Faibussowitsch {
2095c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith   PetscFunctionBegin;
2125c6c1daeSBarry Smith   vu->vecSeen = vecSeen;
2133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2145c6c1daeSBarry Smith }
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith /*@C
2175c6c1daeSBarry Smith   PetscViewerVUGetVecSeen - Gets the flag which indicates whether we have viewed
2185c6c1daeSBarry Smith   a vector. This is usually called internally rather than by a user.
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith   Not Collective
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith   Input Parameter:
223811af0c4SBarry Smith . viewer - The `PETSCVIEWERVU` `PetscViewer`
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith   Output Parameter:
2265c6c1daeSBarry Smith . vecSeen - The flag which indicates whether we have viewed a vector
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith   Level: advanced
2295c6c1daeSBarry Smith 
23042747ad1SJacob Faibussowitsch .seealso: [](sec_viewers), `PETSCVIEWERVU`
2315c6c1daeSBarry Smith @*/
PetscViewerVUGetVecSeen(PetscViewer viewer,PetscBool * vecSeen)232d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerVUGetVecSeen(PetscViewer viewer, PetscBool *vecSeen)
233d71ae5a4SJacob Faibussowitsch {
2345c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith   PetscFunctionBegin;
2375c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2384f572ea9SToby Isaac   PetscAssertPointer(vecSeen, 2);
2395c6c1daeSBarry Smith   *vecSeen = vu->vecSeen;
2403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2415c6c1daeSBarry Smith }
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith /*@C
2445c6c1daeSBarry Smith   PetscViewerVUPrintDeferred - Prints to the deferred write cache instead of the file.
2455c6c1daeSBarry Smith 
2465c6c1daeSBarry Smith   Not Collective
2475c6c1daeSBarry Smith 
2485c6c1daeSBarry Smith   Input Parameters:
249811af0c4SBarry Smith + viewer - The `PETSCVIEWERVU` `PetscViewer`
2505c6c1daeSBarry Smith - format - The format string
2515c6c1daeSBarry Smith 
2525c6c1daeSBarry Smith   Level: intermediate
2535c6c1daeSBarry Smith 
254d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERVU`, `PetscViewerVUFlushDeferred()`
2555c6c1daeSBarry Smith @*/
PetscViewerVUPrintDeferred(PetscViewer viewer,const char format[],...)256d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerVUPrintDeferred(PetscViewer viewer, const char format[], ...)
257d71ae5a4SJacob Faibussowitsch {
2585c6c1daeSBarry Smith   PetscViewer_VU *vu = (PetscViewer_VU *)viewer->data;
2595c6c1daeSBarry Smith   va_list         Argp;
2605c6c1daeSBarry Smith   size_t          fullLength;
2615c6c1daeSBarry Smith   PrintfQueue     next;
2625c6c1daeSBarry Smith 
2635c6c1daeSBarry Smith   PetscFunctionBegin;
2649566063dSJacob Faibussowitsch   PetscCall(PetscNew(&next));
2655c6c1daeSBarry Smith   if (vu->queue) {
2665c6c1daeSBarry Smith     vu->queue->next = next;
2675c6c1daeSBarry Smith     vu->queue       = next;
2680298fd71SBarry Smith     vu->queue->next = NULL;
2695c6c1daeSBarry Smith   } else {
2705c6c1daeSBarry Smith     vu->queueBase = vu->queue = next;
2715c6c1daeSBarry Smith   }
2725c6c1daeSBarry Smith   vu->queueLength++;
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith   va_start(Argp, format);
2759566063dSJacob Faibussowitsch   PetscCall(PetscArrayzero(next->string, QUEUESTRINGSIZE));
2769566063dSJacob Faibussowitsch   PetscCall(PetscVSNPrintf(next->string, QUEUESTRINGSIZE, format, &fullLength, Argp));
2775c6c1daeSBarry Smith   va_end(Argp);
2783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2795c6c1daeSBarry Smith }
2805c6c1daeSBarry Smith 
2815c6c1daeSBarry Smith /*@C
2825c6c1daeSBarry Smith   PetscViewerVUFlushDeferred - Flushes the deferred write cache to the file.
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith   Not Collective
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith   Input Parameter:
287811af0c4SBarry Smith . viewer - The `PETSCVIEWERVU` `PetscViewer`
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith   Level: intermediate
2905c6c1daeSBarry Smith 
291d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERVU`, `PetscViewerVUPrintDeferred()`
2925c6c1daeSBarry Smith @*/
PetscViewerVUFlushDeferred(PetscViewer viewer)293d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerVUFlushDeferred(PetscViewer viewer)
294d71ae5a4SJacob Faibussowitsch {
2955c6c1daeSBarry Smith   PetscViewer_VU *vu   = (PetscViewer_VU *)viewer->data;
2965c6c1daeSBarry Smith   PrintfQueue     next = vu->queueBase;
2975c6c1daeSBarry Smith   PrintfQueue     previous;
2985c6c1daeSBarry Smith   int             i;
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith   PetscFunctionBegin;
3015c6c1daeSBarry Smith   for (i = 0; i < vu->queueLength; i++) {
3023ba16761SJacob Faibussowitsch     PetscCall(PetscFPrintf(PetscObjectComm((PetscObject)viewer), vu->fd, "%s", next->string));
3035c6c1daeSBarry Smith     previous = next;
3045c6c1daeSBarry Smith     next     = next->next;
3059566063dSJacob Faibussowitsch     PetscCall(PetscFree(previous));
3065c6c1daeSBarry Smith   }
3070298fd71SBarry Smith   vu->queue       = NULL;
3085c6c1daeSBarry Smith   vu->queueLength = 0;
3093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3105c6c1daeSBarry Smith }
311