xref: /petsc/src/sys/error/err.c (revision ca0c3be5b15927b6f0b3f438d04e87b57675cd58)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay       Code that allows one to set the error handlers
4e5c89e4eSSatish Balay */
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h>           /*I "petscsys.h" I*/
6665c2dedSJed Brown #include <petscviewer.h>
7e5c89e4eSSatish Balay 
8e5c89e4eSSatish Balay typedef struct _EH *EH;
9e5c89e4eSSatish Balay struct _EH {
10efca3c55SSatish Balay   PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
11e5c89e4eSSatish Balay   void           *ctx;
12e5c89e4eSSatish Balay   EH             previous;
13e5c89e4eSSatish Balay };
14e5c89e4eSSatish Balay 
15e5c89e4eSSatish Balay static EH eh = 0;
16e5c89e4eSSatish Balay 
17e5c89e4eSSatish Balay /*@C
18e5c89e4eSSatish Balay    PetscEmacsClientErrorHandler - Error handler that uses the emacsclient program to
19e5c89e4eSSatish Balay     load the file where the error occured. Then calls the "previous" error handler.
20e5c89e4eSSatish Balay 
21e5c89e4eSSatish Balay    Not Collective
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Input Parameters:
24e32f2f54SBarry Smith +  comm - communicator over which error occured
25e32f2f54SBarry Smith .  line - the line number of the error (indicated by __LINE__)
26e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
27e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
28e5c89e4eSSatish Balay .  n - the generic error number
29e5c89e4eSSatish Balay .  p - specific error number
30e5c89e4eSSatish Balay -  ctx - error handler context
31e5c89e4eSSatish Balay 
32e5c89e4eSSatish Balay    Options Database Key:
33e5c89e4eSSatish Balay .   -on_error_emacs <machinename>
34e5c89e4eSSatish Balay 
35e5c89e4eSSatish Balay    Level: developer
36e5c89e4eSSatish Balay 
37e5c89e4eSSatish Balay    Notes:
38e5c89e4eSSatish Balay    You must put (server-start) in your .emacs file for the emacsclient software to work
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay    Most users need not directly employ this routine and the other error
41e5c89e4eSSatish Balay    handlers, but can instead use the simplified interface SETERRQ, which has
42e5c89e4eSSatish Balay    the calling sequence
43e32f2f54SBarry Smith $     SETERRQ(PETSC_COMM_SELF,number,p,mess)
44e5c89e4eSSatish Balay 
45e5c89e4eSSatish Balay    Notes for experienced users:
46e93bc3c1Svictor    Use PetscPushErrorHandler() to set the desired error handler.
47e5c89e4eSSatish Balay 
48cc12936aSPatrick Sanan    Developer Note:
49cc12936aSPatrick Sanan    Since this is an error handler it cannot call CHKERRQ(); thus we just return if an error is detected.
503bf036e2SBarry Smith 
51e5c89e4eSSatish Balay 
52e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
53e5c89e4eSSatish Balay           PetscAbortErrorHandler()
54e5c89e4eSSatish Balay  @*/
55efca3c55SSatish Balay PetscErrorCode  PetscEmacsClientErrorHandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx)
56e5c89e4eSSatish Balay {
57e5c89e4eSSatish Balay   PetscErrorCode ierr;
58e5c89e4eSSatish Balay   char           command[PETSC_MAX_PATH_LEN];
59e5c89e4eSSatish Balay   const char     *pdir;
60e5c89e4eSSatish Balay   FILE           *fp;
61e5c89e4eSSatish Balay 
62e5c89e4eSSatish Balay   PetscFunctionBegin;
633bf036e2SBarry Smith   ierr = PetscGetPetscDir(&pdir);if (ierr) PetscFunctionReturn(ierr);
64efca3c55SSatish Balay   sprintf(command,"cd %s; emacsclient --no-wait +%d %s\n",pdir,line,file);
65e5c89e4eSSatish Balay #if defined(PETSC_HAVE_POPEN)
663bf036e2SBarry Smith   ierr = PetscPOpen(MPI_COMM_WORLD,(char*)ctx,command,"r",&fp);if (ierr) PetscFunctionReturn(ierr);
67016831caSBarry Smith   ierr = PetscPClose(MPI_COMM_WORLD,fp);if (ierr) PetscFunctionReturn(ierr);
68e5c89e4eSSatish Balay #else
69e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine");
70e5c89e4eSSatish Balay #endif
713bf036e2SBarry Smith   ierr = PetscPopErrorHandler();if (ierr) PetscFunctionReturn(ierr); /* remove this handler from the stack of handlers */
723bf036e2SBarry Smith   if (!eh) {
73efca3c55SSatish Balay     ierr = PetscTraceBackErrorHandler(comm,line,fun,file,n,p,mess,0);if (ierr) PetscFunctionReturn(ierr);
743bf036e2SBarry Smith   } else {
75efca3c55SSatish Balay     ierr = (*eh->handler)(comm,line,fun,file,n,p,mess,eh->ctx);if (ierr) PetscFunctionReturn(ierr);
763bf036e2SBarry Smith   }
77e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
78e5c89e4eSSatish Balay }
79e5c89e4eSSatish Balay 
80e5c89e4eSSatish Balay /*@C
81e5c89e4eSSatish Balay    PetscPushErrorHandler - Sets a routine to be called on detection of errors.
82e5c89e4eSSatish Balay 
83e5c89e4eSSatish Balay    Not Collective
84e5c89e4eSSatish Balay 
85e5c89e4eSSatish Balay    Input Parameters:
86e5c89e4eSSatish Balay +  handler - error handler routine
87e5c89e4eSSatish Balay -  ctx - optional handler context that contains information needed by the handler (for
88e5c89e4eSSatish Balay          example file pointers for error messages etc.)
89e5c89e4eSSatish Balay 
90e5c89e4eSSatish Balay    Calling sequence of handler:
91efca3c55SSatish Balay $    int handler(MPI_Comm comm,int line,char *func,char *file,PetscErrorCode n,int p,char *mess,void *ctx);
92e5c89e4eSSatish Balay 
93e32f2f54SBarry Smith +  comm - communicator over which error occured
94e5c89e4eSSatish Balay .  line - the line number of the error (indicated by __LINE__)
95e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
96e5c89e4eSSatish Balay .  n - the generic error number (see list defined in include/petscerror.h)
97668f157eSBarry Smith .  p - PETSC_ERROR_INITIAL if error just detected, otherwise PETSC_ERROR_REPEAT
98e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
99e5c89e4eSSatish Balay -  ctx - the error handler context
100e5c89e4eSSatish Balay 
101e5c89e4eSSatish Balay    Options Database Keys:
102e5c89e4eSSatish Balay +   -on_error_attach_debugger <noxterm,gdb or dbx>
103e5c89e4eSSatish Balay -   -on_error_abort
104e5c89e4eSSatish Balay 
105e5c89e4eSSatish Balay    Level: intermediate
106e5c89e4eSSatish Balay 
107e93bc3c1Svictor    Notes:
1087850c7c0SBarry Smith    The currently available PETSc error handlers include PetscTraceBackErrorHandler(),
109e8fb0fc0SBarry Smith    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscMPIAbortErrorHandler(), PetscReturnErrorHandler().
110e93bc3c1Svictor 
11195452b02SPatrick Sanan    Fortran Notes:
11295452b02SPatrick Sanan     You can only push one error handler from Fortran before poping it.
1137850c7c0SBarry Smith 
11434b9b2edSBarry Smith .seealso: PetscPopErrorHandler(), PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), PetscTraceBackErrorHandler(), PetscPushSignalHandler()
115e5c89e4eSSatish Balay 
116e5c89e4eSSatish Balay @*/
117efca3c55SSatish Balay PetscErrorCode  PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void *ctx)
118e5c89e4eSSatish Balay {
119e5c89e4eSSatish Balay   EH             neweh;
120e5c89e4eSSatish Balay   PetscErrorCode ierr;
121e5c89e4eSSatish Balay 
122e5c89e4eSSatish Balay   PetscFunctionBegin;
123b00a9115SJed Brown   ierr = PetscNew(&neweh);CHKERRQ(ierr);
124a297a907SKarl Rupp   if (eh) neweh->previous = eh;
125a297a907SKarl Rupp   else    neweh->previous = 0;
126e5c89e4eSSatish Balay   neweh->handler = handler;
127e5c89e4eSSatish Balay   neweh->ctx     = ctx;
128e5c89e4eSSatish Balay   eh             = neweh;
129e5c89e4eSSatish Balay   PetscFunctionReturn(0);
130e5c89e4eSSatish Balay }
131e5c89e4eSSatish Balay 
132e30d2299SSatish Balay /*@
133e5c89e4eSSatish Balay    PetscPopErrorHandler - Removes the latest error handler that was
134e5c89e4eSSatish Balay    pushed with PetscPushErrorHandler().
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay    Not Collective
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay    Level: intermediate
139e5c89e4eSSatish Balay 
140e5c89e4eSSatish Balay .seealso: PetscPushErrorHandler()
141e5c89e4eSSatish Balay @*/
1427087cfbeSBarry Smith PetscErrorCode  PetscPopErrorHandler(void)
143e5c89e4eSSatish Balay {
144e5c89e4eSSatish Balay   EH             tmp;
145e5c89e4eSSatish Balay   PetscErrorCode ierr;
146e5c89e4eSSatish Balay 
147e5c89e4eSSatish Balay   PetscFunctionBegin;
148e5c89e4eSSatish Balay   if (!eh) PetscFunctionReturn(0);
149e5c89e4eSSatish Balay   tmp  = eh;
150e5c89e4eSSatish Balay   eh   = eh->previous;
151e5c89e4eSSatish Balay   ierr = PetscFree(tmp);CHKERRQ(ierr);
152e5c89e4eSSatish Balay   PetscFunctionReturn(0);
153e5c89e4eSSatish Balay }
154e5c89e4eSSatish Balay 
155e93bc3c1Svictor /*@C
156e93bc3c1Svictor   PetscReturnErrorHandler - Error handler that causes a return to the current
157e93bc3c1Svictor   level.
158e93bc3c1Svictor 
159e93bc3c1Svictor    Not Collective
160e93bc3c1Svictor 
161e93bc3c1Svictor    Input Parameters:
162e32f2f54SBarry Smith +  comm - communicator over which error occurred
163e32f2f54SBarry Smith .  line - the line number of the error (indicated by __LINE__)
164e93bc3c1Svictor .  file - the file in which the error was detected (indicated by __FILE__)
165e93bc3c1Svictor .  mess - an error text string, usually just printed to the screen
166e93bc3c1Svictor .  n - the generic error number
167e93bc3c1Svictor .  p - specific error number
168e93bc3c1Svictor -  ctx - error handler context
169e93bc3c1Svictor 
170e93bc3c1Svictor    Level: developer
171e93bc3c1Svictor 
172e93bc3c1Svictor    Notes:
173e93bc3c1Svictor    Most users need not directly employ this routine and the other error
174e93bc3c1Svictor    handlers, but can instead use the simplified interface SETERRQ, which has
175e93bc3c1Svictor    the calling sequence
176e32f2f54SBarry Smith $     SETERRQ(comm,number,mess)
177e93bc3c1Svictor 
178e93bc3c1Svictor    Notes for experienced users:
179e93bc3c1Svictor    This routine is good for catching errors such as zero pivots in preconditioners
180e93bc3c1Svictor    or breakdown of iterative methods. It is not appropriate for memory violations
181e93bc3c1Svictor    and similar errors.
182e93bc3c1Svictor 
183e93bc3c1Svictor    Use PetscPushErrorHandler() to set the desired error handler.  The
184e93bc3c1Svictor    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
185e8fb0fc0SBarry Smith    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscAbortErrorHandler()
186e93bc3c1Svictor 
187e93bc3c1Svictor .seealso:  PetscPushErrorHandler(), PetscPopErrorHandler().
188e93bc3c1Svictor  @*/
189e93bc3c1Svictor 
190efca3c55SSatish Balay PetscErrorCode  PetscReturnErrorHandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx)
191e93bc3c1Svictor {
192e93bc3c1Svictor   PetscFunctionBegin;
193e93bc3c1Svictor   PetscFunctionReturn(n);
194e93bc3c1Svictor }
195e93bc3c1Svictor 
196e5c89e4eSSatish Balay static char PetscErrorBaseMessage[1024];
197e5c89e4eSSatish Balay /*
198e5c89e4eSSatish Balay        The numerical values for these are defined in include/petscerror.h; any changes
199e5c89e4eSSatish Balay    there must also be made here
200e5c89e4eSSatish Balay */
201e5c89e4eSSatish Balay static const char *PetscErrorStrings[] = {
202e5c89e4eSSatish Balay   /*55 */ "Out of memory",
203e5c89e4eSSatish Balay           "No support for this operation for this object type",
204e5c89e4eSSatish Balay           "No support for this operation on this system",
205e5c89e4eSSatish Balay   /*58 */ "Operation done in wrong order",
206e5c89e4eSSatish Balay   /*59 */ "Signal received",
207e5c89e4eSSatish Balay   /*60 */ "Nonconforming object sizes",
208e5c89e4eSSatish Balay           "Argument aliasing not permitted",
209e5c89e4eSSatish Balay           "Invalid argument",
210e5c89e4eSSatish Balay   /*63 */ "Argument out of range",
211a8d69d7bSBarry Smith           "Corrupt argument: https://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind",
212e5c89e4eSSatish Balay           "Unable to open file",
213e5c89e4eSSatish Balay           "Read from file failed",
214e5c89e4eSSatish Balay           "Write to file failed",
215e5c89e4eSSatish Balay           "Invalid pointer",
216e5c89e4eSSatish Balay   /*69 */ "Arguments must have same type",
217a8b45ee7SBarry Smith   /*70 */ "Attempt to use a pointer that does not point to a valid accessible location",
218a8d69d7bSBarry Smith   /*71 */ "Zero pivot in LU factorization: https://www.mcs.anl.gov/petsc/documentation/faq.html#zeropivot",
219e5c89e4eSSatish Balay   /*72 */ "Floating point exception",
220e5c89e4eSSatish Balay   /*73 */ "Object is in wrong state",
221e5c89e4eSSatish Balay           "Corrupted Petsc object",
222e5c89e4eSSatish Balay           "Arguments are incompatible",
223e5c89e4eSSatish Balay           "Error in external library",
224e5c89e4eSSatish Balay   /*77 */ "Petsc has generated inconsistent data",
2253d40d40dSBarry Smith           "Memory corruption: https://www.mcs.anl.gov/petsc/documentation/installation.html#valgrind",
226e5c89e4eSSatish Balay           "Unexpected data in file",
227e5c89e4eSSatish Balay   /*80 */ "Arguments must have same communicators",
228a8d69d7bSBarry Smith   /*81 */ "Zero pivot in Cholesky factorization: https://www.mcs.anl.gov/petsc/documentation/faq.html#zeropivot",
229e5c89e4eSSatish Balay           "  ",
230e5c89e4eSSatish Balay           "  ",
231a8d69d7bSBarry Smith           "Overflow in integer operation: https://www.mcs.anl.gov/petsc/documentation/faq.html#64-bit-indices",
232e5c89e4eSSatish Balay   /*85 */ "Null argument, when expecting valid pointer",
2333d40d40dSBarry Smith   /*86 */ "Unknown type. Check for miss-spelling or missing package: https://www.mcs.anl.gov/petsc/documentation/installation.html#external",
2343d96e996SBarry Smith   /*87 */ "MPI library at runtime is not compatible with MPI used at compile time",
2358cda6cd7SBarry Smith   /*88 */ "Error in system call",
236a8d69d7bSBarry Smith   /*89 */ "Object Type not set: https://www.mcs.anl.gov/petsc/documentation/faq.html#objecttypenotset",
23773260a9bSLisandro Dalcin   /*90 */ "  ",
23873260a9bSLisandro Dalcin   /*   */ "  ",
2393d40d40dSBarry Smith   /*92 */ "See https://www.mcs.anl.gov/petsc/documentation/linearsolvertable.html for possible LU and Cholesky solvers",
240f560318cSPatrick Sanan   /*93 */ "You cannot overwrite this option since that will conflict with other previously set options",
24173260a9bSLisandro Dalcin };
242e5c89e4eSSatish Balay 
243e5c89e4eSSatish Balay /*@C
244e5c89e4eSSatish Balay    PetscErrorMessage - returns the text string associated with a PETSc error code.
245e5c89e4eSSatish Balay 
246e5c89e4eSSatish Balay    Not Collective
247e5c89e4eSSatish Balay 
248e5c89e4eSSatish Balay    Input Parameter:
249e5c89e4eSSatish Balay .   errnum - the error code
250e5c89e4eSSatish Balay 
251e5c89e4eSSatish Balay    Output Parameter:
2520298fd71SBarry Smith +  text - the error message (NULL if not desired)
2530298fd71SBarry Smith -  specific - the specific error message that was set with SETERRxxx() or PetscError().  (NULL if not desired)
254e5c89e4eSSatish Balay 
255e5c89e4eSSatish Balay    Level: developer
256e5c89e4eSSatish Balay 
25778179f8bSBarry Smith .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(), PetscError(), SETERRQ(), CHKERRQ()
258e5c89e4eSSatish Balay           PetscAbortErrorHandler(), PetscTraceBackErrorHandler()
259e5c89e4eSSatish Balay  @*/
2607087cfbeSBarry Smith PetscErrorCode  PetscErrorMessage(int errnum,const char *text[],char **specific)
261e5c89e4eSSatish Balay {
262e5c89e4eSSatish Balay   PetscFunctionBegin;
263a297a907SKarl Rupp   if (text && errnum > PETSC_ERR_MIN_VALUE && errnum < PETSC_ERR_MAX_VALUE) *text = PetscErrorStrings[errnum-PETSC_ERR_MIN_VALUE-1];
264a297a907SKarl Rupp   else if (text) *text = 0;
265e5c89e4eSSatish Balay 
266a297a907SKarl Rupp   if (specific) *specific = PetscErrorBaseMessage;
267e5c89e4eSSatish Balay   PetscFunctionReturn(0);
268e5c89e4eSSatish Balay }
269e5c89e4eSSatish Balay 
270984a1229SMatthew G. Knepley #if defined(PETSC_CLANGUAGE_CXX)
271984a1229SMatthew G. Knepley /* C++ exceptions are formally not allowed to propagate through extern "C" code. In practice, far too much software
272984a1229SMatthew G. Knepley  * would be broken if implementations did not handle it it some common cases. However, keep in mind
273984a1229SMatthew G. Knepley  *
274984a1229SMatthew G. Knepley  *   Rule 62. Don't allow exceptions to propagate across module boundaries
275984a1229SMatthew G. Knepley  *
276984a1229SMatthew G. Knepley  * in "C++ Coding Standards" by Sutter and Alexandrescu. (This accounts for part of the ongoing C++ binary interface
277984a1229SMatthew G. Knepley  * instability.) Having PETSc raise errors as C++ exceptions was probably misguided and should eventually be removed.
278984a1229SMatthew G. Knepley  *
279984a1229SMatthew G. Knepley  * Here is the problem: You have a C++ function call a PETSc function, and you would like to maintain the error message
280984a1229SMatthew G. Knepley  * and stack information from the PETSc error. You could make everyone write exactly this code in their C++, but that
281984a1229SMatthew G. Knepley  * seems crazy to me.
282984a1229SMatthew G. Knepley  */
283984a1229SMatthew G. Knepley #include <sstream>
2844c94c282SMatthew G. Knepley #include <stdexcept>
285984a1229SMatthew G. Knepley static void PetscCxxErrorThrow() {
286984a1229SMatthew G. Knepley   const char *str;
287984a1229SMatthew G. Knepley   if (eh && eh->ctx) {
288984a1229SMatthew G. Knepley     std::ostringstream *msg;
289984a1229SMatthew G. Knepley     msg = (std::ostringstream*) eh->ctx;
290984a1229SMatthew G. Knepley     str = msg->str().c_str();
291984a1229SMatthew G. Knepley   } else str = "Error detected in C PETSc";
292984a1229SMatthew G. Knepley 
293984a1229SMatthew G. Knepley   throw std::runtime_error(str);
294984a1229SMatthew G. Knepley }
295984a1229SMatthew G. Knepley #endif
296984a1229SMatthew G. Knepley 
297e5c89e4eSSatish Balay /*@C
298e5c89e4eSSatish Balay    PetscError - Routine that is called when an error has been detected,
299e32f2f54SBarry Smith    usually called through the macro SETERRQ(PETSC_COMM_SELF,).
300e5c89e4eSSatish Balay 
301e5c89e4eSSatish Balay    Not Collective
302e5c89e4eSSatish Balay 
303e5c89e4eSSatish Balay    Input Parameters:
304e32f2f54SBarry Smith +  comm - communicator over which error occurred.  ALL ranks of this communicator MUST call this routine
305e32f2f54SBarry Smith .  line - the line number of the error (indicated by __LINE__)
3063de71b31SHong Zhang .  func - the function name in which the error was detected
307e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
308e5c89e4eSSatish Balay .  n - the generic error number
309d736bfebSBarry Smith .  p - PETSC_ERROR_INITIAL indicates the error was initially detected, PETSC_ERROR_REPEAT indicates this is a traceback from a previously detected error
310e5c89e4eSSatish Balay -  mess - formatted message string - aka printf
311e5c89e4eSSatish Balay 
312e5c89e4eSSatish Balay   Level: intermediate
313e5c89e4eSSatish Balay 
314e5c89e4eSSatish Balay    Notes:
315e5c89e4eSSatish Balay    Most users need not directly use this routine and the error handlers, but
316e5c89e4eSSatish Balay    can instead use the simplified interface SETERRQ, which has the calling
317e5c89e4eSSatish Balay    sequence
318e32f2f54SBarry Smith $     SETERRQ(comm,n,mess)
319e5c89e4eSSatish Balay 
320e3081792SBarry Smith    Fortran Note:
321e3081792SBarry Smith    This routine is used differently from Fortran
322e3081792SBarry Smith $    PetscError(MPI_Comm comm,PetscErrorCode n,PetscErrorType p,char *message)
323e3081792SBarry Smith 
324e5c89e4eSSatish Balay    Experienced users can set the error handler with PetscPushErrorHandler().
325e5c89e4eSSatish Balay 
3263bf036e2SBarry Smith    Developer Note: Since this is called after an error condition it should not be calling any error handlers (currently it ignores any error codes)
3273bf036e2SBarry Smith    BUT this routine does call regular PETSc functions that may call error handlers, this is problematic and could be fixed by never calling other PETSc routines
3283bf036e2SBarry Smith    but this annoying.
3293bf036e2SBarry Smith 
33078179f8bSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), SETERRQ(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), PetscErrorMessage()
331e5c89e4eSSatish Balay @*/
332efca3c55SSatish Balay PetscErrorCode PetscError(MPI_Comm comm,int line,const char *func,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,...)
333e5c89e4eSSatish Balay {
334e5c89e4eSSatish Balay   va_list        Argp;
335c9a19010SBarry Smith   size_t         fullLength;
336e5c89e4eSSatish Balay   char           buf[2048],*lbuf = 0;
337fbfcfee5SBarry Smith   PetscBool      ismain;
3383bf036e2SBarry Smith   PetscErrorCode ierr;
339e5c89e4eSSatish Balay 
3400d577829SBarry Smith   PetscFunctionBegin;
341e5c89e4eSSatish Balay   if (!func) func = "User provided function";
342e5c89e4eSSatish Balay   if (!file) file = "User file";
3430d577829SBarry Smith   if (comm == MPI_COMM_NULL) comm = PETSC_COMM_SELF;
344e5c89e4eSSatish Balay 
345e5c89e4eSSatish Balay   /* Compose the message evaluating the print format */
346e5c89e4eSSatish Balay   if (mess) {
347e5c89e4eSSatish Balay     va_start(Argp,mess);
3482d609e63SMatthew Knepley     PetscVSNPrintf(buf,2048,mess,&fullLength,Argp);
349e5c89e4eSSatish Balay     va_end(Argp);
350e5c89e4eSSatish Balay     lbuf = buf;
35178179f8bSBarry Smith     if (p == PETSC_ERROR_INITIAL) PetscStrncpy(PetscErrorBaseMessage,lbuf,1023);
352e5c89e4eSSatish Balay   }
353e5c89e4eSSatish Balay 
354efca3c55SSatish Balay   if (!eh) ierr = PetscTraceBackErrorHandler(comm,line,func,file,n,p,lbuf,0);
355efca3c55SSatish Balay   else     ierr = (*eh->handler)(comm,line,func,file,n,p,lbuf,eh->ctx);
356e5c89e4eSSatish Balay 
357e5c89e4eSSatish Balay   /*
358e5c89e4eSSatish Balay       If this is called from the main() routine we call MPI_Abort() instead of
359e5c89e4eSSatish Balay     return to allow the parallel program to be properly shutdown.
360e5c89e4eSSatish Balay 
361e5c89e4eSSatish Balay     Since this is in the error handler we don't check the errors below. Of course,
362e5c89e4eSSatish Balay     PetscStrncmp() does its own error checking which is problamatic
363e5c89e4eSSatish Balay   */
364e5c89e4eSSatish Balay   PetscStrncmp(func,"main",4,&ismain);
365fbfcfee5SBarry Smith   if (ismain) MPI_Abort(PETSC_COMM_WORLD,(int)ierr);
366a297a907SKarl Rupp 
3672c280183SJed Brown #if defined(PETSC_CLANGUAGE_CXX)
368d736bfebSBarry Smith   if (p == PETSC_ERROR_IN_CXX) {
3692c280183SJed Brown     PetscCxxErrorThrow();
370d736bfebSBarry Smith   }
371d736bfebSBarry Smith #endif
372e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
373e5c89e4eSSatish Balay }
374e5c89e4eSSatish Balay 
375e5c89e4eSSatish Balay /* -------------------------------------------------------------------------*/
376e5c89e4eSSatish Balay 
377e5c89e4eSSatish Balay /*@C
378e5c89e4eSSatish Balay     PetscIntView - Prints an array of integers; useful for debugging.
379e5c89e4eSSatish Balay 
380e5c89e4eSSatish Balay     Collective on PetscViewer
381e5c89e4eSSatish Balay 
382e5c89e4eSSatish Balay     Input Parameters:
383e5c89e4eSSatish Balay +   N - number of integers in array
384e5c89e4eSSatish Balay .   idx - array of integers
385e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
386e5c89e4eSSatish Balay 
387e5c89e4eSSatish Balay   Level: intermediate
388e5c89e4eSSatish Balay 
38995452b02SPatrick Sanan     Developer Notes:
39095452b02SPatrick Sanan     idx cannot be const because may be passed to binary viewer where byte swapping is done
391300a7f5bSBarry Smith 
392e5c89e4eSSatish Balay .seealso: PetscRealView()
393e5c89e4eSSatish Balay @*/
3947087cfbeSBarry Smith PetscErrorCode  PetscIntView(PetscInt N,const PetscInt idx[],PetscViewer viewer)
395e5c89e4eSSatish Balay {
396e5c89e4eSSatish Balay   PetscErrorCode ierr;
397*ca0c3be5SJacob Faibussowitsch   PetscMPIInt	 rank,size;
398e5c89e4eSSatish Balay   PetscInt       j,i,n = N/20,p = N % 20;
399ace3abfcSBarry Smith   PetscBool      iascii,isbinary;
400e5c89e4eSSatish Balay   MPI_Comm       comm;
401e5c89e4eSSatish Balay 
402e5c89e4eSSatish Balay   PetscFunctionBegin;
403e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
4040700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,3);
4055ab33896SBarry Smith   if (N) PetscValidIntPointer(idx,2);
406e5c89e4eSSatish Balay   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
407*ca0c3be5SJacob Faibussowitsch   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
408*ca0c3be5SJacob Faibussowitsch   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
409e5c89e4eSSatish Balay 
410251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
411251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
412e5c89e4eSSatish Balay   if (iascii) {
4131575c14dSBarry Smith     ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
414e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
415*ca0c3be5SJacob Faibussowitsch       if (size > 1) {
416*ca0c3be5SJacob Faibussowitsch         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %D:", rank, 20*i);CHKERRQ(ierr);
417*ca0c3be5SJacob Faibussowitsch       } else {
418e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D:",20*i);CHKERRQ(ierr);
419*ca0c3be5SJacob Faibussowitsch       }
420e5c89e4eSSatish Balay       for (j=0; j<20; j++) {
421e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %D",idx[i*20+j]);CHKERRQ(ierr);
422e5c89e4eSSatish Balay       }
423e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
424e5c89e4eSSatish Balay     }
425e5c89e4eSSatish Balay     if (p) {
426*ca0c3be5SJacob Faibussowitsch       if (size > 1) {
427*ca0c3be5SJacob Faibussowitsch         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %D:",rank ,20*n);CHKERRQ(ierr);
428*ca0c3be5SJacob Faibussowitsch       } else {
429e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D:",20*n);CHKERRQ(ierr);
430*ca0c3be5SJacob Faibussowitsch       }
431e5c89e4eSSatish Balay       for (i=0; i<p; i++) { ierr = PetscViewerASCIISynchronizedPrintf(viewer," %D",idx[20*n+i]);CHKERRQ(ierr);}
432e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
433e5c89e4eSSatish Balay     }
434e5c89e4eSSatish Balay     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
4351575c14dSBarry Smith     ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
4366805f65bSBarry Smith   } else if (isbinary) {
437*ca0c3be5SJacob Faibussowitsch     PetscMPIInt *sizes,Ntotal,*displs,NN;
438e5c89e4eSSatish Balay     PetscInt    *array;
439783b601eSJed Brown 
4404dc2109aSBarry Smith     ierr = PetscMPIIntCast(N,&NN);CHKERRQ(ierr);
441e5c89e4eSSatish Balay 
442e5c89e4eSSatish Balay     if (size > 1) {
443e5c89e4eSSatish Balay       if (rank) {
444e5c89e4eSSatish Balay         ierr = MPI_Gather(&NN,1,MPI_INT,0,0,MPI_INT,0,comm);CHKERRQ(ierr);
445300a7f5bSBarry Smith         ierr = MPI_Gatherv((void*)idx,NN,MPIU_INT,0,0,0,MPIU_INT,0,comm);CHKERRQ(ierr);
446e5c89e4eSSatish Balay       } else {
447785e854fSJed Brown         ierr      = PetscMalloc1(size,&sizes);CHKERRQ(ierr);
448adcec1e5SJed Brown         ierr      = MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm);CHKERRQ(ierr);
449e5c89e4eSSatish Balay         Ntotal    = sizes[0];
450785e854fSJed Brown         ierr      = PetscMalloc1(size,&displs);CHKERRQ(ierr);
451e5c89e4eSSatish Balay         displs[0] = 0;
452e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
453e5c89e4eSSatish Balay           Ntotal   += sizes[i];
454e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
455e5c89e4eSSatish Balay         }
456785e854fSJed Brown         ierr = PetscMalloc1(Ntotal,&array);CHKERRQ(ierr);
457300a7f5bSBarry Smith         ierr = MPI_Gatherv((void*)idx,NN,MPIU_INT,array,sizes,displs,MPIU_INT,0,comm);CHKERRQ(ierr);
4586805f65bSBarry Smith         ierr = PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
459e5c89e4eSSatish Balay         ierr = PetscFree(sizes);CHKERRQ(ierr);
460e5c89e4eSSatish Balay         ierr = PetscFree(displs);CHKERRQ(ierr);
461e5c89e4eSSatish Balay         ierr = PetscFree(array);CHKERRQ(ierr);
462e5c89e4eSSatish Balay       }
463e5c89e4eSSatish Balay     } else {
46447b06e05SMatthew Knepley       ierr = PetscViewerBinaryWrite(viewer,(void*) idx,N,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
465e5c89e4eSSatish Balay     }
466e5c89e4eSSatish Balay   } else {
467e5c89e4eSSatish Balay     const char *tname;
468e5c89e4eSSatish Balay     ierr = PetscObjectGetName((PetscObject)viewer,&tname);CHKERRQ(ierr);
469e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
470e5c89e4eSSatish Balay   }
471e5c89e4eSSatish Balay   PetscFunctionReturn(0);
472e5c89e4eSSatish Balay }
473e5c89e4eSSatish Balay 
474e5c89e4eSSatish Balay /*@C
475e5c89e4eSSatish Balay     PetscRealView - Prints an array of doubles; useful for debugging.
476e5c89e4eSSatish Balay 
477e5c89e4eSSatish Balay     Collective on PetscViewer
478e5c89e4eSSatish Balay 
479e5c89e4eSSatish Balay     Input Parameters:
480cba51d77SBarry Smith +   N - number of PetscReal in array
481cba51d77SBarry Smith .   idx - array of PetscReal
482e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
483e5c89e4eSSatish Balay 
484e5c89e4eSSatish Balay   Level: intermediate
485e5c89e4eSSatish Balay 
48695452b02SPatrick Sanan     Developer Notes:
48795452b02SPatrick Sanan     idx cannot be const because may be passed to binary viewer where byte swapping is done
488300a7f5bSBarry Smith 
489e5c89e4eSSatish Balay .seealso: PetscIntView()
490e5c89e4eSSatish Balay @*/
4917087cfbeSBarry Smith PetscErrorCode  PetscRealView(PetscInt N,const PetscReal idx[],PetscViewer viewer)
492e5c89e4eSSatish Balay {
493e5c89e4eSSatish Balay   PetscErrorCode ierr;
494*ca0c3be5SJacob Faibussowitsch   PetscMPIInt	 rank,size;
495e5c89e4eSSatish Balay   PetscInt       j,i,n = N/5,p = N % 5;
496ace3abfcSBarry Smith   PetscBool      iascii,isbinary;
497e5c89e4eSSatish Balay   MPI_Comm       comm;
498e5c89e4eSSatish Balay 
499e5c89e4eSSatish Balay   PetscFunctionBegin;
500e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
5010700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,3);
502e5c89e4eSSatish Balay   PetscValidScalarPointer(idx,2);
503e5c89e4eSSatish Balay   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
504*ca0c3be5SJacob Faibussowitsch   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
505*ca0c3be5SJacob Faibussowitsch   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
506e5c89e4eSSatish Balay 
507251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
508251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
509e5c89e4eSSatish Balay   if (iascii) {
5101575c14dSBarry Smith     ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
511e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
512*ca0c3be5SJacob Faibussowitsch       if (size > 1) {
513*ca0c3be5SJacob Faibussowitsch         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2d:",rank ,(int)5*i);CHKERRQ(ierr);
514*ca0c3be5SJacob Faibussowitsch       } else {
5157824ef9bSBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",(int)5*i);CHKERRQ(ierr);
516*ca0c3be5SJacob Faibussowitsch       }
517e5c89e4eSSatish Balay       for (j=0; j<5; j++) {
518cba51d77SBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[i*5+j]);CHKERRQ(ierr);
519e5c89e4eSSatish Balay       }
520e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
521e5c89e4eSSatish Balay     }
522e5c89e4eSSatish Balay     if (p) {
523*ca0c3be5SJacob Faibussowitsch       if (size > 1) {
524*ca0c3be5SJacob Faibussowitsch         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2d:",rank ,(int)5*n);CHKERRQ(ierr);
525*ca0c3be5SJacob Faibussowitsch       } else {
5267824ef9bSBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",(int)5*n);CHKERRQ(ierr);
527*ca0c3be5SJacob Faibussowitsch       }
528cba51d77SBarry Smith       for (i=0; i<p; i++) { PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[5*n+i]);CHKERRQ(ierr);}
529e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
530e5c89e4eSSatish Balay     }
531e5c89e4eSSatish Balay     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
5321575c14dSBarry Smith     ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
5336805f65bSBarry Smith   } else if (isbinary) {
534*ca0c3be5SJacob Faibussowitsch     PetscMPIInt *sizes,*displs, Ntotal,NN;
535e5c89e4eSSatish Balay     PetscReal   *array;
536e5c89e4eSSatish Balay 
5374dc2109aSBarry Smith     ierr = PetscMPIIntCast(N,&NN);CHKERRQ(ierr);
538e5c89e4eSSatish Balay 
539e5c89e4eSSatish Balay     if (size > 1) {
540e5c89e4eSSatish Balay       if (rank) {
541e5c89e4eSSatish Balay         ierr = MPI_Gather(&NN,1,MPI_INT,0,0,MPI_INT,0,comm);CHKERRQ(ierr);
5421d36abb7SJed Brown         ierr = MPI_Gatherv((PetscReal*)idx,NN,MPIU_REAL,0,0,0,MPIU_REAL,0,comm);CHKERRQ(ierr);
543e5c89e4eSSatish Balay       } else {
544785e854fSJed Brown         ierr      = PetscMalloc1(size,&sizes);CHKERRQ(ierr);
545e5c89e4eSSatish Balay         ierr      = MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm);CHKERRQ(ierr);
546e5c89e4eSSatish Balay         Ntotal    = sizes[0];
547785e854fSJed Brown         ierr      = PetscMalloc1(size,&displs);CHKERRQ(ierr);
548e5c89e4eSSatish Balay         displs[0] = 0;
549e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
550e5c89e4eSSatish Balay           Ntotal   += sizes[i];
551e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
552e5c89e4eSSatish Balay         }
553785e854fSJed Brown         ierr = PetscMalloc1(Ntotal,&array);CHKERRQ(ierr);
5541d36abb7SJed Brown         ierr = MPI_Gatherv((PetscReal*)idx,NN,MPIU_REAL,array,sizes,displs,MPIU_REAL,0,comm);CHKERRQ(ierr);
5556805f65bSBarry Smith         ierr = PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_REAL,PETSC_TRUE);CHKERRQ(ierr);
556e5c89e4eSSatish Balay         ierr = PetscFree(sizes);CHKERRQ(ierr);
557e5c89e4eSSatish Balay         ierr = PetscFree(displs);CHKERRQ(ierr);
558e5c89e4eSSatish Balay         ierr = PetscFree(array);CHKERRQ(ierr);
559e5c89e4eSSatish Balay       }
560e5c89e4eSSatish Balay     } else {
56147b06e05SMatthew Knepley       ierr = PetscViewerBinaryWrite(viewer,(void*) idx,N,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
562e5c89e4eSSatish Balay     }
563e5c89e4eSSatish Balay   } else {
564e5c89e4eSSatish Balay     const char *tname;
565e5c89e4eSSatish Balay     ierr = PetscObjectGetName((PetscObject)viewer,&tname);CHKERRQ(ierr);
566e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
567e5c89e4eSSatish Balay   }
568e5c89e4eSSatish Balay   PetscFunctionReturn(0);
569e5c89e4eSSatish Balay }
570e5c89e4eSSatish Balay 
571e5c89e4eSSatish Balay /*@C
572e5c89e4eSSatish Balay     PetscScalarView - Prints an array of scalars; useful for debugging.
573e5c89e4eSSatish Balay 
574e5c89e4eSSatish Balay     Collective on PetscViewer
575e5c89e4eSSatish Balay 
576e5c89e4eSSatish Balay     Input Parameters:
577e5c89e4eSSatish Balay +   N - number of scalars in array
578e5c89e4eSSatish Balay .   idx - array of scalars
579e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
580e5c89e4eSSatish Balay 
581e5c89e4eSSatish Balay   Level: intermediate
582e5c89e4eSSatish Balay 
58395452b02SPatrick Sanan     Developer Notes:
58495452b02SPatrick Sanan     idx cannot be const because may be passed to binary viewer where byte swapping is done
585300a7f5bSBarry Smith 
586e5c89e4eSSatish Balay .seealso: PetscIntView(), PetscRealView()
587e5c89e4eSSatish Balay @*/
5887087cfbeSBarry Smith PetscErrorCode  PetscScalarView(PetscInt N,const PetscScalar idx[],PetscViewer viewer)
589e5c89e4eSSatish Balay {
590e5c89e4eSSatish Balay   PetscErrorCode ierr;
591*ca0c3be5SJacob Faibussowitsch   PetscMPIInt	 rank,size;
592e5c89e4eSSatish Balay   PetscInt       j,i,n = N/3,p = N % 3;
593ace3abfcSBarry Smith   PetscBool      iascii,isbinary;
594e5c89e4eSSatish Balay   MPI_Comm       comm;
595e5c89e4eSSatish Balay 
596e5c89e4eSSatish Balay   PetscFunctionBegin;
597e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
598e5c89e4eSSatish Balay   PetscValidHeader(viewer,3);
5998c34849bSStefano Zampini   if (N) PetscValidScalarPointer(idx,2);
600e5c89e4eSSatish Balay   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
601*ca0c3be5SJacob Faibussowitsch   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
602*ca0c3be5SJacob Faibussowitsch   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
603e5c89e4eSSatish Balay 
604251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
605251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
606e5c89e4eSSatish Balay   if (iascii) {
6071575c14dSBarry Smith     ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
608e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
609*ca0c3be5SJacob Faibussowitsch       if (size > 1) {
610*ca0c3be5SJacob Faibussowitsch         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2d:",rank ,3*i);CHKERRQ(ierr);
611*ca0c3be5SJacob Faibussowitsch       } else {
612e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",3*i);CHKERRQ(ierr);
613*ca0c3be5SJacob Faibussowitsch       }
614e5c89e4eSSatish Balay       for (j=0; j<3; j++) {
615e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
616cba51d77SBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer," (%12.4e,%12.4e)", (double)PetscRealPart(idx[i*3+j]),(double)PetscImaginaryPart(idx[i*3+j]));CHKERRQ(ierr);
617e5c89e4eSSatish Balay #else
618cba51d77SBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[i*3+j]);CHKERRQ(ierr);
619e5c89e4eSSatish Balay #endif
620e5c89e4eSSatish Balay       }
621e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
622e5c89e4eSSatish Balay     }
623e5c89e4eSSatish Balay     if (p) {
624*ca0c3be5SJacob Faibussowitsch       if (size > 1) {
625*ca0c3be5SJacob Faibussowitsch         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2d:",rank ,3*n);CHKERRQ(ierr);
626*ca0c3be5SJacob Faibussowitsch       } else {
627e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",3*n);CHKERRQ(ierr);
628*ca0c3be5SJacob Faibussowitsch       }
629e5c89e4eSSatish Balay       for (i=0; i<p; i++) {
630e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
631cba51d77SBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer," (%12.4e,%12.4e)", (double)PetscRealPart(idx[n*3+i]),(double)PetscImaginaryPart(idx[n*3+i]));CHKERRQ(ierr);
632e5c89e4eSSatish Balay #else
633cba51d77SBarry Smith         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[3*n+i]);CHKERRQ(ierr);
634e5c89e4eSSatish Balay #endif
635e5c89e4eSSatish Balay       }
636e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
637e5c89e4eSSatish Balay     }
638e5c89e4eSSatish Balay     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
6391575c14dSBarry Smith     ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
6406805f65bSBarry Smith   } else if (isbinary) {
641*ca0c3be5SJacob Faibussowitsch     PetscMPIInt *sizes,Ntotal,*displs,NN;
642e5c89e4eSSatish Balay     PetscScalar *array;
643e5c89e4eSSatish Balay 
6444dc2109aSBarry Smith     ierr = PetscMPIIntCast(N,&NN);CHKERRQ(ierr);
645e5c89e4eSSatish Balay 
646e5c89e4eSSatish Balay     if (size > 1) {
647e5c89e4eSSatish Balay       if (rank) {
648e5c89e4eSSatish Balay         ierr = MPI_Gather(&NN,1,MPI_INT,0,0,MPI_INT,0,comm);CHKERRQ(ierr);
649300a7f5bSBarry Smith         ierr = MPI_Gatherv((void*)idx,NN,MPIU_SCALAR,0,0,0,MPIU_SCALAR,0,comm);CHKERRQ(ierr);
650e5c89e4eSSatish Balay       } else {
651785e854fSJed Brown         ierr      = PetscMalloc1(size,&sizes);CHKERRQ(ierr);
652e5c89e4eSSatish Balay         ierr      = MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm);CHKERRQ(ierr);
653e5c89e4eSSatish Balay         Ntotal    = sizes[0];
654785e854fSJed Brown         ierr      = PetscMalloc1(size,&displs);CHKERRQ(ierr);
655e5c89e4eSSatish Balay         displs[0] = 0;
656e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
657e5c89e4eSSatish Balay           Ntotal   += sizes[i];
658e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
659e5c89e4eSSatish Balay         }
660785e854fSJed Brown         ierr = PetscMalloc1(Ntotal,&array);CHKERRQ(ierr);
661300a7f5bSBarry Smith         ierr = MPI_Gatherv((void*)idx,NN,MPIU_SCALAR,array,sizes,displs,MPIU_SCALAR,0,comm);CHKERRQ(ierr);
6626805f65bSBarry Smith         ierr = PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_SCALAR,PETSC_TRUE);CHKERRQ(ierr);
663e5c89e4eSSatish Balay         ierr = PetscFree(sizes);CHKERRQ(ierr);
664e5c89e4eSSatish Balay         ierr = PetscFree(displs);CHKERRQ(ierr);
665e5c89e4eSSatish Balay         ierr = PetscFree(array);CHKERRQ(ierr);
666e5c89e4eSSatish Balay       }
667e5c89e4eSSatish Balay     } else {
66847b06e05SMatthew Knepley       ierr = PetscViewerBinaryWrite(viewer,(void*) idx,N,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
669e5c89e4eSSatish Balay     }
670e5c89e4eSSatish Balay   } else {
671e5c89e4eSSatish Balay     const char *tname;
672e5c89e4eSSatish Balay     ierr = PetscObjectGetName((PetscObject)viewer,&tname);CHKERRQ(ierr);
673e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
674e5c89e4eSSatish Balay   }
675e5c89e4eSSatish Balay   PetscFunctionReturn(0);
676e5c89e4eSSatish Balay }
677e5c89e4eSSatish Balay 
678e5c89e4eSSatish Balay 
679e5c89e4eSSatish Balay 
680e5c89e4eSSatish Balay 
681