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