xref: /petsc/src/sys/error/err.c (revision 1cbcd9c41d26426b9e0594c714fd92552a02df39)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay       Code that allows one to set the error handlers
4e5c89e4eSSatish Balay */
5e5c89e4eSSatish Balay #include "petsc.h"           /*I "petsc.h" I*/
6e5c89e4eSSatish Balay #include "petscsys.h"
7e5c89e4eSSatish Balay #include <stdarg.h>
8e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H)
9e5c89e4eSSatish Balay #include <stdlib.h>
10e5c89e4eSSatish Balay #endif
11e5c89e4eSSatish Balay 
12e5c89e4eSSatish Balay typedef struct _EH *EH;
13e5c89e4eSSatish Balay struct _EH {
14e5c89e4eSSatish Balay   int            cookie;
15e5c89e4eSSatish Balay   PetscErrorCode (*handler)(int,const char*,const char*,const char *,PetscErrorCode,int,const char*,void *);
16e5c89e4eSSatish Balay   void           *ctx;
17e5c89e4eSSatish Balay   EH             previous;
18e5c89e4eSSatish Balay };
19e5c89e4eSSatish Balay 
20e5c89e4eSSatish Balay static EH eh = 0;
21e5c89e4eSSatish Balay 
22e5c89e4eSSatish Balay #undef __FUNCT__
23e5c89e4eSSatish Balay #define __FUNCT__ "PetscEmacsClientErrorHandler"
24e5c89e4eSSatish Balay /*@C
25e5c89e4eSSatish Balay    PetscEmacsClientErrorHandler - Error handler that uses the emacsclient program to
26e5c89e4eSSatish Balay     load the file where the error occured. Then calls the "previous" error handler.
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay    Not Collective
29e5c89e4eSSatish Balay 
30e5c89e4eSSatish Balay    Input Parameters:
31e5c89e4eSSatish Balay +  line - the line number of the error (indicated by __LINE__)
32e5c89e4eSSatish Balay .  func - the function where error is detected (indicated by __FUNCT__)
33e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
34e5c89e4eSSatish Balay .  dir - the directory of the file (indicated by __SDIR__)
35e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
36e5c89e4eSSatish Balay .  n - the generic error number
37e5c89e4eSSatish Balay .  p - specific error number
38e5c89e4eSSatish Balay -  ctx - error handler context
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay    Options Database Key:
41e5c89e4eSSatish Balay .   -on_error_emacs <machinename>
42e5c89e4eSSatish Balay 
43e5c89e4eSSatish Balay    Level: developer
44e5c89e4eSSatish Balay 
45e5c89e4eSSatish Balay    Notes:
46e5c89e4eSSatish Balay    You must put (server-start) in your .emacs file for the emacsclient software to work
47e5c89e4eSSatish Balay 
48e5c89e4eSSatish Balay    Most users need not directly employ this routine and the other error
49e5c89e4eSSatish Balay    handlers, but can instead use the simplified interface SETERRQ, which has
50e5c89e4eSSatish Balay    the calling sequence
51e5c89e4eSSatish Balay $     SETERRQ(number,p,mess)
52e5c89e4eSSatish Balay 
53e5c89e4eSSatish Balay    Notes for experienced users:
54e93bc3c1Svictor    Use PetscPushErrorHandler() to set the desired error handler.
55e5c89e4eSSatish Balay 
56e5c89e4eSSatish Balay    Concepts: emacs^going to on error
57e5c89e4eSSatish Balay    Concepts: error handler^going to line in emacs
58e5c89e4eSSatish Balay 
59e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
60e5c89e4eSSatish Balay           PetscAbortErrorHandler()
61e5c89e4eSSatish Balay  @*/
62e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscEmacsClientErrorHandler(int line,const char *fun,const char* file,const char *dir,PetscErrorCode n,int p,const char *mess,void *ctx)
63e5c89e4eSSatish Balay {
64e5c89e4eSSatish Balay   PetscErrorCode ierr;
65e5c89e4eSSatish Balay   char        command[PETSC_MAX_PATH_LEN];
66e5c89e4eSSatish Balay   const char  *pdir;
67e5c89e4eSSatish Balay   FILE        *fp;
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay   PetscFunctionBegin;
70e5c89e4eSSatish Balay   /* Note: don't check error codes since this an error handler :-) */
71e5c89e4eSSatish Balay   ierr = PetscGetPetscDir(&pdir);CHKERRQ(ierr);
72e5c89e4eSSatish Balay   sprintf(command,"emacsclient +%d %s/%s%s\n",line,pdir,dir,file);
73e5c89e4eSSatish Balay #if defined(PETSC_HAVE_POPEN)
74e5c89e4eSSatish Balay   ierr = PetscPOpen(MPI_COMM_WORLD,(char*)ctx,command,"r",&fp);
75e5c89e4eSSatish Balay   ierr = PetscPClose(MPI_COMM_WORLD,fp);
76e5c89e4eSSatish Balay #else
77e5c89e4eSSatish Balay   SETERRQ(PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine");
78e5c89e4eSSatish Balay #endif
79e5c89e4eSSatish Balay   ierr = PetscPopErrorHandler(); /* remove this handler from the stack of handlers */
80e5c89e4eSSatish Balay   if (!eh)     ierr = PetscTraceBackErrorHandler(line,fun,file,dir,n,p,mess,0);
81e5c89e4eSSatish Balay   else         ierr = (*eh->handler)(line,fun,file,dir,n,p,mess,eh->ctx);
82e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
83e5c89e4eSSatish Balay }
84e5c89e4eSSatish Balay 
85e5c89e4eSSatish Balay #undef __FUNCT__
86e5c89e4eSSatish Balay #define __FUNCT__ "PetscPushErrorHandler"
87e5c89e4eSSatish Balay /*@C
88e5c89e4eSSatish Balay    PetscPushErrorHandler - Sets a routine to be called on detection of errors.
89e5c89e4eSSatish Balay 
90e5c89e4eSSatish Balay    Not Collective
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay    Input Parameters:
93e5c89e4eSSatish Balay +  handler - error handler routine
94e5c89e4eSSatish Balay -  ctx - optional handler context that contains information needed by the handler (for
95e5c89e4eSSatish Balay          example file pointers for error messages etc.)
96e5c89e4eSSatish Balay 
97e5c89e4eSSatish Balay    Calling sequence of handler:
98e5c89e4eSSatish Balay $    int handler(int line,char *func,char *file,char *dir,PetscErrorCode n,int p,char *mess,void *ctx);
99e5c89e4eSSatish Balay 
100e5c89e4eSSatish Balay +  func - the function where the error occured (indicated by __FUNCT__)
101e5c89e4eSSatish Balay .  line - the line number of the error (indicated by __LINE__)
102e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
103e5c89e4eSSatish Balay .  dir - the directory of the file (indicated by __SDIR__)
104e5c89e4eSSatish Balay .  n - the generic error number (see list defined in include/petscerror.h)
105e5c89e4eSSatish Balay .  p - the specific error number
106e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
107e5c89e4eSSatish Balay -  ctx - the error handler context
108e5c89e4eSSatish Balay 
109e5c89e4eSSatish Balay    Options Database Keys:
110e5c89e4eSSatish Balay +   -on_error_attach_debugger <noxterm,gdb or dbx>
111e5c89e4eSSatish Balay -   -on_error_abort
112e5c89e4eSSatish Balay 
113e5c89e4eSSatish Balay    Level: intermediate
114e5c89e4eSSatish Balay 
115e93bc3c1Svictor    Notes:
116e93bc3c1Svictor    The
117e93bc3c1Svictor    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
118e8fb0fc0SBarry Smith    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscMPIAbortErrorHandler(), PetscReturnErrorHandler().
119e93bc3c1Svictor 
120e5c89e4eSSatish Balay .seealso: PetscPopErrorHandler(), PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), PetscTraceBackErrorHandler()
121e5c89e4eSSatish Balay 
122e5c89e4eSSatish Balay @*/
123e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscPushErrorHandler(PetscErrorCode (*handler)(int,const char *,const char*,const char*,PetscErrorCode,int,const char*,void*),void *ctx)
124e5c89e4eSSatish Balay {
125e5c89e4eSSatish Balay   EH  neweh;
126e5c89e4eSSatish Balay   PetscErrorCode ierr;
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay   PetscFunctionBegin;
129e5c89e4eSSatish Balay   ierr = PetscNew(struct _EH,&neweh);CHKERRQ(ierr);
130e5c89e4eSSatish Balay   if (eh) {neweh->previous = eh;}
131e5c89e4eSSatish Balay   else    {neweh->previous = 0;}
132e5c89e4eSSatish Balay   neweh->handler = handler;
133e5c89e4eSSatish Balay   neweh->ctx     = ctx;
134e5c89e4eSSatish Balay   eh             = neweh;
135e5c89e4eSSatish Balay   PetscFunctionReturn(0);
136e5c89e4eSSatish Balay }
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay #undef __FUNCT__
139e5c89e4eSSatish Balay #define __FUNCT__ "PetscPopErrorHandler"
140e30d2299SSatish Balay /*@
141e5c89e4eSSatish Balay    PetscPopErrorHandler - Removes the latest error handler that was
142e5c89e4eSSatish Balay    pushed with PetscPushErrorHandler().
143e5c89e4eSSatish Balay 
144e5c89e4eSSatish Balay    Not Collective
145e5c89e4eSSatish Balay 
146e5c89e4eSSatish Balay    Level: intermediate
147e5c89e4eSSatish Balay 
148e5c89e4eSSatish Balay    Concepts: error handler^setting
149e5c89e4eSSatish Balay 
150e5c89e4eSSatish Balay .seealso: PetscPushErrorHandler()
151e5c89e4eSSatish Balay @*/
152e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscPopErrorHandler(void)
153e5c89e4eSSatish Balay {
154e5c89e4eSSatish Balay   EH  tmp;
155e5c89e4eSSatish Balay   PetscErrorCode ierr;
156e5c89e4eSSatish Balay 
157e5c89e4eSSatish Balay   PetscFunctionBegin;
158e5c89e4eSSatish Balay   if (!eh) PetscFunctionReturn(0);
159e5c89e4eSSatish Balay   tmp  = eh;
160e5c89e4eSSatish Balay   eh   = eh->previous;
161e5c89e4eSSatish Balay   ierr = PetscFree(tmp);CHKERRQ(ierr);
162e5c89e4eSSatish Balay 
163e5c89e4eSSatish Balay   PetscFunctionReturn(0);
164e5c89e4eSSatish Balay }
165e5c89e4eSSatish Balay 
166e93bc3c1Svictor #undef __FUNCT__
167e93bc3c1Svictor #define __FUNCT__ "PetscReturnErrorHandler"
168e93bc3c1Svictor /*@C
169e93bc3c1Svictor   PetscReturnErrorHandler - Error handler that causes a return to the current
170e93bc3c1Svictor   level.
171e93bc3c1Svictor 
172e93bc3c1Svictor    Not Collective
173e93bc3c1Svictor 
174e93bc3c1Svictor    Input Parameters:
175e93bc3c1Svictor +  line - the line number of the error (indicated by __LINE__)
176e93bc3c1Svictor .  func - the function where error is detected (indicated by __FUNCT__)
177e93bc3c1Svictor .  file - the file in which the error was detected (indicated by __FILE__)
178e93bc3c1Svictor .  dir - the directory of the file (indicated by __SDIR__)
179e93bc3c1Svictor .  mess - an error text string, usually just printed to the screen
180e93bc3c1Svictor .  n - the generic error number
181e93bc3c1Svictor .  p - specific error number
182e93bc3c1Svictor -  ctx - error handler context
183e93bc3c1Svictor 
184e93bc3c1Svictor    Level: developer
185e93bc3c1Svictor 
186e93bc3c1Svictor    Notes:
187e93bc3c1Svictor    Most users need not directly employ this routine and the other error
188e93bc3c1Svictor    handlers, but can instead use the simplified interface SETERRQ, which has
189e93bc3c1Svictor    the calling sequence
190e93bc3c1Svictor $     SETERRQ(number,p,mess)
191e93bc3c1Svictor 
192e93bc3c1Svictor    Notes for experienced users:
193e93bc3c1Svictor    This routine is good for catching errors such as zero pivots in preconditioners
194e93bc3c1Svictor    or breakdown of iterative methods. It is not appropriate for memory violations
195e93bc3c1Svictor    and similar errors.
196e93bc3c1Svictor 
197e93bc3c1Svictor    Use PetscPushErrorHandler() to set the desired error handler.  The
198e93bc3c1Svictor    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
199e8fb0fc0SBarry Smith    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscAbortErrorHandler()
200e93bc3c1Svictor 
201e93bc3c1Svictor    Concepts: error handler
202e93bc3c1Svictor 
203e93bc3c1Svictor .seealso:  PetscPushErrorHandler(), PetscPopErrorHandler().
204e93bc3c1Svictor  @*/
205e93bc3c1Svictor 
206e93bc3c1Svictor PetscErrorCode PETSC_DLLEXPORT PetscReturnErrorHandler(int line,const char *fun,const char* file,const char *dir,PetscErrorCode n,int p,const char *mess,void *ctx)
207e93bc3c1Svictor {
208e93bc3c1Svictor   PetscFunctionBegin;
209e93bc3c1Svictor   PetscFunctionReturn(n);
210e93bc3c1Svictor }
211e93bc3c1Svictor 
212e5c89e4eSSatish Balay static char PetscErrorBaseMessage[1024];
213e5c89e4eSSatish Balay /*
214e5c89e4eSSatish Balay        The numerical values for these are defined in include/petscerror.h; any changes
215e5c89e4eSSatish Balay    there must also be made here
216e5c89e4eSSatish Balay */
217e5c89e4eSSatish Balay static const char *PetscErrorStrings[] = {
218e5c89e4eSSatish Balay   /*55 */ "Out of memory",
219e5c89e4eSSatish Balay           "No support for this operation for this object type",
220e5c89e4eSSatish Balay           "No support for this operation on this system",
221e5c89e4eSSatish Balay   /*58 */ "Operation done in wrong order",
222e5c89e4eSSatish Balay   /*59 */ "Signal received",
223e5c89e4eSSatish Balay   /*60 */ "Nonconforming object sizes",
224e5c89e4eSSatish Balay           "Argument aliasing not permitted",
225e5c89e4eSSatish Balay           "Invalid argument",
226e5c89e4eSSatish Balay   /*63 */ "Argument out of range",
227e5c89e4eSSatish Balay           "Corrupt argument: see http://www.mcs.anl.gov/petsc/petsc-as/documentation/troubleshooting.html#Corrupt",
228e5c89e4eSSatish Balay           "Unable to open file",
229e5c89e4eSSatish Balay           "Read from file failed",
230e5c89e4eSSatish Balay           "Write to file failed",
231e5c89e4eSSatish Balay           "Invalid pointer",
232e5c89e4eSSatish Balay   /*69 */ "Arguments must have same type",
233e5c89e4eSSatish Balay           "",
234e5c89e4eSSatish Balay   /*71 */ "Detected zero pivot in LU factorization\nsee http://www.mcs.anl.gov/petsc/petsc-as/documentation/troubleshooting.html#ZeroPivot",
235e5c89e4eSSatish Balay   /*72 */ "Floating point exception",
236e5c89e4eSSatish Balay   /*73 */ "Object is in wrong state",
237e5c89e4eSSatish Balay           "Corrupted Petsc object",
238e5c89e4eSSatish Balay           "Arguments are incompatible",
239e5c89e4eSSatish Balay           "Error in external library",
240e5c89e4eSSatish Balay   /*77 */ "Petsc has generated inconsistent data",
241e5c89e4eSSatish Balay           "Memory corruption",
242e5c89e4eSSatish Balay           "Unexpected data in file",
243e5c89e4eSSatish Balay   /*80 */ "Arguments must have same communicators",
244e5c89e4eSSatish Balay   /*81 */ "Detected zero pivot in Cholesky factorization\nsee http://www.mcs.anl.gov/petsc/petsc-as/documentation/troubleshooting.html#ZeroPivot",
245e5c89e4eSSatish Balay           "  ",
246e5c89e4eSSatish Balay           "  ",
247e5c89e4eSSatish Balay           "  ",
248e5c89e4eSSatish Balay   /*85 */ "Null argument, when expecting valid pointer",
249e5c89e4eSSatish Balay   /*86 */ "Unknown type. Check for miss-spelling or missing external package needed for type"};
250e5c89e4eSSatish Balay 
251e5c89e4eSSatish Balay #undef __FUNCT__
252e5c89e4eSSatish Balay #define __FUNCT__ "PetscErrorMessage"
253e5c89e4eSSatish Balay /*@C
254e5c89e4eSSatish Balay    PetscErrorMessage - returns the text string associated with a PETSc error code.
255e5c89e4eSSatish Balay 
256e5c89e4eSSatish Balay    Not Collective
257e5c89e4eSSatish Balay 
258e5c89e4eSSatish Balay    Input Parameter:
259e5c89e4eSSatish Balay .   errnum - the error code
260e5c89e4eSSatish Balay 
261e5c89e4eSSatish Balay    Output Parameter:
262e5c89e4eSSatish Balay +  text - the error message (PETSC_NULL if not desired)
263e5c89e4eSSatish Balay -  specific - the specific error message that was set with SETERRxxx() or PetscError().  (PETSC_NULL if not desired)
264e5c89e4eSSatish Balay 
265e5c89e4eSSatish Balay    Level: developer
266e5c89e4eSSatish Balay 
267e5c89e4eSSatish Balay    Concepts: error handler^messages
268e5c89e4eSSatish Balay 
269e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
270e5c89e4eSSatish Balay           PetscAbortErrorHandler(), PetscTraceBackErrorHandler()
271e5c89e4eSSatish Balay  @*/
272e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscErrorMessage(int errnum,const char *text[],char **specific)
273e5c89e4eSSatish Balay {
274e5c89e4eSSatish Balay   PetscFunctionBegin;
2752a6744ebSBarry Smith   if (text && errnum > PETSC_ERR_MIN_VALUE && errnum < PETSC_ERR_MAX_VALUE) {
276c2f951e6SSatish Balay     *text = PetscErrorStrings[errnum-PETSC_ERR_MIN_VALUE-1];
277e5c89e4eSSatish Balay   } else if (text) *text = 0;
278e5c89e4eSSatish Balay 
279e5c89e4eSSatish Balay   if (specific) {
280e5c89e4eSSatish Balay     *specific = PetscErrorBaseMessage;
281e5c89e4eSSatish Balay   }
282e5c89e4eSSatish Balay   PetscFunctionReturn(0);
283e5c89e4eSSatish Balay }
284e5c89e4eSSatish Balay 
285e5c89e4eSSatish Balay #if defined(PETSC_USE_ERRORCHECKING)
286e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscErrorUncatchable[PETSC_EXCEPTIONS_MAX] = {0};
287e5c89e4eSSatish Balay PetscInt       PETSC_DLLEXPORT PetscErrorUncatchableCount                  = 0;
288e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscExceptions[PETSC_EXCEPTIONS_MAX]       = {0};
289e5c89e4eSSatish Balay PetscInt       PETSC_DLLEXPORT PetscExceptionsCount                        = 0;
290e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscExceptionTmp                           = 0;
2917b0215c6SHong Zhang PetscErrorCode PETSC_DLLEXPORT PetscExceptionTmp1                          = 0;
292e5c89e4eSSatish Balay 
293e5c89e4eSSatish Balay #undef __FUNCT__
294e5c89e4eSSatish Balay #define __FUNCT__ "PetscErrorIsCatchable"
29521dd7e22SBarry Smith /*@C
29621dd7e22SBarry Smith       PetscErrorIsCatchable - Returns if a PetscErrorCode can be caught with a PetscExceptionTry1() or
29721dd7e22SBarry Smith            PetscExceptionPush()
29821dd7e22SBarry Smith 
29921dd7e22SBarry Smith   Input Parameters:
30021dd7e22SBarry Smith .   err - error code
30121dd7e22SBarry Smith 
30221dd7e22SBarry Smith   Level: advanced
30321dd7e22SBarry Smith 
30421dd7e22SBarry Smith    Notes:
30521dd7e22SBarry Smith     PETSc must not be configured using the option --with-errorchecking=0 for this to work
30621dd7e22SBarry Smith 
30721dd7e22SBarry Smith .seealso: PetscExceptionTry1(), PetscExceptionCaught(), PetscExceptionPush(), PetscExceptionPop(), PetscErrorSetCatchable()
30821dd7e22SBarry Smith @*/
30921dd7e22SBarry Smith PetscTruth PETSC_DLLEXPORT PetscErrorIsCatchable(PetscErrorCode err)
310e5c89e4eSSatish Balay {
311e5c89e4eSSatish Balay   PetscInt i;
312e5c89e4eSSatish Balay   for (i=0; i<PetscErrorUncatchableCount; i++) {
313e5c89e4eSSatish Balay     if (err == PetscErrorUncatchable[i]) return PETSC_FALSE;
314e5c89e4eSSatish Balay   }
315e5c89e4eSSatish Balay   return PETSC_TRUE;
316e5c89e4eSSatish Balay }
317e5c89e4eSSatish Balay 
318e5c89e4eSSatish Balay #undef __FUNCT__
319e5c89e4eSSatish Balay #define __FUNCT__ "PetscErrorSetCatchable"
320e5c89e4eSSatish Balay /*@
321e5c89e4eSSatish Balay       PetscErrorSetCatchable - Sets if a PetscErrorCode can be caught with a PetscExceptionTry1()
32221dd7e22SBarry Smith     PetscExceptionCaught() pair, or PetscExceptionPush(). By default all errors are catchable.
323e5c89e4eSSatish Balay 
324e5c89e4eSSatish Balay   Input Parameters:
325e5c89e4eSSatish Balay +   err - error code
326e5c89e4eSSatish Balay -   flg - PETSC_TRUE means allow to be caught, PETSC_FALSE means do not allow to be caught
327e5c89e4eSSatish Balay 
328e5c89e4eSSatish Balay   Level: advanced
329e5c89e4eSSatish Balay 
330e5c89e4eSSatish Balay    Notes:
331e5c89e4eSSatish Balay     PETSc must not be configured using the option --with-errorchecking=0 for this to work
332e5c89e4eSSatish Balay 
33321dd7e22SBarry Smith .seealso: PetscExceptionTry1(), PetscExceptionCaught(), PetscExceptionPush(), PetscExceptionPop(), PetscErrorIsCatchable()
334e5c89e4eSSatish Balay @*/
335e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscErrorSetCatchable(PetscErrorCode err,PetscTruth flg)
336e5c89e4eSSatish Balay {
337e5c89e4eSSatish Balay   PetscFunctionBegin;
338e5c89e4eSSatish Balay   if (!flg && PetscErrorIsCatchable(err)) {
339e5c89e4eSSatish Balay     /* add to list of uncatchable */
3400e5e90baSSatish Balay     if (PetscErrorUncatchableCount >= PETSC_EXCEPTIONS_MAX) SETERRQ(PETSC_ERR_PLIB,"Stack for PetscErrorUncatchable is overflowed, recompile \nsrc/sysd/error/err.c with a larger value for PETSC_EXCEPTIONS_MAX");
341e5c89e4eSSatish Balay     PetscErrorUncatchable[PetscErrorUncatchableCount++] = err;
342e5c89e4eSSatish Balay   } else if (flg && !PetscErrorIsCatchable(err)) {
343e5c89e4eSSatish Balay     /* remove from list of uncatchable */
344e5c89e4eSSatish Balay     PetscInt i;
345e5c89e4eSSatish Balay     for (i=0; i<PetscErrorUncatchableCount; i++) {
346e5c89e4eSSatish Balay       if (PetscErrorUncatchable[i] == err) break;
347e5c89e4eSSatish Balay     }
348e5c89e4eSSatish Balay     for (;i<PetscErrorUncatchableCount; i++) {
349e5c89e4eSSatish Balay       PetscErrorUncatchable[i] = PetscErrorUncatchable[i+1];
350e5c89e4eSSatish Balay     }
351e5c89e4eSSatish Balay     PetscErrorUncatchableCount--;
352e5c89e4eSSatish Balay   }
353e5c89e4eSSatish Balay   PetscFunctionReturn(0);
354e5c89e4eSSatish Balay }
355e5c89e4eSSatish Balay 
356e5c89e4eSSatish Balay #undef __FUNCT__
357e5c89e4eSSatish Balay #define __FUNCT__ "PetscExceptionPush"
35821dd7e22SBarry Smith /*@
35921dd7e22SBarry Smith       PetscExceptionPush - Adds the exception as one to be caught and passed up. If passed up
36021dd7e22SBarry Smith         can be checked with PetscExceptionCaught() or PetscExceptionValue()
36121dd7e22SBarry Smith 
36221dd7e22SBarry Smith   Input Parameters:
36321dd7e22SBarry Smith .   err - the exception to catch
36421dd7e22SBarry Smith 
36521dd7e22SBarry Smith   Level: advanced
36621dd7e22SBarry Smith 
36721dd7e22SBarry Smith    Notes:
36821dd7e22SBarry Smith     PETSc must not be configured using the option --with-errorchecking=0 for this to work
36921dd7e22SBarry Smith 
37021dd7e22SBarry Smith     Use PetscExceptionPop() to remove this as a value to be caught
37121dd7e22SBarry Smith 
37221dd7e22SBarry Smith     This is not usually needed in C/C++ rather use PetscExceptionTry1()
37321dd7e22SBarry Smith 
37421dd7e22SBarry Smith .seealso: PetscExceptionTry1(), PetscExceptionCaught(), PetscExceptionPush(), PetscExceptionPop()
37521dd7e22SBarry Smith @*/
376e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscExceptionPush(PetscErrorCode err)
377e5c89e4eSSatish Balay {
378e5c89e4eSSatish Balay   PetscFunctionBegin;
3790e5e90baSSatish Balay   if (PetscExceptionsCount >= PETSC_EXCEPTIONS_MAX) SETERRQ(PETSC_ERR_PLIB,"Stack for PetscExceptions is overflowed, recompile \nsrc/sysd/error/err.c with a larger value for PETSC_EXCEPTIONS_MAX");
380e5c89e4eSSatish Balay   if (PetscErrorIsCatchable(err)) PetscExceptions[PetscExceptionsCount++] = err;
381e5c89e4eSSatish Balay   PetscFunctionReturn(0);
382e5c89e4eSSatish Balay }
383e5c89e4eSSatish Balay 
384e5c89e4eSSatish Balay #undef __FUNCT__
385e5c89e4eSSatish Balay #define __FUNCT__ "PetscExceptionPop"
38621dd7e22SBarry Smith /*@
38721dd7e22SBarry Smith       PetscExceptionPop - Removes  the most recent exception asked to be caught with PetscExceptionPush()
38821dd7e22SBarry Smith 
38921dd7e22SBarry Smith   Input Parameters:
39021dd7e22SBarry Smith .   err - the exception that was pushed
39121dd7e22SBarry Smith 
39221dd7e22SBarry Smith   Level: advanced
39321dd7e22SBarry Smith 
39421dd7e22SBarry Smith    Notes:
39521dd7e22SBarry Smith     PETSc must not be configured using the option --with-errorchecking=0 for this to work
39621dd7e22SBarry Smith 
39721dd7e22SBarry Smith     This is not usually needed in C/C++ rather use PetscExceptionTry1()
39821dd7e22SBarry Smith 
39921dd7e22SBarry Smith .seealso: PetscExceptionTry1(), PetscExceptionCaught(), PetscExceptionPush(), PetscExceptionPop()
40021dd7e22SBarry Smith @*/
4011853238fSBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscExceptionPop(PetscErrorCode err)
402e5c89e4eSSatish Balay {
4031853238fSBarry Smith   PetscFunctionBegin;
4041853238fSBarry Smith   if (PetscExceptionsCount <= 0)SETERRQ(PETSC_ERR_PLIB,"Stack for PetscExceptions is empty");
405e5c89e4eSSatish Balay   if (PetscErrorIsCatchable(err)) PetscExceptionsCount--;
4061853238fSBarry Smith   PetscFunctionReturn(0);
407e5c89e4eSSatish Balay }
408e5c89e4eSSatish Balay #endif
409e5c89e4eSSatish Balay 
410e5c89e4eSSatish Balay #undef __FUNCT__
411e5c89e4eSSatish Balay #define __FUNCT__ "PetscError"
412e5c89e4eSSatish Balay /*@C
413e5c89e4eSSatish Balay    PetscError - Routine that is called when an error has been detected,
414e5c89e4eSSatish Balay    usually called through the macro SETERRQ().
415e5c89e4eSSatish Balay 
416e5c89e4eSSatish Balay    Not Collective
417e5c89e4eSSatish Balay 
418e5c89e4eSSatish Balay    Input Parameters:
419e5c89e4eSSatish Balay +  line - the line number of the error (indicated by __LINE__)
420e5c89e4eSSatish Balay .  func - the function where the error occured (indicated by __FUNCT__)
421e5c89e4eSSatish Balay .  dir - the directory of file (indicated by __SDIR__)
422e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
423e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
424e5c89e4eSSatish Balay .  n - the generic error number
425e5c89e4eSSatish Balay .  p - 1 indicates the error was initially detected, 0 indicates this is a traceback from a
426e5c89e4eSSatish Balay    previously detected error
427e5c89e4eSSatish Balay -  mess - formatted message string - aka printf
428e5c89e4eSSatish Balay 
429e5c89e4eSSatish Balay   Level: intermediate
430e5c89e4eSSatish Balay 
431e5c89e4eSSatish Balay    Notes:
432e5c89e4eSSatish Balay    Most users need not directly use this routine and the error handlers, but
433e5c89e4eSSatish Balay    can instead use the simplified interface SETERRQ, which has the calling
434e5c89e4eSSatish Balay    sequence
435e5c89e4eSSatish Balay $     SETERRQ(n,mess)
436e5c89e4eSSatish Balay 
437e5c89e4eSSatish Balay    Experienced users can set the error handler with PetscPushErrorHandler().
438e5c89e4eSSatish Balay 
439e5c89e4eSSatish Balay    Concepts: error^setting condition
440e5c89e4eSSatish Balay 
441e5c89e4eSSatish Balay .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), SETERRQ(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
442e5c89e4eSSatish Balay @*/
443e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscError(int line,const char *func,const char* file,const char *dir,PetscErrorCode n,int p,const char *mess,...)
444e5c89e4eSSatish Balay {
445e5c89e4eSSatish Balay   va_list        Argp;
446e5c89e4eSSatish Balay   PetscErrorCode ierr;
447e5c89e4eSSatish Balay   char           buf[2048],*lbuf = 0;
448e5c89e4eSSatish Balay   PetscTruth     ismain,isunknown;
449e5c89e4eSSatish Balay #if defined(PETSC_USE_ERRORCHECKING)
450e5c89e4eSSatish Balay   PetscInt       i;
451e5c89e4eSSatish Balay #endif
452e5c89e4eSSatish Balay 
453e5c89e4eSSatish Balay   if (!func)  func = "User provided function";
454e5c89e4eSSatish Balay   if (!file)  file = "User file";
455e5c89e4eSSatish Balay   if (!dir)   dir = " ";
456e5c89e4eSSatish Balay 
457e5c89e4eSSatish Balay   PetscFunctionBegin;
458e5c89e4eSSatish Balay   /* Compose the message evaluating the print format */
459e5c89e4eSSatish Balay   if (mess) {
460e5c89e4eSSatish Balay     va_start(Argp,mess);
461e5c89e4eSSatish Balay     PetscVSNPrintf(buf,2048,mess,Argp);
462e5c89e4eSSatish Balay     va_end(Argp);
463e5c89e4eSSatish Balay     lbuf = buf;
464e5c89e4eSSatish Balay     if (p == 1) {
465e5c89e4eSSatish Balay       PetscStrncpy(PetscErrorBaseMessage,lbuf,1023);
466e5c89e4eSSatish Balay     }
467e5c89e4eSSatish Balay   }
468e5c89e4eSSatish Balay 
469e5c89e4eSSatish Balay #if defined(PETSC_USE_ERRORCHECKING)
470e5c89e4eSSatish Balay   /* check if user is catching this exception */
471e5c89e4eSSatish Balay   for (i=0; i<PetscExceptionsCount; i++) {
472e5c89e4eSSatish Balay     if (n == PetscExceptions[i])  PetscFunctionReturn(n);
473e5c89e4eSSatish Balay   }
474e5c89e4eSSatish Balay #endif
475e5c89e4eSSatish Balay 
476e5c89e4eSSatish Balay   if (!eh)     ierr = PetscTraceBackErrorHandler(line,func,file,dir,n,p,lbuf,0);
477e5c89e4eSSatish Balay   else         ierr = (*eh->handler)(line,func,file,dir,n,p,lbuf,eh->ctx);
478e5c89e4eSSatish Balay 
479e5c89e4eSSatish Balay   /*
480e5c89e4eSSatish Balay       If this is called from the main() routine we call MPI_Abort() instead of
481e5c89e4eSSatish Balay     return to allow the parallel program to be properly shutdown.
482e5c89e4eSSatish Balay 
483e5c89e4eSSatish Balay     Since this is in the error handler we don't check the errors below. Of course,
484e5c89e4eSSatish Balay     PetscStrncmp() does its own error checking which is problamatic
485e5c89e4eSSatish Balay   */
486e5c89e4eSSatish Balay   PetscStrncmp(func,"main",4,&ismain);
487e5c89e4eSSatish Balay   PetscStrncmp(func,"unknown",7,&isunknown);
488e5c89e4eSSatish Balay   if (ismain || isunknown) {
489e5c89e4eSSatish Balay     MPI_Abort(PETSC_COMM_WORLD,(int)ierr);
490e5c89e4eSSatish Balay   }
491e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
492e5c89e4eSSatish Balay }
493e5c89e4eSSatish Balay 
494fd705b32SMatthew Knepley #ifdef PETSC_CLANGUAGE_CXX
495fd705b32SMatthew Knepley #undef __FUNCT__
496fd705b32SMatthew Knepley #define __FUNCT__ "PetscErrorCxx"
497fd705b32SMatthew Knepley /*@C
498fd705b32SMatthew Knepley    PetscErrorCxx - Routine that is called when an error has been detected,
499fd705b32SMatthew Knepley    usually called through the macro SETERROR().
500fd705b32SMatthew Knepley 
501fd705b32SMatthew Knepley    Not Collective
502fd705b32SMatthew Knepley 
503fd705b32SMatthew Knepley    Input Parameters:
504fd705b32SMatthew Knepley +  line - the line number of the error (indicated by __LINE__)
505fd705b32SMatthew Knepley .  func - the function where the error occured (indicated by __FUNCT__)
506fd705b32SMatthew Knepley .  dir - the directory of file (indicated by __SDIR__)
507fd705b32SMatthew Knepley .  file - the file in which the error was detected (indicated by __FILE__)
508fd705b32SMatthew Knepley .  n - the generic error number
509fd705b32SMatthew Knepley .  p - 1 indicates the error was initially detected, 0 indicates this is a traceback from a
510fd705b32SMatthew Knepley    previously detected error
511fd705b32SMatthew Knepley 
512fd705b32SMatthew Knepley   Level: intermediate
513fd705b32SMatthew Knepley 
514fd705b32SMatthew Knepley    Notes:
515fd705b32SMatthew Knepley    Most users need not directly use this routine and the error handlers, but
516fd705b32SMatthew Knepley    can instead use the simplified interface SETERRQ, which has the calling
517fd705b32SMatthew Knepley    sequence
518fd705b32SMatthew Knepley $     SETERRQ(n,mess)
519fd705b32SMatthew Knepley 
520fd705b32SMatthew Knepley    Experienced users can set the error handler with PetscPushErrorHandler().
521fd705b32SMatthew Knepley 
522fd705b32SMatthew Knepley    Concepts: error^setting condition
523fd705b32SMatthew Knepley 
524fd705b32SMatthew Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), SETERRQ(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
525fd705b32SMatthew Knepley @*/
526fd705b32SMatthew Knepley void PETSC_DLLEXPORT PetscErrorCxx(int line,const char *func,const char* file,const char *dir,PetscErrorCode n,int p)
527fd705b32SMatthew Knepley {
528fd705b32SMatthew Knepley   PetscTruth ismain, isunknown;
529fd705b32SMatthew Knepley #if 0
530fd705b32SMatthew Knepley #if defined(PETSC_USE_ERRORCHECKING)
531fd705b32SMatthew Knepley   PetscInt   i;
532fd705b32SMatthew Knepley #endif
533fd705b32SMatthew Knepley #endif
534fd705b32SMatthew Knepley 
535fd705b32SMatthew Knepley   if (!func) func = "User provided function";
536fd705b32SMatthew Knepley   if (!file) file = "User file";
537fd705b32SMatthew Knepley   if (!dir)  dir  = " ";
538fd705b32SMatthew Knepley 
539fd705b32SMatthew Knepley #if 0
540fd705b32SMatthew Knepley #if defined(PETSC_USE_ERRORCHECKING)
541fd705b32SMatthew Knepley   /* check if user is catching this exception */
542fd705b32SMatthew Knepley   for (i=0; i<PetscExceptionsCount; i++) {
543fd705b32SMatthew Knepley     if (n == PetscExceptions[i])  PetscFunctionReturn(n);
544fd705b32SMatthew Knepley   }
545fd705b32SMatthew Knepley #endif
546fd705b32SMatthew Knepley #endif
547fd705b32SMatthew Knepley 
548fd705b32SMatthew Knepley   std::ostringstream msg;
549fd705b32SMatthew Knepley 
550fd705b32SMatthew Knepley   PetscTraceBackErrorHandlerCxx(line, func, file, dir, n, p, msg);
551fd705b32SMatthew Knepley 
552fd705b32SMatthew Knepley   /*
553fd705b32SMatthew Knepley       If this is called from the main() routine we call MPI_Abort() instead of
554fd705b32SMatthew Knepley     return to allow the parallel program to be properly shutdown.
555fd705b32SMatthew Knepley 
556fd705b32SMatthew Knepley     Since this is in the error handler we don't check the errors below. Of course,
557fd705b32SMatthew Knepley     PetscStrncmp() does its own error checking which is problamatic
558fd705b32SMatthew Knepley   */
559fd705b32SMatthew Knepley   PetscStrncmp(func,"main",4,&ismain);
560fd705b32SMatthew Knepley   PetscStrncmp(func,"unknown",7,&isunknown);
561fd705b32SMatthew Knepley   if (ismain || isunknown) {
562fd705b32SMatthew Knepley     MPI_Abort(PETSC_COMM_WORLD, (int) n);
563fd705b32SMatthew Knepley   }
564f3afd0ebSMatthew Knepley   throw PETSc::Exception(msg.str().c_str());
565fd705b32SMatthew Knepley }
566fd705b32SMatthew Knepley #endif
567fd705b32SMatthew Knepley 
568e5c89e4eSSatish Balay /* -------------------------------------------------------------------------*/
569e5c89e4eSSatish Balay 
570e5c89e4eSSatish Balay #undef __FUNCT__
571e5c89e4eSSatish Balay #define __FUNCT__ "PetscIntView"
572e5c89e4eSSatish Balay /*@C
573e5c89e4eSSatish Balay     PetscIntView - Prints an array of integers; useful for debugging.
574e5c89e4eSSatish Balay 
575e5c89e4eSSatish Balay     Collective on PetscViewer
576e5c89e4eSSatish Balay 
577e5c89e4eSSatish Balay     Input Parameters:
578e5c89e4eSSatish Balay +   N - number of integers in array
579e5c89e4eSSatish Balay .   idx - array of integers
580e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
581e5c89e4eSSatish Balay 
582e5c89e4eSSatish Balay   Level: intermediate
583e5c89e4eSSatish Balay 
584e5c89e4eSSatish Balay .seealso: PetscRealView()
585e5c89e4eSSatish Balay @*/
586e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscIntView(PetscInt N,PetscInt idx[],PetscViewer viewer)
587e5c89e4eSSatish Balay {
588e5c89e4eSSatish Balay   PetscErrorCode ierr;
589e5c89e4eSSatish Balay   PetscInt       j,i,n = N/20,p = N % 20;
5906805f65bSBarry Smith   PetscTruth     iascii,isbinary;
591e5c89e4eSSatish Balay   MPI_Comm       comm;
592e5c89e4eSSatish Balay 
593e5c89e4eSSatish Balay   PetscFunctionBegin;
594e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
595e5c89e4eSSatish Balay   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,3);
596e5c89e4eSSatish Balay   PetscValidIntPointer(idx,2);
597e5c89e4eSSatish Balay   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
598e5c89e4eSSatish Balay 
599e5c89e4eSSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
6006805f65bSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
601e5c89e4eSSatish Balay   if (iascii) {
602e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
603e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D:",20*i);CHKERRQ(ierr);
604e5c89e4eSSatish Balay       for (j=0; j<20; j++) {
605e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %D",idx[i*20+j]);CHKERRQ(ierr);
606e5c89e4eSSatish Balay       }
607e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
608e5c89e4eSSatish Balay     }
609e5c89e4eSSatish Balay     if (p) {
610e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%D:",20*n);CHKERRQ(ierr);
611e5c89e4eSSatish Balay       for (i=0; i<p; i++) { ierr = PetscViewerASCIISynchronizedPrintf(viewer," %D",idx[20*n+i]);CHKERRQ(ierr);}
612e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
613e5c89e4eSSatish Balay     }
614e5c89e4eSSatish Balay     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
6156805f65bSBarry Smith   } else if (isbinary) {
616*1cbcd9c4SBarry Smith     PetscMPIInt rank,size,*sizes,Ntotal,*displs, NN = PetscMPIIntCast(N);
617e5c89e4eSSatish Balay     PetscInt    *array;
618e5c89e4eSSatish Balay     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
619e5c89e4eSSatish Balay     ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
620e5c89e4eSSatish Balay 
621e5c89e4eSSatish Balay     if (size > 1) {
622e5c89e4eSSatish Balay       if (rank) {
623e5c89e4eSSatish Balay         ierr = MPI_Gather(&NN,1,MPI_INT,0,0,MPI_INT,0,comm);CHKERRQ(ierr);
624e5c89e4eSSatish Balay         ierr = MPI_Gatherv(idx,NN,MPIU_INT,0,0,0,MPIU_INT,0,comm);CHKERRQ(ierr);
625e5c89e4eSSatish Balay       } else {
626e5c89e4eSSatish Balay 	ierr      = PetscMalloc(size*sizeof(PetscMPIInt),&sizes);CHKERRQ(ierr);
627e5c89e4eSSatish Balay         ierr      = MPI_Gather(&NN,1,MPI_INT,sizes,1,MPIU_INT,0,comm);CHKERRQ(ierr);
628e5c89e4eSSatish Balay         Ntotal    = sizes[0];
629e5c89e4eSSatish Balay 	ierr      = PetscMalloc(size*sizeof(PetscMPIInt),&displs);CHKERRQ(ierr);
630e5c89e4eSSatish Balay         displs[0] = 0;
631e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
632e5c89e4eSSatish Balay           Ntotal    += sizes[i];
633e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
634e5c89e4eSSatish Balay         }
635e5c89e4eSSatish Balay 	ierr = PetscMalloc(Ntotal*sizeof(PetscInt),&array);CHKERRQ(ierr);
636e5c89e4eSSatish Balay         ierr = MPI_Gatherv(idx,NN,MPIU_INT,array,sizes,displs,MPIU_INT,0,comm);CHKERRQ(ierr);
6376805f65bSBarry Smith         ierr = PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
638e5c89e4eSSatish Balay         ierr = PetscFree(sizes);CHKERRQ(ierr);
639e5c89e4eSSatish Balay         ierr = PetscFree(displs);CHKERRQ(ierr);
640e5c89e4eSSatish Balay         ierr = PetscFree(array);CHKERRQ(ierr);
641e5c89e4eSSatish Balay       }
642e5c89e4eSSatish Balay     } else {
6436805f65bSBarry Smith       ierr = PetscViewerBinaryWrite(viewer,idx,N,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
644e5c89e4eSSatish Balay     }
645e5c89e4eSSatish Balay   } else {
646e5c89e4eSSatish Balay     const char *tname;
647e5c89e4eSSatish Balay     ierr = PetscObjectGetName((PetscObject)viewer,&tname);CHKERRQ(ierr);
648e5c89e4eSSatish Balay     SETERRQ1(PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
649e5c89e4eSSatish Balay   }
650e5c89e4eSSatish Balay   PetscFunctionReturn(0);
651e5c89e4eSSatish Balay }
652e5c89e4eSSatish Balay 
653e5c89e4eSSatish Balay #undef __FUNCT__
654e5c89e4eSSatish Balay #define __FUNCT__ "PetscRealView"
655e5c89e4eSSatish Balay /*@C
656e5c89e4eSSatish Balay     PetscRealView - Prints an array of doubles; useful for debugging.
657e5c89e4eSSatish Balay 
658e5c89e4eSSatish Balay     Collective on PetscViewer
659e5c89e4eSSatish Balay 
660e5c89e4eSSatish Balay     Input Parameters:
661e5c89e4eSSatish Balay +   N - number of doubles in array
662e5c89e4eSSatish Balay .   idx - array of doubles
663e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
664e5c89e4eSSatish Balay 
665e5c89e4eSSatish Balay   Level: intermediate
666e5c89e4eSSatish Balay 
667e5c89e4eSSatish Balay .seealso: PetscIntView()
668e5c89e4eSSatish Balay @*/
669e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscRealView(PetscInt N,PetscReal idx[],PetscViewer viewer)
670e5c89e4eSSatish Balay {
671e5c89e4eSSatish Balay   PetscErrorCode ierr;
672e5c89e4eSSatish Balay   PetscInt       j,i,n = N/5,p = N % 5;
6736805f65bSBarry Smith   PetscTruth     iascii,isbinary;
674e5c89e4eSSatish Balay   MPI_Comm       comm;
675e5c89e4eSSatish Balay 
676e5c89e4eSSatish Balay   PetscFunctionBegin;
677e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
678e5c89e4eSSatish Balay   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,3);
679e5c89e4eSSatish Balay   PetscValidScalarPointer(idx,2);
680e5c89e4eSSatish Balay   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
681e5c89e4eSSatish Balay 
682e5c89e4eSSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
6836805f65bSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
684e5c89e4eSSatish Balay   if (iascii) {
685e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
686e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",5*i);CHKERRQ(ierr);
687e5c89e4eSSatish Balay       for (j=0; j<5; j++) {
688e5c89e4eSSatish Balay          ierr = PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",idx[i*5+j]);CHKERRQ(ierr);
689e5c89e4eSSatish Balay       }
690e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
691e5c89e4eSSatish Balay     }
692e5c89e4eSSatish Balay     if (p) {
693e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",5*n);CHKERRQ(ierr);
694e5c89e4eSSatish Balay       for (i=0; i<p; i++) { PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",idx[5*n+i]);CHKERRQ(ierr);}
695e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
696e5c89e4eSSatish Balay     }
697e5c89e4eSSatish Balay     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
6986805f65bSBarry Smith   } else if (isbinary) {
699*1cbcd9c4SBarry Smith     PetscMPIInt rank,size,*sizes,*displs, Ntotal,NN = PetscMPIIntCast(N);
700e5c89e4eSSatish Balay     PetscReal   *array;
701e5c89e4eSSatish Balay 
702e5c89e4eSSatish Balay     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
703e5c89e4eSSatish Balay     ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
704e5c89e4eSSatish Balay 
705e5c89e4eSSatish Balay     if (size > 1) {
706e5c89e4eSSatish Balay       if (rank) {
707e5c89e4eSSatish Balay         ierr = MPI_Gather(&NN,1,MPI_INT,0,0,MPI_INT,0,comm);CHKERRQ(ierr);
708e5c89e4eSSatish Balay         ierr = MPI_Gatherv(idx,NN,MPI_DOUBLE,0,0,0,MPI_DOUBLE,0,comm);CHKERRQ(ierr);
709e5c89e4eSSatish Balay       } else {
710e5c89e4eSSatish Balay 	ierr   = PetscMalloc(size*sizeof(PetscMPIInt),&sizes);CHKERRQ(ierr);
711e5c89e4eSSatish Balay         ierr   = MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm);CHKERRQ(ierr);
712e5c89e4eSSatish Balay         Ntotal = sizes[0];
713e5c89e4eSSatish Balay 	ierr   = PetscMalloc(size*sizeof(PetscMPIInt),&displs);CHKERRQ(ierr);
714e5c89e4eSSatish Balay         displs[0] = 0;
715e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
716e5c89e4eSSatish Balay           Ntotal    += sizes[i];
717e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
718e5c89e4eSSatish Balay         }
719e5c89e4eSSatish Balay 	ierr = PetscMalloc(Ntotal*sizeof(PetscReal),&array);CHKERRQ(ierr);
720e5c89e4eSSatish Balay         ierr = MPI_Gatherv(idx,NN,MPI_DOUBLE,array,sizes,displs,MPI_DOUBLE,0,comm);CHKERRQ(ierr);
7216805f65bSBarry Smith         ierr = PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_REAL,PETSC_TRUE);CHKERRQ(ierr);
722e5c89e4eSSatish Balay         ierr = PetscFree(sizes);CHKERRQ(ierr);
723e5c89e4eSSatish Balay         ierr = PetscFree(displs);CHKERRQ(ierr);
724e5c89e4eSSatish Balay         ierr = PetscFree(array);CHKERRQ(ierr);
725e5c89e4eSSatish Balay       }
726e5c89e4eSSatish Balay     } else {
7276805f65bSBarry Smith       ierr = PetscViewerBinaryWrite(viewer,idx,N,PETSC_REAL,PETSC_FALSE);CHKERRQ(ierr);
728e5c89e4eSSatish Balay     }
729e5c89e4eSSatish Balay   } else {
730e5c89e4eSSatish Balay     const char *tname;
731e5c89e4eSSatish Balay     ierr = PetscObjectGetName((PetscObject)viewer,&tname);CHKERRQ(ierr);
732e5c89e4eSSatish Balay     SETERRQ1(PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
733e5c89e4eSSatish Balay   }
734e5c89e4eSSatish Balay   PetscFunctionReturn(0);
735e5c89e4eSSatish Balay }
736e5c89e4eSSatish Balay 
737e5c89e4eSSatish Balay #undef __FUNCT__
738e5c89e4eSSatish Balay #define __FUNCT__ "PetscScalarView"
739e5c89e4eSSatish Balay /*@C
740e5c89e4eSSatish Balay     PetscScalarView - Prints an array of scalars; useful for debugging.
741e5c89e4eSSatish Balay 
742e5c89e4eSSatish Balay     Collective on PetscViewer
743e5c89e4eSSatish Balay 
744e5c89e4eSSatish Balay     Input Parameters:
745e5c89e4eSSatish Balay +   N - number of scalars in array
746e5c89e4eSSatish Balay .   idx - array of scalars
747e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
748e5c89e4eSSatish Balay 
749e5c89e4eSSatish Balay   Level: intermediate
750e5c89e4eSSatish Balay 
751e5c89e4eSSatish Balay .seealso: PetscIntView(), PetscRealView()
752e5c89e4eSSatish Balay @*/
753e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscScalarView(PetscInt N,PetscScalar idx[],PetscViewer viewer)
754e5c89e4eSSatish Balay {
755e5c89e4eSSatish Balay   PetscErrorCode ierr;
756e5c89e4eSSatish Balay   PetscInt       j,i,n = N/3,p = N % 3;
7576805f65bSBarry Smith   PetscTruth     iascii,isbinary;
758e5c89e4eSSatish Balay   MPI_Comm       comm;
759e5c89e4eSSatish Balay 
760e5c89e4eSSatish Balay   PetscFunctionBegin;
761e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
762e5c89e4eSSatish Balay   PetscValidHeader(viewer,3);
763e5c89e4eSSatish Balay   PetscValidScalarPointer(idx,2);
764e5c89e4eSSatish Balay   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
765e5c89e4eSSatish Balay 
766e5c89e4eSSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
7676805f65bSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
768e5c89e4eSSatish Balay   if (iascii) {
769e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
770e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",3*i);CHKERRQ(ierr);
771e5c89e4eSSatish Balay       for (j=0; j<3; j++) {
772e5c89e4eSSatish Balay #if defined (PETSC_USE_COMPLEX)
773e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer," (%12.4e,%12.4e)",
774e5c89e4eSSatish Balay                                  PetscRealPart(idx[i*3+j]),PetscImaginaryPart(idx[i*3+j]));CHKERRQ(ierr);
775e5c89e4eSSatish Balay #else
776e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",idx[i*3+j]);CHKERRQ(ierr);
777e5c89e4eSSatish Balay #endif
778e5c89e4eSSatish Balay       }
779e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
780e5c89e4eSSatish Balay     }
781e5c89e4eSSatish Balay     if (p) {
782e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%2d:",3*n);CHKERRQ(ierr);
783e5c89e4eSSatish Balay       for (i=0; i<p; i++) {
784e5c89e4eSSatish Balay #if defined (PETSC_USE_COMPLEX)
785e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer," (%12.4e,%12.4e)",
786e5c89e4eSSatish Balay                                  PetscRealPart(idx[n*3+i]),PetscImaginaryPart(idx[n*3+i]));CHKERRQ(ierr);
787e5c89e4eSSatish Balay #else
788e5c89e4eSSatish Balay         ierr = PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",idx[3*n+i]);CHKERRQ(ierr);
789e5c89e4eSSatish Balay #endif
790e5c89e4eSSatish Balay       }
791e5c89e4eSSatish Balay       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"\n");CHKERRQ(ierr);
792e5c89e4eSSatish Balay     }
793e5c89e4eSSatish Balay     ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
7946805f65bSBarry Smith   } else if (isbinary) {
795*1cbcd9c4SBarry Smith     PetscMPIInt size,rank,*sizes,Ntotal,*displs,NN = PetscMPIIntCast(N);
796e5c89e4eSSatish Balay     PetscScalar *array;
797e5c89e4eSSatish Balay 
798e5c89e4eSSatish Balay     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
799e5c89e4eSSatish Balay     ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
800e5c89e4eSSatish Balay 
801e5c89e4eSSatish Balay     if (size > 1) {
802e5c89e4eSSatish Balay       if (rank) {
803e5c89e4eSSatish Balay         ierr = MPI_Gather(&NN,1,MPI_INT,0,0,MPI_INT,0,comm);CHKERRQ(ierr);
804e5c89e4eSSatish Balay         ierr = MPI_Gatherv(idx,NN,MPIU_SCALAR,0,0,0,MPIU_SCALAR,0,comm);CHKERRQ(ierr);
805e5c89e4eSSatish Balay       } else {
806e5c89e4eSSatish Balay 	ierr   = PetscMalloc(size*sizeof(PetscMPIInt),&sizes);CHKERRQ(ierr);
807e5c89e4eSSatish Balay         ierr   = MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm);CHKERRQ(ierr);
808e5c89e4eSSatish Balay         Ntotal = sizes[0];
809e5c89e4eSSatish Balay 	ierr   = PetscMalloc(size*sizeof(PetscMPIInt),&displs);CHKERRQ(ierr);
810e5c89e4eSSatish Balay         displs[0] = 0;
811e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
812e5c89e4eSSatish Balay           Ntotal    += sizes[i];
813e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
814e5c89e4eSSatish Balay         }
815e5c89e4eSSatish Balay 	ierr = PetscMalloc(Ntotal*sizeof(PetscScalar),&array);CHKERRQ(ierr);
816e5c89e4eSSatish Balay         ierr = MPI_Gatherv(idx,NN,MPIU_SCALAR,array,sizes,displs,MPIU_SCALAR,0,comm);CHKERRQ(ierr);
8176805f65bSBarry Smith         ierr = PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_SCALAR,PETSC_TRUE);CHKERRQ(ierr);
818e5c89e4eSSatish Balay         ierr = PetscFree(sizes);CHKERRQ(ierr);
819e5c89e4eSSatish Balay         ierr = PetscFree(displs);CHKERRQ(ierr);
820e5c89e4eSSatish Balay         ierr = PetscFree(array);CHKERRQ(ierr);
821e5c89e4eSSatish Balay       }
822e5c89e4eSSatish Balay     } else {
8236805f65bSBarry Smith       ierr = PetscViewerBinaryWrite(viewer,idx,N,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
824e5c89e4eSSatish Balay     }
825e5c89e4eSSatish Balay   } else {
826e5c89e4eSSatish Balay     const char *tname;
827e5c89e4eSSatish Balay     ierr = PetscObjectGetName((PetscObject)viewer,&tname);CHKERRQ(ierr);
828e5c89e4eSSatish Balay     SETERRQ1(PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
829e5c89e4eSSatish Balay   }
830e5c89e4eSSatish Balay   PetscFunctionReturn(0);
831e5c89e4eSSatish Balay }
832e5c89e4eSSatish Balay 
833e5c89e4eSSatish Balay 
834e5c89e4eSSatish Balay 
835e5c89e4eSSatish Balay 
836