xref: /petsc/src/sys/fileio/mprint.c (revision 121a09c4cc4f3c39ed26350410ff840a157ef0cd)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay       Utilites routines to add simple ASCII IO capability.
3e5c89e4eSSatish Balay */
4c6db04a5SJed Brown #include <../src/sys/fileio/mprint.h>
579c0e996SJed Brown #include <errno.h>
6e5c89e4eSSatish Balay /*
7e5c89e4eSSatish Balay    If petsc_history is on, then all Petsc*Printf() results are saved
8e5c89e4eSSatish Balay    if the appropriate (usually .petschistory) file.
9e5c89e4eSSatish Balay */
10e5c89e4eSSatish Balay extern FILE *petsc_history;
11e5c89e4eSSatish Balay /*
12e5c89e4eSSatish Balay      Allows one to overwrite where standard out is sent. For example
135106ddf5SBarry Smith      PETSC_STDOUT = fopen("/dev/ttyXX","w") will cause all standard out
14e5c89e4eSSatish Balay      writes to go to terminal XX; assuming you have write permission there
15e5c89e4eSSatish Balay */
16e5c89e4eSSatish Balay FILE *PETSC_STDOUT = 0;
17ae9b4142SLisandro Dalcin /*
18ae9b4142SLisandro Dalcin      Allows one to overwrite where standard error is sent. For example
19ae9b4142SLisandro Dalcin      PETSC_STDERR = fopen("/dev/ttyXX","w") will cause all standard error
20ae9b4142SLisandro Dalcin      writes to go to terminal XX; assuming you have write permission there
21ae9b4142SLisandro Dalcin */
22ae9b4142SLisandro Dalcin FILE *PETSC_STDERR = 0;
23b13499bfSbcordonn /*
24b13499bfSbcordonn      Used to output to Zope
25b13499bfSbcordonn */
26b13499bfSbcordonn FILE *PETSC_ZOPEFD = 0;
27b13499bfSbcordonn 
28e5c89e4eSSatish Balay #undef __FUNCT__
29e5c89e4eSSatish Balay #define __FUNCT__ "PetscFormatConvert"
30c9a19010SBarry Smith /*@C
31c9a19010SBarry Smith      PetscFormatConvert - Takes a PETSc format string and converts it to a reqular C format string
32c9a19010SBarry Smith 
33c9a19010SBarry Smith    Input Parameters:
34c9a19010SBarry Smith +   format - the PETSc format string
35c9a19010SBarry Smith .   newformat - the location to put the standard C format string values
36c9a19010SBarry Smith -   size - the length of newformat
37c9a19010SBarry Smith 
38c9a19010SBarry Smith     Note: this exists so we can have the same code when PetscInt is either int or long long and PetscScalar is either double or float
39c9a19010SBarry Smith 
40c9a19010SBarry Smith  Level: developer
41c9a19010SBarry Smith 
42c9a19010SBarry Smith @*/
437087cfbeSBarry Smith PetscErrorCode  PetscFormatConvert(const char *format,char *newformat,size_t size)
44e5c89e4eSSatish Balay {
45e5c89e4eSSatish Balay   PetscInt i = 0,j = 0;
46e5c89e4eSSatish Balay 
477bc47156SJose Roman   while (format[i] && j < (PetscInt)size-1) {
487bc47156SJose Roman     if (format[i] == '%' && format[i+1] != '%') {
497bc47156SJose Roman       /* Find the letter */
507bc47156SJose Roman       for ( ; format[i] && format[i] <= '9'; i++) newformat[j++] = format[i];
517bc47156SJose Roman       switch (format[i]) {
527bc47156SJose Roman       case 'D':
536de02169SBarry Smith #if !defined(PETSC_USE_64BIT_INDICES)
54e5c89e4eSSatish Balay         newformat[j++] = 'd';
55e5c89e4eSSatish Balay #else
56e5c89e4eSSatish Balay         newformat[j++] = 'l';
57e5c89e4eSSatish Balay         newformat[j++] = 'l';
58e5c89e4eSSatish Balay         newformat[j++] = 'd';
59e5c89e4eSSatish Balay #endif
607bc47156SJose Roman         break;
617bc47156SJose Roman       case 'G':
62ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_DOUBLE) || defined(PETSC_USE_REAL_SINGLE)
63a83599f4SBarry Smith         newformat[j++] = 'g';
64ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL_LONG_DOUBLE)
65a83599f4SBarry Smith         newformat[j++] = 'L';
66a83599f4SBarry Smith         newformat[j++] = 'g';
67ce63c4c1SBarry Smith #elif defined(PETSC_USE_REAL___FLOAT128)
68d9822059SBarry Smith         newformat[j++] = 'Q';
6957ddf7daSJose Roman         newformat[j++] = 'g';
70a83599f4SBarry Smith #endif
717bc47156SJose Roman         break;
72*121a09c4SJose Roman       case 'F':
73*121a09c4SJose Roman #if defined(PETSC_USE_REAL_DOUBLE) || defined(PETSC_USE_REAL_SINGLE)
74*121a09c4SJose Roman         newformat[j++] = 'f';
75*121a09c4SJose Roman #elif defined(PETSC_USE_REAL_LONG_DOUBLE)
76*121a09c4SJose Roman         newformat[j++] = 'L';
77*121a09c4SJose Roman         newformat[j++] = 'f';
78*121a09c4SJose Roman #elif defined(PETSC_USE_REAL___FLOAT128)
79*121a09c4SJose Roman         newformat[j++] = 'Q';
80*121a09c4SJose Roman         newformat[j++] = 'f';
81*121a09c4SJose Roman #endif
82*121a09c4SJose Roman         break;
837bc47156SJose Roman       default:
847bc47156SJose Roman         newformat[j++] = format[i];
857bc47156SJose Roman         break;
867bc47156SJose Roman       }
877bc47156SJose Roman       i++;
88e5c89e4eSSatish Balay     } else {
89e5c89e4eSSatish Balay       newformat[j++] = format[i++];
90e5c89e4eSSatish Balay     }
91e5c89e4eSSatish Balay   }
92e5c89e4eSSatish Balay   newformat[j] = 0;
93e5c89e4eSSatish Balay   return 0;
94e5c89e4eSSatish Balay }
95e5c89e4eSSatish Balay 
96e5c89e4eSSatish Balay #undef __FUNCT__
97e5c89e4eSSatish Balay #define __FUNCT__ "PetscVSNPrintf"
98c9a19010SBarry Smith /*@C
99c9a19010SBarry Smith      PetscVSNPrintf - The PETSc version of vsnprintf(). Converts a PETSc format string into a standard C format string and then puts all the
100c9a19010SBarry Smith        function arguments into a string using the format statement.
101c9a19010SBarry Smith 
102c9a19010SBarry Smith    Input Parameters:
103c9a19010SBarry Smith +   str - location to put result
104c9a19010SBarry Smith .   len - the amount of space in str
105c9a19010SBarry Smith +   format - the PETSc format string
106c9a19010SBarry Smith -   fullLength - the amount of space in str actually used.
107c9a19010SBarry Smith 
108c9a19010SBarry Smith     Note:  No error handling because may be called by error handler
109c9a19010SBarry Smith 
110c9a19010SBarry Smith  Level: developer
111c9a19010SBarry Smith 
112c9a19010SBarry Smith @*/
1137087cfbeSBarry Smith PetscErrorCode  PetscVSNPrintf(char *str,size_t len,const char *format,size_t *fullLength,va_list Argp)
114e5c89e4eSSatish Balay {
115e5c89e4eSSatish Balay   /* no malloc since may be called by error handler */
116e2135aedSMatthew Knepley   char          *newformat;
117e2135aedSMatthew Knepley   char           formatbuf[8*1024];
1181a96acb8SJed Brown   size_t         oldLength,length;
1191a96acb8SJed Brown   int            fullLengthInt;
1201a15ef5dSMatthew Knepley   PetscErrorCode ierr;
121e5c89e4eSSatish Balay 
122e2135aedSMatthew Knepley   ierr = PetscStrlen(format, &oldLength);CHKERRQ(ierr);
123e2135aedSMatthew Knepley   if (oldLength < 8*1024) {
124e2135aedSMatthew Knepley     newformat = formatbuf;
125e2135aedSMatthew Knepley   } else {
126e2135aedSMatthew Knepley     ierr = PetscMalloc((oldLength+1) * sizeof(char), &newformat);CHKERRQ(ierr);
127e2135aedSMatthew Knepley   }
128e2135aedSMatthew Knepley   PetscFormatConvert(format,newformat,oldLength+1);
1291a15ef5dSMatthew Knepley   ierr = PetscStrlen(newformat, &length);CHKERRQ(ierr);
1302d609e63SMatthew Knepley #if 0
1311a15ef5dSMatthew Knepley   if (length > len) {
1321a15ef5dSMatthew Knepley     newformat[len] = '\0';
1331a15ef5dSMatthew Knepley   }
1342d609e63SMatthew Knepley #endif
1355a058713SBarry Smith #if defined(PETSC_HAVE_VSNPRINTF_CHAR)
13642c7c0bfSJed Brown   fullLengthInt = vsnprintf(str,len,newformat,(char *)Argp);
13789b07760SSatish Balay #elif defined(PETSC_HAVE_VSNPRINTF)
13842c7c0bfSJed Brown   fullLengthInt = vsnprintf(str,len,newformat,Argp);
139141c0d65SSatish Balay #elif defined(PETSC_HAVE__VSNPRINTF)
14042c7c0bfSJed Brown   fullLengthInt = _vsnprintf(str,len,newformat,Argp);
141e5c89e4eSSatish Balay #else
14289b07760SSatish Balay #error "vsnprintf not found"
143e5c89e4eSSatish Balay #endif
14442c7c0bfSJed Brown   if (fullLengthInt < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"vsnprintf() failed");
14542c7c0bfSJed Brown   *fullLength = (size_t)fullLengthInt;
146e2135aedSMatthew Knepley   if (oldLength >= 8*1024) {
147e2135aedSMatthew Knepley     ierr = PetscFree(newformat);CHKERRQ(ierr);
148e2135aedSMatthew Knepley   }
149e5c89e4eSSatish Balay   return 0;
150e5c89e4eSSatish Balay }
151e5c89e4eSSatish Balay 
152e5c89e4eSSatish Balay #undef __FUNCT__
1537ead4f01Sbcordonn #define __FUNCT__ "PetscZopeLog"
1547087cfbeSBarry Smith PetscErrorCode  PetscZopeLog(const char *format,va_list Argp)
1559c4c166aSBarry Smith {
1567ead4f01Sbcordonn   /* no malloc since may be called by error handler */
1577ead4f01Sbcordonn   char        newformat[8*1024];
1587ead4f01Sbcordonn   char        log[8*1024];
1597ead4f01Sbcordonn   char        logstart[] = " <<<log>>>";
160c9a19010SBarry Smith   size_t      len,formatlen;
1619c4c166aSBarry Smith 
1627ead4f01Sbcordonn   PetscFormatConvert(format,newformat,8*1024);
1637ead4f01Sbcordonn   PetscStrlen(logstart, &len);
1647ead4f01Sbcordonn   PetscMemcpy(log, logstart, len);
1657ead4f01Sbcordonn   PetscStrlen(newformat, &formatlen);
1667ead4f01Sbcordonn   PetscMemcpy(&(log[len]), newformat, formatlen);
1679c4c166aSBarry Smith   if (PETSC_ZOPEFD){
1685a058713SBarry Smith #if defined(PETSC_HAVE_VFPRINTF_CHAR)
1697ead4f01Sbcordonn     vfprintf(PETSC_ZOPEFD,log,(char *)Argp);
1707ead4f01Sbcordonn #else
1717ead4f01Sbcordonn     vfprintf(PETSC_ZOPEFD,log,Argp);
1727ead4f01Sbcordonn #endif
1735a058713SBarry Smith     fflush(PETSC_ZOPEFD);
1747ead4f01Sbcordonn   }
1757ead4f01Sbcordonn   return 0;
1767ead4f01Sbcordonn }
1777ead4f01Sbcordonn 
1787ead4f01Sbcordonn #undef __FUNCT__
179c9a19010SBarry Smith #define __FUNCT__ "PetscVFPrintfDefault"
180c9a19010SBarry Smith /*@C
181c9a19010SBarry Smith      PetscVFPrintf -  All PETSc standard out and error messages are sent through this function; so, in theory, this can
182e5c89e4eSSatish Balay         can be replaced with something that does not simply write to a file.
183e5c89e4eSSatish Balay 
184c9a19010SBarry Smith       To use, write your own function for example,
185c9a19010SBarry Smith $PetscErrorCode mypetscvfprintf(FILE *fd,const char format[],va_list Argp)
186c9a19010SBarry Smith ${
187c9a19010SBarry Smith $  PetscErrorCode ierr;
188c9a19010SBarry Smith $
189c9a19010SBarry Smith $  PetscFunctionBegin;
190c9a19010SBarry Smith $   if (fd != stdout && fd != stderr) {  handle regular files
191c9a19010SBarry Smith $      ierr = PetscVFPrintfDefault(fd,format,Argp); CHKERR(ierr);
192c9a19010SBarry Smith $  } else {
193c9a19010SBarry Smith $     char   buff[BIG];
194c9a19010SBarry Smith $     size_t length;
195c9a19010SBarry Smith $     ierr = PetscVSNPrintf(buff,BIG,format,&length,Argp);CHKERRQ(ierr);
196c9a19010SBarry Smith $     now send buff to whatever stream or whatever you want
197c9a19010SBarry Smith $ }
198c9a19010SBarry Smith $ PetscFunctionReturn(0);
199c9a19010SBarry Smith $}
200c9a19010SBarry Smith then before the call to PetscInitialize() do the assignment
201c9a19010SBarry Smith $    PetscVFPrintf = mypetscvfprintf;
202c9a19010SBarry Smith 
203c9a19010SBarry Smith       Notes: For error messages this may be called by any process, for regular standard out it is
204e5c89e4eSSatish Balay           called only by process 0 of a given communicator
205e5c89e4eSSatish Balay 
206e5c89e4eSSatish Balay       No error handling because may be called by error handler
207c9a19010SBarry Smith 
208c9a19010SBarry Smith   Level:  developer
209c9a19010SBarry Smith 
210c9a19010SBarry Smith .seealso: PetscVSNPrintf(), PetscErrorPrintf()
211c9a19010SBarry Smith 
212c9a19010SBarry Smith @*/
2137087cfbeSBarry Smith PetscErrorCode  PetscVFPrintfDefault(FILE *fd,const char *format,va_list Argp)
214e5c89e4eSSatish Balay {
215e2135aedSMatthew Knepley   /* no malloc since may be called by error handler (assume no long messages in errors) */
216e2135aedSMatthew Knepley   char        *newformat;
217e2135aedSMatthew Knepley   char         formatbuf[8*1024];
218e2135aedSMatthew Knepley   size_t       oldLength;
2191179db26SBarry Smith 
220e2135aedSMatthew Knepley   PetscStrlen(format, &oldLength);
221e2135aedSMatthew Knepley   if (oldLength < 8*1024) {
222e2135aedSMatthew Knepley     newformat = formatbuf;
223e2135aedSMatthew Knepley   } else {
224fee1560eSJed Brown     (void)PetscMalloc((oldLength+1) * sizeof(char), &newformat);
225e2135aedSMatthew Knepley   }
226e2135aedSMatthew Knepley   PetscFormatConvert(format,newformat,oldLength+1);
227d8c6e182Sbcordonn 
2285a058713SBarry Smith #if defined(PETSC_HAVE_VFPRINTF_CHAR)
229e5c89e4eSSatish Balay   vfprintf(fd,newformat,(char *)Argp);
230e5c89e4eSSatish Balay #else
231e5c89e4eSSatish Balay   vfprintf(fd,newformat,Argp);
232e5c89e4eSSatish Balay #endif
2335a058713SBarry Smith   fflush(fd);
234e2135aedSMatthew Knepley   if (oldLength >= 8*1024) {
2359a2231e1SJed Brown     (void)PetscFree(newformat);
236e2135aedSMatthew Knepley   }
237e5c89e4eSSatish Balay   return 0;
238e5c89e4eSSatish Balay }
239e5c89e4eSSatish Balay 
2405b5bc046SBarry Smith #undef __FUNCT__
2415b5bc046SBarry Smith #define __FUNCT__ "PetscSNPrintf"
2425b5bc046SBarry Smith /*@C
2435b5bc046SBarry Smith     PetscSNPrintf - Prints to a string of given length
2445b5bc046SBarry Smith 
2455b5bc046SBarry Smith     Not Collective
2465b5bc046SBarry Smith 
2475b5bc046SBarry Smith     Input Parameters:
2485b5bc046SBarry Smith +   str - the string to print to
2495b5bc046SBarry Smith .   len - the length of str
2505b5bc046SBarry Smith .   format - the usual printf() format string
2515b5bc046SBarry Smith -   any arguments
2525b5bc046SBarry Smith 
2535b5bc046SBarry Smith    Level: intermediate
2545b5bc046SBarry Smith 
2555b5bc046SBarry Smith .seealso: PetscSynchronizedFlush(), PetscSynchronizedFPrintf(), PetscFPrintf(), PetscVSNPrintf(),
2565b5bc046SBarry Smith           PetscPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
2575b5bc046SBarry Smith @*/
2587087cfbeSBarry Smith PetscErrorCode  PetscSNPrintf(char *str,size_t len,const char format[],...)
2595b5bc046SBarry Smith {
2605b5bc046SBarry Smith   PetscErrorCode ierr;
261c9a19010SBarry Smith   size_t         fullLength;
2625b5bc046SBarry Smith   va_list        Argp;
2635b5bc046SBarry Smith 
2645b5bc046SBarry Smith   PetscFunctionBegin;
2655b5bc046SBarry Smith   va_start(Argp,format);
2662d609e63SMatthew Knepley   ierr = PetscVSNPrintf(str,len,format,&fullLength,Argp);CHKERRQ(ierr);
2675b5bc046SBarry Smith   PetscFunctionReturn(0);
2685b5bc046SBarry Smith }
2695b5bc046SBarry Smith 
270257d2499SJed Brown #undef __FUNCT__
271257d2499SJed Brown #define __FUNCT__ "PetscSNPrintfCount"
272257d2499SJed Brown /*@C
273257d2499SJed Brown     PetscSNPrintfCount - Prints to a string of given length, returns count
274257d2499SJed Brown 
275257d2499SJed Brown     Not Collective
276257d2499SJed Brown 
277257d2499SJed Brown     Input Parameters:
278257d2499SJed Brown +   str - the string to print to
279257d2499SJed Brown .   len - the length of str
280257d2499SJed Brown .   format - the usual printf() format string
281257d2499SJed Brown .   countused - number of characters used
282257d2499SJed Brown -   any arguments
283257d2499SJed Brown 
284257d2499SJed Brown    Level: intermediate
285257d2499SJed Brown 
286257d2499SJed Brown .seealso: PetscSynchronizedFlush(), PetscSynchronizedFPrintf(), PetscFPrintf(), PetscVSNPrintf(),
287257d2499SJed Brown           PetscPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf(), PetscSNPrintf()
288257d2499SJed Brown @*/
289257d2499SJed Brown PetscErrorCode  PetscSNPrintfCount(char *str,size_t len,const char format[],size_t *countused,...)
290257d2499SJed Brown {
291257d2499SJed Brown   PetscErrorCode ierr;
292257d2499SJed Brown   va_list        Argp;
293257d2499SJed Brown 
294257d2499SJed Brown   PetscFunctionBegin;
295257d2499SJed Brown   va_start(Argp,countused);
296257d2499SJed Brown   ierr = PetscVSNPrintf(str,len,format,countused,Argp);CHKERRQ(ierr);
297257d2499SJed Brown   PetscFunctionReturn(0);
298257d2499SJed Brown }
299257d2499SJed Brown 
300e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */
301e5c89e4eSSatish Balay 
302e5c89e4eSSatish Balay PrintfQueue queue       = 0,queuebase = 0;
303e5c89e4eSSatish Balay int         queuelength = 0;
304e5c89e4eSSatish Balay FILE        *queuefile  = PETSC_NULL;
305e5c89e4eSSatish Balay 
306e5c89e4eSSatish Balay #undef __FUNCT__
307e5c89e4eSSatish Balay #define __FUNCT__ "PetscSynchronizedPrintf"
308e5c89e4eSSatish Balay /*@C
309e5c89e4eSSatish Balay     PetscSynchronizedPrintf - Prints synchronized output from several processors.
310e5c89e4eSSatish Balay     Output of the first processor is followed by that of the second, etc.
311e5c89e4eSSatish Balay 
312e5c89e4eSSatish Balay     Not Collective
313e5c89e4eSSatish Balay 
314e5c89e4eSSatish Balay     Input Parameters:
315e5c89e4eSSatish Balay +   comm - the communicator
316e5c89e4eSSatish Balay -   format - the usual printf() format string
317e5c89e4eSSatish Balay 
318e5c89e4eSSatish Balay    Level: intermediate
319e5c89e4eSSatish Balay 
320e5c89e4eSSatish Balay     Notes:
321e5c89e4eSSatish Balay     REQUIRES a intervening call to PetscSynchronizedFlush() for the information
322e5c89e4eSSatish Balay     from all the processors to be printed.
323e5c89e4eSSatish Balay 
324e5c89e4eSSatish Balay     Fortran Note:
325d60d70ccSBarry Smith     The call sequence is PetscSynchronizedPrintf(MPI_Comm, character(*), PetscErrorCode ierr) from Fortran.
326e5c89e4eSSatish Balay     That is, you can only pass a single character string from Fortran.
327e5c89e4eSSatish Balay 
328e5c89e4eSSatish Balay .seealso: PetscSynchronizedFlush(), PetscSynchronizedFPrintf(), PetscFPrintf(),
329e5c89e4eSSatish Balay           PetscPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
330e5c89e4eSSatish Balay @*/
3317087cfbeSBarry Smith PetscErrorCode  PetscSynchronizedPrintf(MPI_Comm comm,const char format[],...)
332e5c89e4eSSatish Balay {
333e5c89e4eSSatish Balay   PetscErrorCode ierr;
334e5c89e4eSSatish Balay   PetscMPIInt    rank;
335e5c89e4eSSatish Balay 
336e5c89e4eSSatish Balay   PetscFunctionBegin;
337e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
338e5c89e4eSSatish Balay 
339e5c89e4eSSatish Balay   /* First processor prints immediately to stdout */
340e5c89e4eSSatish Balay   if (!rank) {
341e5c89e4eSSatish Balay     va_list Argp;
342e5c89e4eSSatish Balay     va_start(Argp,format);
3431179db26SBarry Smith     ierr = (*PetscVFPrintf)(PETSC_STDOUT,format,Argp);CHKERRQ(ierr);
344e5c89e4eSSatish Balay     if (petsc_history) {
345cdc7d174SSatish Balay       va_start(Argp,format);
3461179db26SBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
347e5c89e4eSSatish Balay     }
348e5c89e4eSSatish Balay     va_end(Argp);
349e5c89e4eSSatish Balay   } else { /* other processors add to local queue */
350e5c89e4eSSatish Balay     va_list     Argp;
351e5c89e4eSSatish Balay     PrintfQueue next;
352c9a19010SBarry Smith     size_t      fullLength = 8191;
353e5c89e4eSSatish Balay 
354e5c89e4eSSatish Balay     ierr = PetscNew(struct _PrintfQueue,&next);CHKERRQ(ierr);
355e5c89e4eSSatish Balay     if (queue) {queue->next = next; queue = next; queue->next = 0;}
356e5c89e4eSSatish Balay     else       {queuebase   = queue = next;}
357e5c89e4eSSatish Balay     queuelength++;
3582d609e63SMatthew Knepley     next->size = -1;
3599ad23270SJed Brown     while((PetscInt)fullLength >= next->size) {
3602d609e63SMatthew Knepley       next->size = fullLength+1;
3612d609e63SMatthew Knepley       ierr = PetscMalloc(next->size * sizeof(char), &next->string);CHKERRQ(ierr);
362e5c89e4eSSatish Balay       va_start(Argp,format);
3632d609e63SMatthew Knepley       ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
3642d609e63SMatthew Knepley       ierr = PetscVSNPrintf(next->string,next->size,format, &fullLength,Argp);CHKERRQ(ierr);
365e5c89e4eSSatish Balay       va_end(Argp);
366e5c89e4eSSatish Balay     }
3672d609e63SMatthew Knepley   }
368e5c89e4eSSatish Balay 
369e5c89e4eSSatish Balay   PetscFunctionReturn(0);
370e5c89e4eSSatish Balay }
371e5c89e4eSSatish Balay 
372e5c89e4eSSatish Balay #undef __FUNCT__
373e5c89e4eSSatish Balay #define __FUNCT__ "PetscSynchronizedFPrintf"
374e5c89e4eSSatish Balay /*@C
375e5c89e4eSSatish Balay     PetscSynchronizedFPrintf - Prints synchronized output to the specified file from
376e5c89e4eSSatish Balay     several processors.  Output of the first processor is followed by that of the
377e5c89e4eSSatish Balay     second, etc.
378e5c89e4eSSatish Balay 
379e5c89e4eSSatish Balay     Not Collective
380e5c89e4eSSatish Balay 
381e5c89e4eSSatish Balay     Input Parameters:
382e5c89e4eSSatish Balay +   comm - the communicator
383e5c89e4eSSatish Balay .   fd - the file pointer
384e5c89e4eSSatish Balay -   format - the usual printf() format string
385e5c89e4eSSatish Balay 
386e5c89e4eSSatish Balay     Level: intermediate
387e5c89e4eSSatish Balay 
388e5c89e4eSSatish Balay     Notes:
389e5c89e4eSSatish Balay     REQUIRES a intervening call to PetscSynchronizedFlush() for the information
390e5c89e4eSSatish Balay     from all the processors to be printed.
391e5c89e4eSSatish Balay 
392e5c89e4eSSatish Balay .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(),
393e5c89e4eSSatish Balay           PetscFOpen(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPrintf()
394e5c89e4eSSatish Balay 
395e5c89e4eSSatish Balay @*/
3967087cfbeSBarry Smith PetscErrorCode  PetscSynchronizedFPrintf(MPI_Comm comm,FILE* fp,const char format[],...)
397e5c89e4eSSatish Balay {
398e5c89e4eSSatish Balay   PetscErrorCode ierr;
399e5c89e4eSSatish Balay   PetscMPIInt    rank;
400e5c89e4eSSatish Balay 
401e5c89e4eSSatish Balay   PetscFunctionBegin;
402e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
403e5c89e4eSSatish Balay 
404e5c89e4eSSatish Balay   /* First processor prints immediately to fp */
405e5c89e4eSSatish Balay   if (!rank) {
406e5c89e4eSSatish Balay     va_list Argp;
407e5c89e4eSSatish Balay     va_start(Argp,format);
4081179db26SBarry Smith     ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr);
409e5c89e4eSSatish Balay     queuefile = fp;
410cdc7d174SSatish Balay     if (petsc_history && (fp !=petsc_history)) {
411cdc7d174SSatish Balay       va_start(Argp,format);
4121179db26SBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
413e5c89e4eSSatish Balay     }
414e5c89e4eSSatish Balay     va_end(Argp);
415e5c89e4eSSatish Balay   } else { /* other processors add to local queue */
416e5c89e4eSSatish Balay     va_list     Argp;
417e5c89e4eSSatish Balay     PrintfQueue next;
418c9a19010SBarry Smith     size_t      fullLength = 8191;
419e5c89e4eSSatish Balay     ierr = PetscNew(struct _PrintfQueue,&next);CHKERRQ(ierr);
420e5c89e4eSSatish Balay     if (queue) {queue->next = next; queue = next; queue->next = 0;}
421e5c89e4eSSatish Balay     else       {queuebase   = queue = next;}
422e5c89e4eSSatish Balay     queuelength++;
4232d609e63SMatthew Knepley     next->size = -1;
4249ad23270SJed Brown     while((PetscInt)fullLength >= next->size) {
4252d609e63SMatthew Knepley       next->size = fullLength+1;
4262d609e63SMatthew Knepley       ierr = PetscMalloc(next->size * sizeof(char), &next->string);CHKERRQ(ierr);
427e5c89e4eSSatish Balay       va_start(Argp,format);
4282d609e63SMatthew Knepley       ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
4292d609e63SMatthew Knepley       ierr = PetscVSNPrintf(next->string,next->size,format,&fullLength,Argp);CHKERRQ(ierr);
430e5c89e4eSSatish Balay       va_end(Argp);
431e5c89e4eSSatish Balay     }
4322d609e63SMatthew Knepley   }
433e5c89e4eSSatish Balay   PetscFunctionReturn(0);
434e5c89e4eSSatish Balay }
435e5c89e4eSSatish Balay 
436e5c89e4eSSatish Balay #undef __FUNCT__
437e5c89e4eSSatish Balay #define __FUNCT__ "PetscSynchronizedFlush"
438e30d2299SSatish Balay /*@
439e5c89e4eSSatish Balay     PetscSynchronizedFlush - Flushes to the screen output from all processors
440e5c89e4eSSatish Balay     involved in previous PetscSynchronizedPrintf() calls.
441e5c89e4eSSatish Balay 
442e5c89e4eSSatish Balay     Collective on MPI_Comm
443e5c89e4eSSatish Balay 
444e5c89e4eSSatish Balay     Input Parameters:
445e5c89e4eSSatish Balay .   comm - the communicator
446e5c89e4eSSatish Balay 
447e5c89e4eSSatish Balay     Level: intermediate
448e5c89e4eSSatish Balay 
449e5c89e4eSSatish Balay     Notes:
450e5c89e4eSSatish Balay     Usage of PetscSynchronizedPrintf() and PetscSynchronizedFPrintf() with
451e5c89e4eSSatish Balay     different MPI communicators REQUIRES an intervening call to PetscSynchronizedFlush().
452e5c89e4eSSatish Balay 
453e5c89e4eSSatish Balay .seealso: PetscSynchronizedPrintf(), PetscFPrintf(), PetscPrintf(), PetscViewerASCIIPrintf(),
454e5c89e4eSSatish Balay           PetscViewerASCIISynchronizedPrintf()
455e5c89e4eSSatish Balay @*/
4567087cfbeSBarry Smith PetscErrorCode  PetscSynchronizedFlush(MPI_Comm comm)
457e5c89e4eSSatish Balay {
458e5c89e4eSSatish Balay   PetscErrorCode ierr;
459bf3b0749SBarry Smith   PetscMPIInt    rank,size,tag,i,j,n,dummy = 0;
4602d609e63SMatthew Knepley   char          *message;
461e5c89e4eSSatish Balay   MPI_Status     status;
462e5c89e4eSSatish Balay   FILE           *fd;
463e5c89e4eSSatish Balay 
464e5c89e4eSSatish Balay   PetscFunctionBegin;
465e5c89e4eSSatish Balay   ierr = PetscCommDuplicate(comm,&comm,&tag);CHKERRQ(ierr);
466e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
467e5c89e4eSSatish Balay   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
468e5c89e4eSSatish Balay 
469e5c89e4eSSatish Balay   /* First processor waits for messages from all other processors */
470e5c89e4eSSatish Balay   if (!rank) {
471e5c89e4eSSatish Balay     if (queuefile) {
472e5c89e4eSSatish Balay       fd = queuefile;
473e5c89e4eSSatish Balay     } else {
474e5c89e4eSSatish Balay       fd = PETSC_STDOUT;
475e5c89e4eSSatish Balay     }
476e5c89e4eSSatish Balay     for (i=1; i<size; i++) {
4779f73f8ecSBarry Smith       /* to prevent a flood of messages to process zero, request each message separately */
4789f73f8ecSBarry Smith       ierr = MPI_Send(&dummy,1,MPI_INT,i,tag,comm);CHKERRQ(ierr);
479e5c89e4eSSatish Balay       ierr = MPI_Recv(&n,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr);
480e5c89e4eSSatish Balay       for (j=0; j<n; j++) {
4819f73f8ecSBarry Smith         PetscMPIInt size;
4822d609e63SMatthew Knepley 
4832d609e63SMatthew Knepley         ierr = MPI_Recv(&size,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr);
4842d609e63SMatthew Knepley         ierr = PetscMalloc(size * sizeof(char), &message);CHKERRQ(ierr);
4852d609e63SMatthew Knepley         ierr = MPI_Recv(message,size,MPI_CHAR,i,tag,comm,&status);CHKERRQ(ierr);
486e5c89e4eSSatish Balay         ierr = PetscFPrintf(comm,fd,"%s",message);
4872d609e63SMatthew Knepley         ierr = PetscFree(message);CHKERRQ(ierr);
488e5c89e4eSSatish Balay       }
489e5c89e4eSSatish Balay     }
490e5c89e4eSSatish Balay     queuefile = PETSC_NULL;
491e5c89e4eSSatish Balay   } else { /* other processors send queue to processor 0 */
492e5c89e4eSSatish Balay     PrintfQueue next = queuebase,previous;
493e5c89e4eSSatish Balay 
494b3ef9d35SBarry Smith     ierr = MPI_Recv(&dummy,1,MPI_INT,0,tag,comm,&status);CHKERRQ(ierr);
495e5c89e4eSSatish Balay     ierr = MPI_Send(&queuelength,1,MPI_INT,0,tag,comm);CHKERRQ(ierr);
496e5c89e4eSSatish Balay     for (i=0; i<queuelength; i++) {
4972d609e63SMatthew Knepley       ierr     = MPI_Send(&next->size,1,MPI_INT,0,tag,comm);CHKERRQ(ierr);
4982d609e63SMatthew Knepley       ierr     = MPI_Send(next->string,next->size,MPI_CHAR,0,tag,comm);CHKERRQ(ierr);
499e5c89e4eSSatish Balay       previous = next;
500e5c89e4eSSatish Balay       next     = next->next;
5012d609e63SMatthew Knepley       ierr     = PetscFree(previous->string);CHKERRQ(ierr);
502e5c89e4eSSatish Balay       ierr     = PetscFree(previous);CHKERRQ(ierr);
503e5c89e4eSSatish Balay     }
504e5c89e4eSSatish Balay     queue       = 0;
505e5c89e4eSSatish Balay     queuelength = 0;
506e5c89e4eSSatish Balay   }
507e5c89e4eSSatish Balay   ierr = PetscCommDestroy(&comm);CHKERRQ(ierr);
508e5c89e4eSSatish Balay   PetscFunctionReturn(0);
509e5c89e4eSSatish Balay }
510e5c89e4eSSatish Balay 
511e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/
512e5c89e4eSSatish Balay 
513e5c89e4eSSatish Balay #undef __FUNCT__
514e5c89e4eSSatish Balay #define __FUNCT__ "PetscFPrintf"
515e5c89e4eSSatish Balay /*@C
516e5c89e4eSSatish Balay     PetscFPrintf - Prints to a file, only from the first
517e5c89e4eSSatish Balay     processor in the communicator.
518e5c89e4eSSatish Balay 
519e5c89e4eSSatish Balay     Not Collective
520e5c89e4eSSatish Balay 
521e5c89e4eSSatish Balay     Input Parameters:
522e5c89e4eSSatish Balay +   comm - the communicator
523e5c89e4eSSatish Balay .   fd - the file pointer
524e5c89e4eSSatish Balay -   format - the usual printf() format string
525e5c89e4eSSatish Balay 
526e5c89e4eSSatish Balay     Level: intermediate
527e5c89e4eSSatish Balay 
528e5c89e4eSSatish Balay     Fortran Note:
529e5c89e4eSSatish Balay     This routine is not supported in Fortran.
530e5c89e4eSSatish Balay 
531e5c89e4eSSatish Balay    Concepts: printing^in parallel
532e5c89e4eSSatish Balay    Concepts: printf^in parallel
533e5c89e4eSSatish Balay 
534e5c89e4eSSatish Balay .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
535e5c89e4eSSatish Balay           PetscViewerASCIISynchronizedPrintf(), PetscSynchronizedFlush()
536e5c89e4eSSatish Balay @*/
5377087cfbeSBarry Smith PetscErrorCode  PetscFPrintf(MPI_Comm comm,FILE* fd,const char format[],...)
538e5c89e4eSSatish Balay {
539e5c89e4eSSatish Balay   PetscErrorCode ierr;
540e5c89e4eSSatish Balay   PetscMPIInt    rank;
541e5c89e4eSSatish Balay 
542e5c89e4eSSatish Balay   PetscFunctionBegin;
543e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
544e5c89e4eSSatish Balay   if (!rank) {
545e5c89e4eSSatish Balay     va_list Argp;
546e5c89e4eSSatish Balay     va_start(Argp,format);
5471179db26SBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
548cdc7d174SSatish Balay     if (petsc_history && (fd !=petsc_history)) {
549cdc7d174SSatish Balay       va_start(Argp,format);
5501179db26SBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
551e5c89e4eSSatish Balay       }
552e5c89e4eSSatish Balay     va_end(Argp);
553e5c89e4eSSatish Balay   }
554e5c89e4eSSatish Balay   PetscFunctionReturn(0);
555e5c89e4eSSatish Balay }
556e5c89e4eSSatish Balay 
557e5c89e4eSSatish Balay #undef __FUNCT__
558e5c89e4eSSatish Balay #define __FUNCT__ "PetscPrintf"
559e5c89e4eSSatish Balay /*@C
560e5c89e4eSSatish Balay     PetscPrintf - Prints to standard out, only from the first
561e5c89e4eSSatish Balay     processor in the communicator.
562e5c89e4eSSatish Balay 
563e5c89e4eSSatish Balay     Not Collective
564e5c89e4eSSatish Balay 
565e5c89e4eSSatish Balay     Input Parameters:
566e5c89e4eSSatish Balay +   comm - the communicator
567e5c89e4eSSatish Balay -   format - the usual printf() format string
568e5c89e4eSSatish Balay 
569e5c89e4eSSatish Balay    Level: intermediate
570e5c89e4eSSatish Balay 
571e5c89e4eSSatish Balay     Fortran Note:
572d60d70ccSBarry Smith     The call sequence is PetscPrintf(MPI_Comm, character(*), PetscErrorCode ierr) from Fortran.
573e5c89e4eSSatish Balay     That is, you can only pass a single character string from Fortran.
574e5c89e4eSSatish Balay 
5758884cb1fSJed Brown    Notes: The %A format specifier is special.  It assumes an argument of type PetscReal
5768884cb1fSJed Brown           and is replaced with %G unless the absolute value is < 1.e-12 when it is replaced
5778884cb1fSJed Brown           with "< 1.e-12" (1.e-6 for single precision).
578e5c89e4eSSatish Balay 
579e5c89e4eSSatish Balay    Concepts: printing^in parallel
580e5c89e4eSSatish Balay    Concepts: printf^in parallel
581e5c89e4eSSatish Balay 
582e5c89e4eSSatish Balay .seealso: PetscFPrintf(), PetscSynchronizedPrintf()
583e5c89e4eSSatish Balay @*/
5847087cfbeSBarry Smith PetscErrorCode  PetscPrintf(MPI_Comm comm,const char format[],...)
585e5c89e4eSSatish Balay {
586e5c89e4eSSatish Balay   PetscErrorCode ierr;
587e5c89e4eSSatish Balay   PetscMPIInt    rank;
588e5c89e4eSSatish Balay   size_t         len;
589e5c89e4eSSatish Balay   char           *nformat,*sub1,*sub2;
590e5c89e4eSSatish Balay   PetscReal      value;
591e5c89e4eSSatish Balay 
592e5c89e4eSSatish Balay   PetscFunctionBegin;
593e5c89e4eSSatish Balay   if (!comm) comm = PETSC_COMM_WORLD;
594e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
595e5c89e4eSSatish Balay   if (!rank) {
596e5c89e4eSSatish Balay     va_list Argp;
597e5c89e4eSSatish Balay     va_start(Argp,format);
598e5c89e4eSSatish Balay 
599e5c89e4eSSatish Balay     ierr = PetscStrstr(format,"%A",&sub1);CHKERRQ(ierr);
600e5c89e4eSSatish Balay     if (sub1) {
601e5c89e4eSSatish Balay       ierr = PetscStrstr(format,"%",&sub2);CHKERRQ(ierr);
602e32f2f54SBarry Smith       if (sub1 != sub2) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"%%A format must be first in format string");
603e5c89e4eSSatish Balay       ierr    = PetscStrlen(format,&len);CHKERRQ(ierr);
604e5c89e4eSSatish Balay       ierr    = PetscMalloc((len+16)*sizeof(char),&nformat);CHKERRQ(ierr);
605e5c89e4eSSatish Balay       ierr    = PetscStrcpy(nformat,format);CHKERRQ(ierr);
606e5c89e4eSSatish Balay       ierr    = PetscStrstr(nformat,"%",&sub2);CHKERRQ(ierr);
607e5c89e4eSSatish Balay       sub2[0] = 0;
60892eff512SVictor Minden       value   = va_arg(Argp,double);
609ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
6108884cb1fSJed Brown       if (PetscAbsReal(value) < 1.e-6) {
6118884cb1fSJed Brown         ierr    = PetscStrcat(nformat,"< 1.e-6");CHKERRQ(ierr);
6128884cb1fSJed Brown #else
613e5c89e4eSSatish Balay       if (PetscAbsReal(value) < 1.e-12) {
614e5c89e4eSSatish Balay         ierr    = PetscStrcat(nformat,"< 1.e-12");CHKERRQ(ierr);
6158884cb1fSJed Brown #endif
616e5c89e4eSSatish Balay       } else {
6178884cb1fSJed Brown         ierr    = PetscStrcat(nformat,"%G");CHKERRQ(ierr);
618e5c89e4eSSatish Balay         va_end(Argp);
619e5c89e4eSSatish Balay         va_start(Argp,format);
620e5c89e4eSSatish Balay       }
621e5c89e4eSSatish Balay       ierr    = PetscStrcat(nformat,sub1+2);CHKERRQ(ierr);
622e5c89e4eSSatish Balay     } else {
623e5c89e4eSSatish Balay       nformat = (char*)format;
624e5c89e4eSSatish Balay     }
6251179db26SBarry Smith     ierr = (*PetscVFPrintf)(PETSC_STDOUT,nformat,Argp);CHKERRQ(ierr);
626e5c89e4eSSatish Balay     if (petsc_history) {
627cdc7d174SSatish Balay       va_start(Argp,format);
6281179db26SBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,nformat,Argp);CHKERRQ(ierr);
629e5c89e4eSSatish Balay     }
630e5c89e4eSSatish Balay     va_end(Argp);
631e5c89e4eSSatish Balay     if (sub1) {ierr = PetscFree(nformat);CHKERRQ(ierr);}
632e5c89e4eSSatish Balay   }
633e5c89e4eSSatish Balay   PetscFunctionReturn(0);
634e5c89e4eSSatish Balay }
635e5c89e4eSSatish Balay 
636e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/
637e5c89e4eSSatish Balay #undef __FUNCT__
638e5c89e4eSSatish Balay #define __FUNCT__ "PetscHelpPrintfDefault"
639c9a19010SBarry Smith /*@C
640c9a19010SBarry Smith      PetscHelpPrintf -  All PETSc help messages are passing through this function. You can change how help messages are printed by
641c9a19010SBarry Smith         replacinng it  with something that does not simply write to a stdout.
642c9a19010SBarry Smith 
643c9a19010SBarry Smith       To use, write your own function for example,
644c9a19010SBarry Smith $PetscErrorCode mypetschelpprintf(MPI_Comm comm,const char format[],....)
645c9a19010SBarry Smith ${
646c9a19010SBarry Smith $ PetscFunctionReturn(0);
647c9a19010SBarry Smith $}
648c9a19010SBarry Smith then before the call to PetscInitialize() do the assignment
649c9a19010SBarry Smith $    PetscHelpPrintf = mypetschelpprintf;
650c9a19010SBarry Smith 
651c9a19010SBarry Smith   Note: the default routine used is called PetscHelpPrintfDefault().
652c9a19010SBarry Smith 
653c9a19010SBarry Smith   Level:  developer
654c9a19010SBarry Smith 
655c9a19010SBarry Smith .seealso: PetscVSNPrintf(), PetscVFPrintf(), PetscErrorPrintf()
656c9a19010SBarry Smith @*/
6577087cfbeSBarry Smith PetscErrorCode  PetscHelpPrintfDefault(MPI_Comm comm,const char format[],...)
658e5c89e4eSSatish Balay {
659e5c89e4eSSatish Balay   PetscErrorCode ierr;
660e5c89e4eSSatish Balay   PetscMPIInt    rank;
661e5c89e4eSSatish Balay 
662e5c89e4eSSatish Balay   PetscFunctionBegin;
663e5c89e4eSSatish Balay   if (!comm) comm = PETSC_COMM_WORLD;
664e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
665e5c89e4eSSatish Balay   if (!rank) {
666e5c89e4eSSatish Balay     va_list Argp;
667e5c89e4eSSatish Balay     va_start(Argp,format);
6681179db26SBarry Smith     ierr = (*PetscVFPrintf)(PETSC_STDOUT,format,Argp);CHKERRQ(ierr);
669e5c89e4eSSatish Balay     if (petsc_history) {
670cdc7d174SSatish Balay       va_start(Argp,format);
6711179db26SBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
672e5c89e4eSSatish Balay     }
673e5c89e4eSSatish Balay     va_end(Argp);
674e5c89e4eSSatish Balay   }
675e5c89e4eSSatish Balay   PetscFunctionReturn(0);
676e5c89e4eSSatish Balay }
677e5c89e4eSSatish Balay 
678e5c89e4eSSatish Balay /* ---------------------------------------------------------------------------------------*/
679e5c89e4eSSatish Balay 
680e5c89e4eSSatish Balay 
681e5c89e4eSSatish Balay #undef __FUNCT__
682e5c89e4eSSatish Balay #define __FUNCT__ "PetscSynchronizedFGets"
683e5c89e4eSSatish Balay /*@C
684e5c89e4eSSatish Balay     PetscSynchronizedFGets - Several processors all get the same line from a file.
685e5c89e4eSSatish Balay 
686e5c89e4eSSatish Balay     Collective on MPI_Comm
687e5c89e4eSSatish Balay 
688e5c89e4eSSatish Balay     Input Parameters:
689e5c89e4eSSatish Balay +   comm - the communicator
690e5c89e4eSSatish Balay .   fd - the file pointer
691e5c89e4eSSatish Balay -   len - the length of the output buffer
692e5c89e4eSSatish Balay 
693e5c89e4eSSatish Balay     Output Parameter:
694e5c89e4eSSatish Balay .   string - the line read from the file
695e5c89e4eSSatish Balay 
696e5c89e4eSSatish Balay     Level: intermediate
697e5c89e4eSSatish Balay 
698e5c89e4eSSatish Balay .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(),
699e5c89e4eSSatish Balay           PetscFOpen(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPrintf()
700e5c89e4eSSatish Balay 
701e5c89e4eSSatish Balay @*/
7027087cfbeSBarry Smith PetscErrorCode  PetscSynchronizedFGets(MPI_Comm comm,FILE* fp,size_t len,char string[])
703e5c89e4eSSatish Balay {
704e5c89e4eSSatish Balay   PetscErrorCode ierr;
705e5c89e4eSSatish Balay   PetscMPIInt    rank;
706e5c89e4eSSatish Balay 
707e5c89e4eSSatish Balay   PetscFunctionBegin;
708e5c89e4eSSatish Balay   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
709e5c89e4eSSatish Balay 
710e5c89e4eSSatish Balay   if (!rank) {
711047b9c12SMatthew G Knepley     char *ptr = fgets(string, len, fp);
712047b9c12SMatthew G Knepley 
713047b9c12SMatthew G Knepley     if (!ptr) {
714047b9c12SMatthew G Knepley       if (feof(fp)) {
715047b9c12SMatthew G Knepley         len = 0;
7164c2b986eSBarry Smith       } else SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_FILE_READ, "Error reading from file: %d", errno);
717047b9c12SMatthew G Knepley     }
718e5c89e4eSSatish Balay   }
719e5c89e4eSSatish Balay   ierr = MPI_Bcast(string,len,MPI_BYTE,0,comm);CHKERRQ(ierr);
720e5c89e4eSSatish Balay   PetscFunctionReturn(0);
721e5c89e4eSSatish Balay }
722238ccf28SShri Abhyankar 
723238ccf28SShri Abhyankar #if defined(PETSC_HAVE_MATLAB_ENGINE)
724c6db04a5SJed Brown #include <mex.h>
725238ccf28SShri Abhyankar #undef __FUNCT__
726238ccf28SShri Abhyankar #define __FUNCT__ "PetscVFPrintf_Matlab"
7277087cfbeSBarry Smith PetscErrorCode  PetscVFPrintf_Matlab(FILE *fd,const char format[],va_list Argp)
728238ccf28SShri Abhyankar {
729238ccf28SShri Abhyankar   PetscErrorCode ierr;
730238ccf28SShri Abhyankar 
731238ccf28SShri Abhyankar   PetscFunctionBegin;
732238ccf28SShri Abhyankar   if (fd != stdout && fd != stderr) { /* handle regular files */
733238ccf28SShri Abhyankar     ierr = PetscVFPrintfDefault(fd,format,Argp); CHKERRQ(ierr);
734238ccf28SShri Abhyankar   } else {
735238ccf28SShri Abhyankar     size_t len=8*1024,length;
736238ccf28SShri Abhyankar     char   buf[len];
737238ccf28SShri Abhyankar 
738238ccf28SShri Abhyankar     ierr = PetscVSNPrintf(buf,len,format,&length,Argp);CHKERRQ(ierr);
739df413903SBarry Smith     mexPrintf("%s",buf);
740238ccf28SShri Abhyankar  }
741238ccf28SShri Abhyankar  PetscFunctionReturn(0);
742238ccf28SShri Abhyankar }
743238ccf28SShri Abhyankar #endif
744