xref: /petsc/src/sys/error/err.c (revision 660278c0612eddb50605b63d23f7384c6f3231af)
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 
1502c9f0b5SLisandro Dalcin static EH eh = NULL;
16e5c89e4eSSatish Balay 
17e5c89e4eSSatish Balay /*@C
18e5c89e4eSSatish Balay    PetscEmacsClientErrorHandler - Error handler that uses the emacsclient program to
19a5b23f4aSJose E. Roman     load the file where the error occurred. Then calls the "previous" error handler.
20e5c89e4eSSatish Balay 
21e5c89e4eSSatish Balay    Not Collective
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Input Parameters:
24a5b23f4aSJose E. Roman +  comm - communicator over which error occurred
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:
3310699b91SBarry Smith .   -on_error_emacs <machinename> - will contact machinename to open the Emacs client there
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 
40cc12936aSPatrick Sanan    Developer Note:
419566063dSJacob Faibussowitsch    Since this is an error handler it cannot call PetscCall(); thus we just return if an error is detected.
423bf036e2SBarry Smith 
43db781477SPatrick Sanan .seealso: `PetscError()`, `PetscPushErrorHandler()`, `PetscPopErrorHandler()`, `PetscAttachDebuggerErrorHandler()`,
44db781477SPatrick Sanan           `PetscAbortErrorHandler()`, `PetscMPIAbortErrorHandler()`, `PetscTraceBackErrorHandler()`, `PetscReturnErrorHandler()`
45e5c89e4eSSatish Balay  @*/
46efca3c55SSatish Balay PetscErrorCode  PetscEmacsClientErrorHandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx)
47e5c89e4eSSatish Balay {
48e5c89e4eSSatish Balay   PetscErrorCode ierr;
49e5c89e4eSSatish Balay   char           command[PETSC_MAX_PATH_LEN];
50e5c89e4eSSatish Balay   const char     *pdir;
51e5c89e4eSSatish Balay   FILE           *fp;
52e5c89e4eSSatish Balay 
53e5c89e4eSSatish Balay   PetscFunctionBegin;
543bf036e2SBarry Smith   ierr = PetscGetPetscDir(&pdir);if (ierr) PetscFunctionReturn(ierr);
55efca3c55SSatish Balay   sprintf(command,"cd %s; emacsclient --no-wait +%d %s\n",pdir,line,file);
56e5c89e4eSSatish Balay #if defined(PETSC_HAVE_POPEN)
573bf036e2SBarry Smith   ierr = PetscPOpen(MPI_COMM_WORLD,(char*)ctx,command,"r",&fp);if (ierr) PetscFunctionReturn(ierr);
58016831caSBarry Smith   ierr = PetscPClose(MPI_COMM_WORLD,fp);if (ierr) PetscFunctionReturn(ierr);
59e5c89e4eSSatish Balay #else
60e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine");
61e5c89e4eSSatish Balay #endif
623bf036e2SBarry Smith   ierr = PetscPopErrorHandler();if (ierr) PetscFunctionReturn(ierr); /* remove this handler from the stack of handlers */
633bf036e2SBarry Smith   if (!eh) {
6402c9f0b5SLisandro Dalcin     ierr = PetscTraceBackErrorHandler(comm,line,fun,file,n,p,mess,NULL);if (ierr) PetscFunctionReturn(ierr);
653bf036e2SBarry Smith   } else {
66efca3c55SSatish Balay     ierr = (*eh->handler)(comm,line,fun,file,n,p,mess,eh->ctx);if (ierr) PetscFunctionReturn(ierr);
673bf036e2SBarry Smith   }
68e5c89e4eSSatish Balay   PetscFunctionReturn(ierr);
69e5c89e4eSSatish Balay }
70e5c89e4eSSatish Balay 
71e5c89e4eSSatish Balay /*@C
72e5c89e4eSSatish Balay    PetscPushErrorHandler - Sets a routine to be called on detection of errors.
73e5c89e4eSSatish Balay 
74e5c89e4eSSatish Balay    Not Collective
75e5c89e4eSSatish Balay 
76e5c89e4eSSatish Balay    Input Parameters:
77e5c89e4eSSatish Balay +  handler - error handler routine
78e5c89e4eSSatish Balay -  ctx - optional handler context that contains information needed by the handler (for
79e5c89e4eSSatish Balay          example file pointers for error messages etc.)
80e5c89e4eSSatish Balay 
81e5c89e4eSSatish Balay    Calling sequence of handler:
82efca3c55SSatish Balay $    int handler(MPI_Comm comm,int line,char *func,char *file,PetscErrorCode n,int p,char *mess,void *ctx);
83e5c89e4eSSatish Balay 
84a5b23f4aSJose E. Roman +  comm - communicator over which error occurred
85e5c89e4eSSatish Balay .  line - the line number of the error (indicated by __LINE__)
86e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
87e5c89e4eSSatish Balay .  n - the generic error number (see list defined in include/petscerror.h)
88668f157eSBarry Smith .  p - PETSC_ERROR_INITIAL if error just detected, otherwise PETSC_ERROR_REPEAT
89e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
90e5c89e4eSSatish Balay -  ctx - the error handler context
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay    Options Database Keys:
9310699b91SBarry Smith +   -on_error_attach_debugger <noxterm,gdb or dbx> - starts up the debugger if an error occurs
9410699b91SBarry Smith -   -on_error_abort - aborts the program if an error occurs
95e5c89e4eSSatish Balay 
96e5c89e4eSSatish Balay    Level: intermediate
97e5c89e4eSSatish Balay 
98e93bc3c1Svictor    Notes:
997850c7c0SBarry Smith    The currently available PETSc error handlers include PetscTraceBackErrorHandler(),
100e8fb0fc0SBarry Smith    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscMPIAbortErrorHandler(), PetscReturnErrorHandler().
101e93bc3c1Svictor 
10295452b02SPatrick Sanan    Fortran Notes:
10395452b02SPatrick Sanan     You can only push one error handler from Fortran before poping it.
1047850c7c0SBarry Smith 
105db781477SPatrick Sanan .seealso: `PetscPopErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, `PetscAbortErrorHandler()`, `PetscTraceBackErrorHandler()`, `PetscPushSignalHandler()`
106e5c89e4eSSatish Balay 
107e5c89e4eSSatish Balay @*/
108efca3c55SSatish Balay PetscErrorCode  PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void *ctx)
109e5c89e4eSSatish Balay {
110e5c89e4eSSatish Balay   EH             neweh;
111e5c89e4eSSatish Balay 
112e5c89e4eSSatish Balay   PetscFunctionBegin;
1139566063dSJacob Faibussowitsch   PetscCall(PetscNew(&neweh));
114a297a907SKarl Rupp   if (eh) neweh->previous = eh;
11502c9f0b5SLisandro Dalcin   else    neweh->previous = NULL;
116e5c89e4eSSatish Balay   neweh->handler = handler;
117e5c89e4eSSatish Balay   neweh->ctx     = ctx;
118e5c89e4eSSatish Balay   eh             = neweh;
119e5c89e4eSSatish Balay   PetscFunctionReturn(0);
120e5c89e4eSSatish Balay }
121e5c89e4eSSatish Balay 
122e30d2299SSatish Balay /*@
123e5c89e4eSSatish Balay    PetscPopErrorHandler - Removes the latest error handler that was
124e5c89e4eSSatish Balay    pushed with PetscPushErrorHandler().
125e5c89e4eSSatish Balay 
126e5c89e4eSSatish Balay    Not Collective
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay    Level: intermediate
129e5c89e4eSSatish Balay 
130db781477SPatrick Sanan .seealso: `PetscPushErrorHandler()`
131e5c89e4eSSatish Balay @*/
1327087cfbeSBarry Smith PetscErrorCode  PetscPopErrorHandler(void)
133e5c89e4eSSatish Balay {
134e5c89e4eSSatish Balay   EH             tmp;
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay   PetscFunctionBegin;
137e5c89e4eSSatish Balay   if (!eh) PetscFunctionReturn(0);
138e5c89e4eSSatish Balay   tmp  = eh;
139e5c89e4eSSatish Balay   eh   = eh->previous;
1409566063dSJacob Faibussowitsch   PetscCall(PetscFree(tmp));
141e5c89e4eSSatish Balay   PetscFunctionReturn(0);
142e5c89e4eSSatish Balay }
143e5c89e4eSSatish Balay 
144e93bc3c1Svictor /*@C
14545b666d6SBarry Smith   PetscReturnErrorHandler - Error handler that causes a return without printing an error message.
146e93bc3c1Svictor 
147e93bc3c1Svictor    Not Collective
148e93bc3c1Svictor 
149e93bc3c1Svictor    Input Parameters:
150e32f2f54SBarry Smith +  comm - communicator over which error occurred
151e32f2f54SBarry Smith .  line - the line number of the error (indicated by __LINE__)
152e93bc3c1Svictor .  file - the file in which the error was detected (indicated by __FILE__)
153e93bc3c1Svictor .  mess - an error text string, usually just printed to the screen
154e93bc3c1Svictor .  n - the generic error number
155e93bc3c1Svictor .  p - specific error number
156e93bc3c1Svictor -  ctx - error handler context
157e93bc3c1Svictor 
158e93bc3c1Svictor    Level: developer
159e93bc3c1Svictor 
160e93bc3c1Svictor    Notes:
161e93bc3c1Svictor    Most users need not directly employ this routine and the other error
162e93bc3c1Svictor    handlers, but can instead use the simplified interface SETERRQ, which has
163e93bc3c1Svictor    the calling sequence
164e32f2f54SBarry Smith $     SETERRQ(comm,number,mess)
165e93bc3c1Svictor 
16645b666d6SBarry Smith    PetscIgnoreErrorHandler() does the same thing as this function, but is deprecated, you should use this function.
167e93bc3c1Svictor 
16845b666d6SBarry Smith    Use PetscPushErrorHandler() to set the desired error handler.
169e93bc3c1Svictor 
170db781477SPatrick Sanan .seealso: `PetscPushErrorHandler()`, `PetscPopErrorHandler()`, `PetscError()`, `PetscAbortErrorHandler()`, `PetscMPIAbortErrorHandler()`, `PetscTraceBackErrorHandler()`,
171db781477SPatrick Sanan           `PetscAttachDebuggerErrorHandler()`, `PetscEmacsClientErrorHandler()`
172e93bc3c1Svictor  @*/
173efca3c55SSatish Balay PetscErrorCode  PetscReturnErrorHandler(MPI_Comm comm,int line,const char *fun,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,void *ctx)
174e93bc3c1Svictor {
175362febeeSStefano Zampini   return n;
176e93bc3c1Svictor }
177e93bc3c1Svictor 
178e5c89e4eSSatish Balay static char PetscErrorBaseMessage[1024];
179e5c89e4eSSatish Balay /*
180e5c89e4eSSatish Balay        The numerical values for these are defined in include/petscerror.h; any changes
181e5c89e4eSSatish Balay    there must also be made here
182e5c89e4eSSatish Balay */
183e5c89e4eSSatish Balay static const char *PetscErrorStrings[] = {
184e5c89e4eSSatish Balay   /*55 */ "Out of memory",
185e5c89e4eSSatish Balay           "No support for this operation for this object type",
186e5c89e4eSSatish Balay           "No support for this operation on this system",
187e5c89e4eSSatish Balay   /*58 */ "Operation done in wrong order",
188e5c89e4eSSatish Balay   /*59 */ "Signal received",
189e5c89e4eSSatish Balay   /*60 */ "Nonconforming object sizes",
190e5c89e4eSSatish Balay           "Argument aliasing not permitted",
191e5c89e4eSSatish Balay           "Invalid argument",
192e5c89e4eSSatish Balay   /*63 */ "Argument out of range",
193a17b96a8SKyle Gerard Felker           "Corrupt argument: https://petsc.org/release/faq/#valgrind",
194e5c89e4eSSatish Balay           "Unable to open file",
195e5c89e4eSSatish Balay           "Read from file failed",
196e5c89e4eSSatish Balay           "Write to file failed",
197e5c89e4eSSatish Balay           "Invalid pointer",
198e5c89e4eSSatish Balay   /*69 */ "Arguments must have same type",
199a8b45ee7SBarry Smith   /*70 */ "Attempt to use a pointer that does not point to a valid accessible location",
200a17b96a8SKyle Gerard Felker   /*71 */ "Zero pivot in LU factorization: https://petsc.org/release/faq/#zeropivot",
201e5c89e4eSSatish Balay   /*72 */ "Floating point exception",
202e5c89e4eSSatish Balay   /*73 */ "Object is in wrong state",
203e5c89e4eSSatish Balay           "Corrupted Petsc object",
204e5c89e4eSSatish Balay           "Arguments are incompatible",
205e5c89e4eSSatish Balay           "Error in external library",
206e5c89e4eSSatish Balay   /*77 */ "Petsc has generated inconsistent data",
207a17b96a8SKyle Gerard Felker           "Memory corruption: https://petsc.org/release/faq/#valgrind",
208e5c89e4eSSatish Balay           "Unexpected data in file",
209e5c89e4eSSatish Balay   /*80 */ "Arguments must have same communicators",
210a17b96a8SKyle Gerard Felker   /*81 */ "Zero pivot in Cholesky factorization: https://petsc.org/release/faq/#zeropivot",
211e5c89e4eSSatish Balay           "",
212e5c89e4eSSatish Balay           "",
213a17b96a8SKyle Gerard Felker           "Overflow in integer operation: https://petsc.org/release/faq/#64-bit-indices",
214e5c89e4eSSatish Balay   /*85 */ "Null argument, when expecting valid pointer",
215a17b96a8SKyle Gerard Felker   /*86 */ "Unknown type. Check for miss-spelling or missing package: https://petsc.org/release/install/install/#external-packages",
2163d96e996SBarry Smith   /*87 */ "MPI library at runtime is not compatible with MPI used at compile time",
2178cda6cd7SBarry Smith   /*88 */ "Error in system call",
218a17b96a8SKyle Gerard Felker   /*89 */ "Object Type not set: https://petsc.org/release/faq/#object-type-not-set",
21973260a9bSLisandro Dalcin   /*90 */ "",
22073260a9bSLisandro Dalcin   /*   */ "",
221a17b96a8SKyle Gerard Felker   /*92 */ "See https://petsc.org/release/overview/linear_solve_table/ for possible LU and Cholesky solvers",
222f560318cSPatrick Sanan   /*93 */ "You cannot overwrite this option since that will conflict with other previously set options",
223691b26d3SBarry Smith   /*94 */ "Example/application run with number of MPI ranks it does not support",
224691b26d3SBarry Smith   /*95 */ "Missing or incorrect user input",
225e57d7714SBarry Smith   /*96 */ "GPU resources unavailable",
226764761abSStefano Zampini   /*97 */ "GPU error",
227764761abSStefano Zampini   /*98 */ "General MPI error"
22873260a9bSLisandro Dalcin };
229e5c89e4eSSatish Balay 
230e5c89e4eSSatish Balay /*@C
231e5c89e4eSSatish Balay    PetscErrorMessage - returns the text string associated with a PETSc error code.
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay    Not Collective
234e5c89e4eSSatish Balay 
235e5c89e4eSSatish Balay    Input Parameter:
236e5c89e4eSSatish Balay .   errnum - the error code
237e5c89e4eSSatish Balay 
238d8d19677SJose E. Roman    Output Parameters:
2390298fd71SBarry Smith +  text - the error message (NULL if not desired)
2400298fd71SBarry Smith -  specific - the specific error message that was set with SETERRxxx() or PetscError().  (NULL if not desired)
241e5c89e4eSSatish Balay 
242e5c89e4eSSatish Balay    Level: developer
243e5c89e4eSSatish Balay 
244db781477SPatrick Sanan .seealso: `PetscPushErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, `PetscError()`, `SETERRQ()`, `PetscCall()`
245db781477SPatrick Sanan           `PetscAbortErrorHandler()`, `PetscTraceBackErrorHandler()`
246e5c89e4eSSatish Balay  @*/
2477087cfbeSBarry Smith PetscErrorCode  PetscErrorMessage(int errnum,const char *text[],char **specific)
248e5c89e4eSSatish Balay {
249c35ec7c7SPierre Jolivet   size_t len;
250c35ec7c7SPierre Jolivet 
251e5c89e4eSSatish Balay   PetscFunctionBegin;
252c35ec7c7SPierre Jolivet   if (text && errnum > PETSC_ERR_MIN_VALUE && errnum < PETSC_ERR_MAX_VALUE) {
253c35ec7c7SPierre Jolivet     *text = PetscErrorStrings[errnum-PETSC_ERR_MIN_VALUE-1];
254c35ec7c7SPierre Jolivet     PetscCall(PetscStrlen(*text,&len));
255c35ec7c7SPierre Jolivet     if (!len) *text = NULL;
256c35ec7c7SPierre Jolivet   }
25702c9f0b5SLisandro Dalcin   else if (text) *text = NULL;
258e5c89e4eSSatish Balay 
259a297a907SKarl Rupp   if (specific) *specific = PetscErrorBaseMessage;
260e5c89e4eSSatish Balay   PetscFunctionReturn(0);
261e5c89e4eSSatish Balay }
262e5c89e4eSSatish Balay 
263984a1229SMatthew G. Knepley #if defined(PETSC_CLANGUAGE_CXX)
264984a1229SMatthew G. Knepley /* C++ exceptions are formally not allowed to propagate through extern "C" code. In practice, far too much software
265984a1229SMatthew G. Knepley  * would be broken if implementations did not handle it it some common cases. However, keep in mind
266984a1229SMatthew G. Knepley  *
267984a1229SMatthew G. Knepley  *   Rule 62. Don't allow exceptions to propagate across module boundaries
268984a1229SMatthew G. Knepley  *
269984a1229SMatthew G. Knepley  * in "C++ Coding Standards" by Sutter and Alexandrescu. (This accounts for part of the ongoing C++ binary interface
270984a1229SMatthew G. Knepley  * instability.) Having PETSc raise errors as C++ exceptions was probably misguided and should eventually be removed.
271984a1229SMatthew G. Knepley  *
272984a1229SMatthew G. Knepley  * Here is the problem: You have a C++ function call a PETSc function, and you would like to maintain the error message
273984a1229SMatthew G. Knepley  * and stack information from the PETSc error. You could make everyone write exactly this code in their C++, but that
274984a1229SMatthew G. Knepley  * seems crazy to me.
275984a1229SMatthew G. Knepley  */
276984a1229SMatthew G. Knepley #include <sstream>
2774c94c282SMatthew G. Knepley #include <stdexcept>
27870a7d78aSStefano Zampini static void PetscCxxErrorThrow()
27970a7d78aSStefano Zampini {
280984a1229SMatthew G. Knepley   const char *str;
281984a1229SMatthew G. Knepley   if (eh && eh->ctx) {
282984a1229SMatthew G. Knepley     std::ostringstream *msg;
283984a1229SMatthew G. Knepley     msg = (std::ostringstream*) eh->ctx;
284984a1229SMatthew G. Knepley     str = msg->str().c_str();
285984a1229SMatthew G. Knepley   } else str = "Error detected in C PETSc";
286984a1229SMatthew G. Knepley 
287984a1229SMatthew G. Knepley   throw std::runtime_error(str);
288984a1229SMatthew G. Knepley }
289984a1229SMatthew G. Knepley #endif
290984a1229SMatthew G. Knepley 
291e5c89e4eSSatish Balay /*@C
29245b666d6SBarry Smith    PetscError - Routine that is called when an error has been detected, usually called through the macro SETERRQ(PETSC_COMM_SELF,).
293e5c89e4eSSatish Balay 
29445b666d6SBarry Smith   Collective on comm
295e5c89e4eSSatish Balay 
296e5c89e4eSSatish Balay    Input Parameters:
297e32f2f54SBarry Smith +  comm - communicator over which error occurred.  ALL ranks of this communicator MUST call this routine
298e32f2f54SBarry Smith .  line - the line number of the error (indicated by __LINE__)
2993de71b31SHong Zhang .  func - the function name in which the error was detected
300e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
301e5c89e4eSSatish Balay .  n - the generic error number
302d736bfebSBarry Smith .  p - PETSC_ERROR_INITIAL indicates the error was initially detected, PETSC_ERROR_REPEAT indicates this is a traceback from a previously detected error
303e5c89e4eSSatish Balay -  mess - formatted message string - aka printf
304e5c89e4eSSatish Balay 
30545b666d6SBarry Smith   Options Database:
30645b666d6SBarry Smith +  -error_output_stdout - output the error messages to stdout instead of the default stderr
30745b666d6SBarry Smith -  -error_output_none - do not output the error messages
30845b666d6SBarry Smith 
309e5c89e4eSSatish Balay   Level: intermediate
310e5c89e4eSSatish Balay 
311e5c89e4eSSatish Balay    Notes:
31245b666d6SBarry Smith    PETSc error handling is done with error return codes. A non-zero return indicates an error was detected. Errors are generally not something that the code
31345b666d6SBarry Smith    can recover from. Note that numerical errors (potential divide by zero, for example) are not managed by the error return codes; they are managed via, for example,
31445b666d6SBarry Smith    KSPGetConvergedReason() that indicates if the solve was successful or not. The option -ksp_error_if_not_converged, for example, turns numerical failures into
31545b666d6SBarry Smith    hard errors managed via PetscError().
31645b666d6SBarry Smith 
31745b666d6SBarry Smith    PETSc provides a rich supply of error handlers, see the list below, and users can also provide their own error handlers.
31845b666d6SBarry Smith 
319e5c89e4eSSatish Balay    Most users need not directly use this routine and the error handlers, but
320e5c89e4eSSatish Balay    can instead use the simplified interface SETERRQ, which has the calling
321e5c89e4eSSatish Balay    sequence
322e32f2f54SBarry Smith $     SETERRQ(comm,n,mess)
323e5c89e4eSSatish Balay 
324e3081792SBarry Smith    Fortran Note:
325e3081792SBarry Smith    This routine is used differently from Fortran
326e3081792SBarry Smith $    PetscError(MPI_Comm comm,PetscErrorCode n,PetscErrorType p,char *message)
327e3081792SBarry Smith 
32845b666d6SBarry Smith    Set the error handler with PetscPushErrorHandler().
329e5c89e4eSSatish Balay 
3303bf036e2SBarry 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)
3313bf036e2SBarry 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
3323bf036e2SBarry Smith    but this annoying.
3333bf036e2SBarry Smith 
334db781477SPatrick Sanan .seealso: `PetscErrorCode`, `PetscPushErrorHandler()`, `PetscPopErrorHandler()`, `PetscTraceBackErrorHandler()`, `PetscAbortErrorHandler()`, `PetscMPIAbortErrorHandler()`,
335db781477SPatrick Sanan           `PetscReturnErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, `PetscEmacsClientErrorHandler()`,
336db781477SPatrick Sanan           `SETERRQ()`, `PetscCall()`, `CHKMEMQ`, `SETERRQ()`, `SETERRQ()`, `PetscErrorMessage()`, `PETSCABORT()`
337e5c89e4eSSatish Balay @*/
338efca3c55SSatish Balay PetscErrorCode PetscError(MPI_Comm comm,int line,const char *func,const char *file,PetscErrorCode n,PetscErrorType p,const char *mess,...)
339e5c89e4eSSatish Balay {
340e5c89e4eSSatish Balay   va_list        Argp;
341c9a19010SBarry Smith   size_t         fullLength;
34202c9f0b5SLisandro Dalcin   char           buf[2048],*lbuf = NULL;
343fbfcfee5SBarry Smith   PetscBool      ismain;
3443bf036e2SBarry Smith   PetscErrorCode ierr;
345e5c89e4eSSatish Balay 
34639a651e2SJacob Faibussowitsch   if (!PetscErrorHandlingInitialized) return n;
3470d577829SBarry Smith   if (comm == MPI_COMM_NULL) comm = PETSC_COMM_SELF;
348e5c89e4eSSatish Balay 
349e5c89e4eSSatish Balay   /* Compose the message evaluating the print format */
350e5c89e4eSSatish Balay   if (mess) {
351e5c89e4eSSatish Balay     va_start(Argp,mess);
3522d609e63SMatthew Knepley     PetscVSNPrintf(buf,2048,mess,&fullLength,Argp);
353e5c89e4eSSatish Balay     va_end(Argp);
354e5c89e4eSSatish Balay     lbuf = buf;
35578179f8bSBarry Smith     if (p == PETSC_ERROR_INITIAL) PetscStrncpy(PetscErrorBaseMessage,lbuf,1023);
356e5c89e4eSSatish Balay   }
357e5c89e4eSSatish Balay 
3584ed0ab5bSBarry Smith   if (p == PETSC_ERROR_INITIAL && n != PETSC_ERR_MEMC) PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__);
3594ed0ab5bSBarry Smith 
36002c9f0b5SLisandro Dalcin   if (!eh) ierr = PetscTraceBackErrorHandler(comm,line,func,file,n,p,lbuf,NULL);
361efca3c55SSatish Balay   else ierr = (*eh->handler)(comm,line,func,file,n,p,lbuf,eh->ctx);
362362febeeSStefano Zampini   PetscStackClearTop;
363e5c89e4eSSatish Balay 
364e5c89e4eSSatish Balay   /*
3657233276eSBarry Smith       If this is called from the main() routine we call MPI_Abort() instead of
366e5c89e4eSSatish Balay     return to allow the parallel program to be properly shutdown.
367e5c89e4eSSatish Balay 
3687233276eSBarry Smith     Does not call PETSCABORT() since that would provide the wrong source file and line number information
369e5c89e4eSSatish Balay   */
37049c86fc7SBarry Smith   if (func) {
371e5c89e4eSSatish Balay     PetscStrncmp(func,"main",4,&ismain);
3727233276eSBarry Smith     if (ismain) {
37349c86fc7SBarry Smith       if (petscwaitonerrorflg) PetscSleep(1000);
374*660278c0SBarry Smith       PETSCABORT(comm,ierr);
3757233276eSBarry Smith     }
37649c86fc7SBarry Smith   }
3772c280183SJed Brown #if defined(PETSC_CLANGUAGE_CXX)
378d736bfebSBarry Smith   if (p == PETSC_ERROR_IN_CXX) {
3792c280183SJed Brown     PetscCxxErrorThrow();
380d736bfebSBarry Smith   }
381d736bfebSBarry Smith #endif
382362febeeSStefano Zampini   return ierr;
383e5c89e4eSSatish Balay }
384e5c89e4eSSatish Balay 
385e5c89e4eSSatish Balay /* -------------------------------------------------------------------------*/
386e5c89e4eSSatish Balay 
387e5c89e4eSSatish Balay /*@C
388e5c89e4eSSatish Balay     PetscIntView - Prints an array of integers; useful for debugging.
389e5c89e4eSSatish Balay 
390e5c89e4eSSatish Balay     Collective on PetscViewer
391e5c89e4eSSatish Balay 
392e5c89e4eSSatish Balay     Input Parameters:
393e5c89e4eSSatish Balay +   N - number of integers in array
394e5c89e4eSSatish Balay .   idx - array of integers
395e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
396e5c89e4eSSatish Balay 
397e5c89e4eSSatish Balay   Level: intermediate
398e5c89e4eSSatish Balay 
39995452b02SPatrick Sanan     Developer Notes:
40095452b02SPatrick Sanan     idx cannot be const because may be passed to binary viewer where byte swapping is done
401300a7f5bSBarry Smith 
402db781477SPatrick Sanan .seealso: `PetscRealView()`
403e5c89e4eSSatish Balay @*/
4047087cfbeSBarry Smith PetscErrorCode  PetscIntView(PetscInt N,const PetscInt idx[],PetscViewer viewer)
405e5c89e4eSSatish Balay {
406ca0c3be5SJacob Faibussowitsch   PetscMPIInt    rank,size;
407e5c89e4eSSatish Balay   PetscInt       j,i,n = N/20,p = N % 20;
408ace3abfcSBarry Smith   PetscBool      iascii,isbinary;
409e5c89e4eSSatish Balay   MPI_Comm       comm;
410e5c89e4eSSatish Balay 
411e5c89e4eSSatish Balay   PetscFunctionBegin;
412e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
4130700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,3);
4145ab33896SBarry Smith   if (N) PetscValidIntPointer(idx,2);
4159566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer,&comm));
4169566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm,&size));
4179566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm,&rank));
418e5c89e4eSSatish Balay 
4199566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
4209566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary));
421e5c89e4eSSatish Balay   if (iascii) {
4229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(viewer));
423e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
424ca0c3be5SJacob Faibussowitsch       if (size > 1) {
4259566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %" PetscInt_FMT ":", rank, 20*i));
426ca0c3be5SJacob Faibussowitsch       } else {
4279566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT ":",20*i));
428ca0c3be5SJacob Faibussowitsch       }
429e5c89e4eSSatish Balay       for (j=0; j<20; j++) {
4309566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," %" PetscInt_FMT,idx[i*20+j]));
431e5c89e4eSSatish Balay       }
4329566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"\n"));
433e5c89e4eSSatish Balay     }
434e5c89e4eSSatish Balay     if (p) {
435ca0c3be5SJacob Faibussowitsch       if (size > 1) {
4369566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %" PetscInt_FMT ":",rank ,20*n));
437ca0c3be5SJacob Faibussowitsch       } else {
4389566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%" PetscInt_FMT ":",20*n));
439ca0c3be5SJacob Faibussowitsch       }
4409566063dSJacob Faibussowitsch       for (i=0; i<p; i++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," %" PetscInt_FMT,idx[20*n+i]));
4419566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"\n"));
442e5c89e4eSSatish Balay     }
4439566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
4449566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(viewer));
4456805f65bSBarry Smith   } else if (isbinary) {
446ca0c3be5SJacob Faibussowitsch     PetscMPIInt *sizes,Ntotal,*displs,NN;
447e5c89e4eSSatish Balay     PetscInt    *array;
448783b601eSJed Brown 
4499566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(N,&NN));
450e5c89e4eSSatish Balay 
451e5c89e4eSSatish Balay     if (size > 1) {
452e5c89e4eSSatish Balay       if (rank) {
4539566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gather(&NN,1,MPI_INT,NULL,0,MPI_INT,0,comm));
4549566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gatherv((void*)idx,NN,MPIU_INT,NULL,NULL,NULL,MPIU_INT,0,comm));
455e5c89e4eSSatish Balay       } else {
4569566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(size,&sizes));
4579566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm));
458e5c89e4eSSatish Balay         Ntotal    = sizes[0];
4599566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(size,&displs));
460e5c89e4eSSatish Balay         displs[0] = 0;
461e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
462e5c89e4eSSatish Balay           Ntotal   += sizes[i];
463e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
464e5c89e4eSSatish Balay         }
4659566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(Ntotal,&array));
4669566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gatherv((void*)idx,NN,MPIU_INT,array,sizes,displs,MPIU_INT,0,comm));
4679566063dSJacob Faibussowitsch         PetscCall(PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_INT));
4689566063dSJacob Faibussowitsch         PetscCall(PetscFree(sizes));
4699566063dSJacob Faibussowitsch         PetscCall(PetscFree(displs));
4709566063dSJacob Faibussowitsch         PetscCall(PetscFree(array));
471e5c89e4eSSatish Balay       }
472e5c89e4eSSatish Balay     } else {
4739566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(viewer,idx,N,PETSC_INT));
474e5c89e4eSSatish Balay     }
475e5c89e4eSSatish Balay   } else {
476e5c89e4eSSatish Balay     const char *tname;
4779566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetName((PetscObject)viewer,&tname));
47898921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
479e5c89e4eSSatish Balay   }
480e5c89e4eSSatish Balay   PetscFunctionReturn(0);
481e5c89e4eSSatish Balay }
482e5c89e4eSSatish Balay 
483e5c89e4eSSatish Balay /*@C
484e5c89e4eSSatish Balay     PetscRealView - Prints an array of doubles; useful for debugging.
485e5c89e4eSSatish Balay 
486e5c89e4eSSatish Balay     Collective on PetscViewer
487e5c89e4eSSatish Balay 
488e5c89e4eSSatish Balay     Input Parameters:
489cba51d77SBarry Smith +   N - number of PetscReal in array
490cba51d77SBarry Smith .   idx - array of PetscReal
491e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
492e5c89e4eSSatish Balay 
493e5c89e4eSSatish Balay   Level: intermediate
494e5c89e4eSSatish Balay 
49595452b02SPatrick Sanan     Developer Notes:
49695452b02SPatrick Sanan     idx cannot be const because may be passed to binary viewer where byte swapping is done
497300a7f5bSBarry Smith 
498db781477SPatrick Sanan .seealso: `PetscIntView()`
499e5c89e4eSSatish Balay @*/
5007087cfbeSBarry Smith PetscErrorCode  PetscRealView(PetscInt N,const PetscReal idx[],PetscViewer viewer)
501e5c89e4eSSatish Balay {
502ca0c3be5SJacob Faibussowitsch   PetscMPIInt    rank,size;
503e5c89e4eSSatish Balay   PetscInt       j,i,n = N/5,p = N % 5;
504ace3abfcSBarry Smith   PetscBool      iascii,isbinary;
505e5c89e4eSSatish Balay   MPI_Comm       comm;
506e5c89e4eSSatish Balay 
507e5c89e4eSSatish Balay   PetscFunctionBegin;
508e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
5090700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,3);
510064a246eSJacob Faibussowitsch   PetscValidRealPointer(idx,2);
5119566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer,&comm));
5129566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm,&size));
5139566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm,&rank));
514e5c89e4eSSatish Balay 
5159566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
5169566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary));
517e5c89e4eSSatish Balay   if (iascii) {
5181a989b97SToby Isaac     PetscInt tab;
5191a989b97SToby Isaac 
5209566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(viewer));
5219566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetTab(viewer, &tab));
522e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
5239566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISetTab(viewer, tab));
524ca0c3be5SJacob Faibussowitsch       if (size > 1) {
5259566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2" PetscInt_FMT ":",rank ,5*i));
526ca0c3be5SJacob Faibussowitsch       } else {
5279566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%2" PetscInt_FMT ":",5*i));
528ca0c3be5SJacob Faibussowitsch       }
5299566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISetTab(viewer, 0));
530e5c89e4eSSatish Balay       for (j=0; j<5; j++) {
5319566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[i*5+j]));
532e5c89e4eSSatish Balay       }
5339566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"\n"));
534e5c89e4eSSatish Balay     }
535e5c89e4eSSatish Balay     if (p) {
5369566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISetTab(viewer, tab));
537ca0c3be5SJacob Faibussowitsch       if (size > 1) {
5389566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2" PetscInt_FMT ":",rank ,5*n));
539ca0c3be5SJacob Faibussowitsch       } else {
5409566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%2" PetscInt_FMT ":",5*n));
541ca0c3be5SJacob Faibussowitsch       }
5429566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISetTab(viewer, 0));
5439566063dSJacob Faibussowitsch       for (i=0; i<p; i++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[5*n+i]));
5449566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"\n"));
545e5c89e4eSSatish Balay     }
5469566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
5479566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIISetTab(viewer, tab));
5489566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(viewer));
5496805f65bSBarry Smith   } else if (isbinary) {
550ca0c3be5SJacob Faibussowitsch     PetscMPIInt *sizes,*displs, Ntotal,NN;
551e5c89e4eSSatish Balay     PetscReal   *array;
552e5c89e4eSSatish Balay 
5539566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(N,&NN));
554e5c89e4eSSatish Balay 
555e5c89e4eSSatish Balay     if (size > 1) {
556e5c89e4eSSatish Balay       if (rank) {
5579566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gather(&NN,1,MPI_INT,NULL,0,MPI_INT,0,comm));
5589566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gatherv((PetscReal*)idx,NN,MPIU_REAL,NULL,NULL,NULL,MPIU_REAL,0,comm));
559e5c89e4eSSatish Balay       } else {
5609566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(size,&sizes));
5619566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm));
562e5c89e4eSSatish Balay         Ntotal    = sizes[0];
5639566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(size,&displs));
564e5c89e4eSSatish Balay         displs[0] = 0;
565e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
566e5c89e4eSSatish Balay           Ntotal   += sizes[i];
567e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
568e5c89e4eSSatish Balay         }
5699566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(Ntotal,&array));
5709566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gatherv((PetscReal*)idx,NN,MPIU_REAL,array,sizes,displs,MPIU_REAL,0,comm));
5719566063dSJacob Faibussowitsch         PetscCall(PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_REAL));
5729566063dSJacob Faibussowitsch         PetscCall(PetscFree(sizes));
5739566063dSJacob Faibussowitsch         PetscCall(PetscFree(displs));
5749566063dSJacob Faibussowitsch         PetscCall(PetscFree(array));
575e5c89e4eSSatish Balay       }
576e5c89e4eSSatish Balay     } else {
5779566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(viewer,(void*) idx,N,PETSC_REAL));
578e5c89e4eSSatish Balay     }
579e5c89e4eSSatish Balay   } else {
580e5c89e4eSSatish Balay     const char *tname;
5819566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetName((PetscObject)viewer,&tname));
58298921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
583e5c89e4eSSatish Balay   }
584e5c89e4eSSatish Balay   PetscFunctionReturn(0);
585e5c89e4eSSatish Balay }
586e5c89e4eSSatish Balay 
587e5c89e4eSSatish Balay /*@C
588e5c89e4eSSatish Balay     PetscScalarView - Prints an array of scalars; useful for debugging.
589e5c89e4eSSatish Balay 
590e5c89e4eSSatish Balay     Collective on PetscViewer
591e5c89e4eSSatish Balay 
592e5c89e4eSSatish Balay     Input Parameters:
593e5c89e4eSSatish Balay +   N - number of scalars in array
594e5c89e4eSSatish Balay .   idx - array of scalars
595e5c89e4eSSatish Balay -   viewer - location to print array,  PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF or 0
596e5c89e4eSSatish Balay 
597e5c89e4eSSatish Balay   Level: intermediate
598e5c89e4eSSatish Balay 
59995452b02SPatrick Sanan     Developer Notes:
60095452b02SPatrick Sanan     idx cannot be const because may be passed to binary viewer where byte swapping is done
601300a7f5bSBarry Smith 
602db781477SPatrick Sanan .seealso: `PetscIntView()`, `PetscRealView()`
603e5c89e4eSSatish Balay @*/
6047087cfbeSBarry Smith PetscErrorCode  PetscScalarView(PetscInt N,const PetscScalar idx[],PetscViewer viewer)
605e5c89e4eSSatish Balay {
606ca0c3be5SJacob Faibussowitsch   PetscMPIInt    rank,size;
607e5c89e4eSSatish Balay   PetscInt       j,i,n = N/3,p = N % 3;
608ace3abfcSBarry Smith   PetscBool      iascii,isbinary;
609e5c89e4eSSatish Balay   MPI_Comm       comm;
610e5c89e4eSSatish Balay 
611e5c89e4eSSatish Balay   PetscFunctionBegin;
612e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF;
613e5c89e4eSSatish Balay   PetscValidHeader(viewer,3);
6148c34849bSStefano Zampini   if (N) PetscValidScalarPointer(idx,2);
6159566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer,&comm));
6169566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm,&size));
6179566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm,&rank));
618e5c89e4eSSatish Balay 
6199566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
6209566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary));
621e5c89e4eSSatish Balay   if (iascii) {
6229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(viewer));
623e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
624ca0c3be5SJacob Faibussowitsch       if (size > 1) {
6259566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2" PetscInt_FMT ":",rank ,3*i));
626ca0c3be5SJacob Faibussowitsch       } else {
6279566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%2" PetscInt_FMT ":",3*i));
628ca0c3be5SJacob Faibussowitsch       }
629e5c89e4eSSatish Balay       for (j=0; j<3; j++) {
630e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
6319566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," (%12.4e,%12.4e)", (double)PetscRealPart(idx[i*3+j]),(double)PetscImaginaryPart(idx[i*3+j])));
632e5c89e4eSSatish Balay #else
6339566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[i*3+j]));
634e5c89e4eSSatish Balay #endif
635e5c89e4eSSatish Balay       }
6369566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"\n"));
637e5c89e4eSSatish Balay     }
638e5c89e4eSSatish Balay     if (p) {
639ca0c3be5SJacob Faibussowitsch       if (size > 1) {
6409566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"[%d] %2" PetscInt_FMT ":",rank ,3*n));
641ca0c3be5SJacob Faibussowitsch       } else {
6429566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"%2" PetscInt_FMT ":",3*n));
643ca0c3be5SJacob Faibussowitsch       }
644e5c89e4eSSatish Balay       for (i=0; i<p; i++) {
645e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX)
6469566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," (%12.4e,%12.4e)", (double)PetscRealPart(idx[n*3+i]),(double)PetscImaginaryPart(idx[n*3+i])));
647e5c89e4eSSatish Balay #else
6489566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer," %12.4e",(double)idx[3*n+i]));
649e5c89e4eSSatish Balay #endif
650e5c89e4eSSatish Balay       }
6519566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer,"\n"));
652e5c89e4eSSatish Balay     }
6539566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
6549566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(viewer));
6556805f65bSBarry Smith   } else if (isbinary) {
656ca0c3be5SJacob Faibussowitsch     PetscMPIInt *sizes,Ntotal,*displs,NN;
657e5c89e4eSSatish Balay     PetscScalar *array;
658e5c89e4eSSatish Balay 
6599566063dSJacob Faibussowitsch     PetscCall(PetscMPIIntCast(N,&NN));
660e5c89e4eSSatish Balay 
661e5c89e4eSSatish Balay     if (size > 1) {
662e5c89e4eSSatish Balay       if (rank) {
6639566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gather(&NN,1,MPI_INT,NULL,0,MPI_INT,0,comm));
6649566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gatherv((void*)idx,NN,MPIU_SCALAR,NULL,NULL,NULL,MPIU_SCALAR,0,comm));
665e5c89e4eSSatish Balay       } else {
6669566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(size,&sizes));
6679566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gather(&NN,1,MPI_INT,sizes,1,MPI_INT,0,comm));
668e5c89e4eSSatish Balay         Ntotal    = sizes[0];
6699566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(size,&displs));
670e5c89e4eSSatish Balay         displs[0] = 0;
671e5c89e4eSSatish Balay         for (i=1; i<size; i++) {
672e5c89e4eSSatish Balay           Ntotal   += sizes[i];
673e5c89e4eSSatish Balay           displs[i] =  displs[i-1] + sizes[i-1];
674e5c89e4eSSatish Balay         }
6759566063dSJacob Faibussowitsch         PetscCall(PetscMalloc1(Ntotal,&array));
6769566063dSJacob Faibussowitsch         PetscCallMPI(MPI_Gatherv((void*)idx,NN,MPIU_SCALAR,array,sizes,displs,MPIU_SCALAR,0,comm));
6779566063dSJacob Faibussowitsch         PetscCall(PetscViewerBinaryWrite(viewer,array,Ntotal,PETSC_SCALAR));
6789566063dSJacob Faibussowitsch         PetscCall(PetscFree(sizes));
6799566063dSJacob Faibussowitsch         PetscCall(PetscFree(displs));
6809566063dSJacob Faibussowitsch         PetscCall(PetscFree(array));
681e5c89e4eSSatish Balay       }
682e5c89e4eSSatish Balay     } else {
6839566063dSJacob Faibussowitsch       PetscCall(PetscViewerBinaryWrite(viewer,(void*) idx,N,PETSC_SCALAR));
684e5c89e4eSSatish Balay     }
685e5c89e4eSSatish Balay   } else {
686e5c89e4eSSatish Balay     const char *tname;
6879566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetName((PetscObject)viewer,&tname));
68898921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot handle that PetscViewer of type %s",tname);
689e5c89e4eSSatish Balay   }
690e5c89e4eSSatish Balay   PetscFunctionReturn(0);
691e5c89e4eSSatish Balay }
692e5c89e4eSSatish Balay 
693e22e20c5SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
694030f984aSJacob Faibussowitsch #include <petscdevice.h>
695e22e20c5SJunchao Zhang PETSC_EXTERN const char* PetscCUBLASGetErrorName(cublasStatus_t status)
696e22e20c5SJunchao Zhang {
697e22e20c5SJunchao Zhang   switch(status) {
698e22e20c5SJunchao Zhang #if (CUDART_VERSION >= 8000) /* At least CUDA 8.0 of Sep. 2016 had these */
699e22e20c5SJunchao Zhang     case CUBLAS_STATUS_SUCCESS:          return "CUBLAS_STATUS_SUCCESS";
700e22e20c5SJunchao Zhang     case CUBLAS_STATUS_NOT_INITIALIZED:  return "CUBLAS_STATUS_NOT_INITIALIZED";
701e22e20c5SJunchao Zhang     case CUBLAS_STATUS_ALLOC_FAILED:     return "CUBLAS_STATUS_ALLOC_FAILED";
702e22e20c5SJunchao Zhang     case CUBLAS_STATUS_INVALID_VALUE:    return "CUBLAS_STATUS_INVALID_VALUE";
703e22e20c5SJunchao Zhang     case CUBLAS_STATUS_ARCH_MISMATCH:    return "CUBLAS_STATUS_ARCH_MISMATCH";
704e22e20c5SJunchao Zhang     case CUBLAS_STATUS_MAPPING_ERROR:    return "CUBLAS_STATUS_MAPPING_ERROR";
705e22e20c5SJunchao Zhang     case CUBLAS_STATUS_EXECUTION_FAILED: return "CUBLAS_STATUS_EXECUTION_FAILED";
706e22e20c5SJunchao Zhang     case CUBLAS_STATUS_INTERNAL_ERROR:   return "CUBLAS_STATUS_INTERNAL_ERROR";
707e22e20c5SJunchao Zhang     case CUBLAS_STATUS_NOT_SUPPORTED:    return "CUBLAS_STATUS_NOT_SUPPORTED";
708e22e20c5SJunchao Zhang     case CUBLAS_STATUS_LICENSE_ERROR:    return "CUBLAS_STATUS_LICENSE_ERROR";
709e22e20c5SJunchao Zhang #endif
710e22e20c5SJunchao Zhang     default:                             return "unknown error";
711e22e20c5SJunchao Zhang   }
712e22e20c5SJunchao Zhang }
713a4b895e1SBarry Smith PETSC_EXTERN const char* PetscCUSolverGetErrorName(cusolverStatus_t status)
714a4b895e1SBarry Smith {
715a4b895e1SBarry Smith   switch(status) {
716a4b895e1SBarry Smith #if (CUDART_VERSION >= 8000) /* At least CUDA 8.0 of Sep. 2016 had these */
717a4b895e1SBarry Smith     case CUSOLVER_STATUS_SUCCESS:          return "CUSOLVER_STATUS_SUCCESS";
718a4b895e1SBarry Smith     case CUSOLVER_STATUS_NOT_INITIALIZED:  return "CUSOLVER_STATUS_NOT_INITIALIZED";
719a4b895e1SBarry Smith     case CUSOLVER_STATUS_INVALID_VALUE:    return "CUSOLVER_STATUS_INVALID_VALUE";
720a4b895e1SBarry Smith     case CUSOLVER_STATUS_ARCH_MISMATCH:    return "CUSOLVER_STATUS_ARCH_MISMATCH";
721a4b895e1SBarry Smith     case CUSOLVER_STATUS_INTERNAL_ERROR:   return "CUSOLVER_STATUS_INTERNAL_ERROR";
722030f984aSJacob Faibussowitsch #if (CUDART_VERSION >= 9000) /* CUDA 9.0 had these defined on June 2021 */
723030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_ALLOC_FAILED:     return "CUSOLVER_STATUS_ALLOC_FAILED";
724030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_MAPPING_ERROR:    return "CUSOLVER_STATUS_MAPPING_ERROR";
725030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_EXECUTION_FAILED: return "CUSOLVER_STATUS_EXECUTION_FAILED";
726030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED: return "CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED";
727030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_NOT_SUPPORTED :  return "CUSOLVER_STATUS_NOT_SUPPORTED ";
728030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_ZERO_PIVOT:      return "CUSOLVER_STATUS_ZERO_PIVOT";
729030f984aSJacob Faibussowitsch     case CUSOLVER_STATUS_INVALID_LICENSE: return "CUSOLVER_STATUS_INVALID_LICENSE";
730a4b895e1SBarry Smith #endif
731030f984aSJacob Faibussowitsch #endif
732030f984aSJacob Faibussowitsch     default:                             return "unknown error";
733030f984aSJacob Faibussowitsch   }
734030f984aSJacob Faibussowitsch }
735030f984aSJacob Faibussowitsch PETSC_EXTERN const char* PetscCUFFTGetErrorName(cufftResult result)
736030f984aSJacob Faibussowitsch {
737030f984aSJacob Faibussowitsch  switch (result) {
738030f984aSJacob Faibussowitsch  case CUFFT_SUCCESS:                   return "CUFFT_SUCCESS";
739030f984aSJacob Faibussowitsch  case CUFFT_INVALID_PLAN:              return "CUFFT_INVALID_PLAN";
740030f984aSJacob Faibussowitsch  case CUFFT_ALLOC_FAILED:              return "CUFFT_ALLOC_FAILED";
741030f984aSJacob Faibussowitsch  case CUFFT_INVALID_TYPE:              return "CUFFT_INVALID_TYPE";
742030f984aSJacob Faibussowitsch  case CUFFT_INVALID_VALUE:             return "CUFFT_INVALID_VALUE";
743030f984aSJacob Faibussowitsch  case CUFFT_INTERNAL_ERROR:            return "CUFFT_INTERNAL_ERROR";
744030f984aSJacob Faibussowitsch  case CUFFT_EXEC_FAILED:               return "CUFFT_EXEC_FAILED";
745030f984aSJacob Faibussowitsch  case CUFFT_SETUP_FAILED:              return "CUFFT_SETUP_FAILED";
746030f984aSJacob Faibussowitsch  case CUFFT_INVALID_SIZE:              return "CUFFT_INVALID_SIZE";
747030f984aSJacob Faibussowitsch  case CUFFT_UNALIGNED_DATA:            return "CUFFT_UNALIGNED_DATA";
748030f984aSJacob Faibussowitsch  case CUFFT_INCOMPLETE_PARAMETER_LIST: return "CUFFT_INCOMPLETE_PARAMETER_LIST";
749030f984aSJacob Faibussowitsch  case CUFFT_INVALID_DEVICE:            return "CUFFT_INVALID_DEVICE";
750030f984aSJacob Faibussowitsch  case CUFFT_PARSE_ERROR:               return "CUFFT_PARSE_ERROR";
751030f984aSJacob Faibussowitsch  case CUFFT_NO_WORKSPACE:              return "CUFFT_NO_WORKSPACE";
752030f984aSJacob Faibussowitsch  case CUFFT_NOT_IMPLEMENTED:           return "CUFFT_NOT_IMPLEMENTED";
753030f984aSJacob Faibussowitsch  case CUFFT_LICENSE_ERROR:             return "CUFFT_LICENSE_ERROR";
754030f984aSJacob Faibussowitsch  case CUFFT_NOT_SUPPORTED:             return "CUFFT_NOT_SUPPORTED";
755a4b895e1SBarry Smith  default:                              return "unknown error";
756a4b895e1SBarry Smith  }
757a4b895e1SBarry Smith }
758e22e20c5SJunchao Zhang #endif
75959af0bd3SScott Kruger 
76059af0bd3SScott Kruger #if defined(PETSC_HAVE_HIP)
761030f984aSJacob Faibussowitsch #include <petscdevice.h>
76259af0bd3SScott Kruger PETSC_EXTERN const char* PetscHIPBLASGetErrorName(hipblasStatus_t status)
76359af0bd3SScott Kruger {
76459af0bd3SScott Kruger   switch(status) {
76559af0bd3SScott Kruger     case HIPBLAS_STATUS_SUCCESS:          return "HIPBLAS_STATUS_SUCCESS";
76659af0bd3SScott Kruger     case HIPBLAS_STATUS_NOT_INITIALIZED:  return "HIPBLAS_STATUS_NOT_INITIALIZED";
76759af0bd3SScott Kruger     case HIPBLAS_STATUS_ALLOC_FAILED:     return "HIPBLAS_STATUS_ALLOC_FAILED";
76859af0bd3SScott Kruger     case HIPBLAS_STATUS_INVALID_VALUE:    return "HIPBLAS_STATUS_INVALID_VALUE";
76959af0bd3SScott Kruger     case HIPBLAS_STATUS_ARCH_MISMATCH:    return "HIPBLAS_STATUS_ARCH_MISMATCH";
77059af0bd3SScott Kruger     case HIPBLAS_STATUS_MAPPING_ERROR:    return "HIPBLAS_STATUS_MAPPING_ERROR";
77159af0bd3SScott Kruger     case HIPBLAS_STATUS_EXECUTION_FAILED: return "HIPBLAS_STATUS_EXECUTION_FAILED";
77259af0bd3SScott Kruger     case HIPBLAS_STATUS_INTERNAL_ERROR:   return "HIPBLAS_STATUS_INTERNAL_ERROR";
77359af0bd3SScott Kruger     case HIPBLAS_STATUS_NOT_SUPPORTED:    return "HIPBLAS_STATUS_NOT_SUPPORTED";
77459af0bd3SScott Kruger     default:                              return "unknown error";
77559af0bd3SScott Kruger   }
77659af0bd3SScott Kruger }
77759af0bd3SScott Kruger #endif
778db9cea48SBarry Smith 
779db9cea48SBarry Smith /*@
780db9cea48SBarry Smith       PetscMPIErrorString - Given an MPI error code returns the MPI_Error_string() appropriately
781db9cea48SBarry Smith            formatted for displaying with the PETSc error handlers.
782db9cea48SBarry Smith 
783db9cea48SBarry Smith  Input Parameter:
784db9cea48SBarry Smith .  err - the MPI error code
785db9cea48SBarry Smith 
786db9cea48SBarry Smith  Output Parameter:
787db9cea48SBarry Smith .  string - the MPI error message, should declare its length to be larger than MPI_MAX_ERROR_STRING
788db9cea48SBarry Smith 
78949c86fc7SBarry Smith    Level: developer
79049c86fc7SBarry Smith 
791db9cea48SBarry Smith  Notes:
792db9cea48SBarry Smith     Does not return an error code or do error handling because it may be called from inside an error handler
793db9cea48SBarry Smith 
794db9cea48SBarry Smith @*/
795db9cea48SBarry Smith void PetscMPIErrorString(PetscMPIInt err, char* string)
796db9cea48SBarry Smith {
797db9cea48SBarry Smith   char        errorstring[MPI_MAX_ERROR_STRING];
798db9cea48SBarry Smith   PetscMPIInt len, j = 0;
799db9cea48SBarry Smith 
800db9cea48SBarry Smith   MPI_Error_string(err,(char*)errorstring,&len);
801db9cea48SBarry Smith   for (PetscMPIInt i=0; i<len; i++) {
802db9cea48SBarry Smith     string[j++] = errorstring[i];
803db9cea48SBarry Smith     if (errorstring[i] == '\n') {
804db9cea48SBarry Smith       for (PetscMPIInt k=0; k<16; k++) string[j++] = ' ';
805db9cea48SBarry Smith     }
806db9cea48SBarry Smith   }
807db9cea48SBarry Smith   string[j] = 0;
808db9cea48SBarry Smith }
809db9cea48SBarry Smith 
810