# PetscVFPrintf#

All PETSc standard out and error messages are sent through this function; so, in theory, this can can be replaced with something that does not simply write to a file.

## Synopsis#

PetscErrorCode PetscVFPrintfDefault(FILE *fd, const char *format, va_list Argp)


To use, write your own function for example,

PetscErrorCode mypetscvfprintf(FILE *fd,const char format[],va_list Argp)

{\$  PetscErrorCode ierr;



PetscFunctionBegin;

if (fd != stdout && fd != stderr) {  handle regular files

CHKERR(PetscVFPrintfDefault(fd,format,Argp));

} else {

char   buff[BIG];

size_t length;

PetscCall(PetscVSNPrintf(buff,BIG,format,&length,Argp));

now send buff to whatever stream or whatever you want

}

PetscFunctionReturn(0);

}then before the call to PetscInitialize() do the assignment

PetscVFPrintf = mypetscvfprintf;


## Note#

For error messages this may be called by any process, for regular standard out it is called only by process 0 of a given communicator

## Developer Note#

this could be called by an error handler, if that happens then a recursion of the error handler may occur and a crash

PetscVSNPrintf(), PetscErrorPrintf()