xref: /petsc/include/petscerror.h (revision a9f05ab01b48311f1a4f4a3d36b06eef45c4952f)
1 /*
2     Contains all error handling interfaces for PETSc.
3 */
4 #if !defined(__PETSCERROR_H)
5 #define __PETSCERROR_H
6 
7 /*
8      These are the generic error codes. These error codes are used
9      many different places in the PETSc source code. The string versions are
10      at src/sys/error/err.c any changes here must also be made there
11      These are also define in include/petsc/finclude/petscerror.h any CHANGES here
12      must be also made there.
13 
14 */
15 #define PETSC_ERR_MIN_VALUE        54   /* should always be one less then the smallest value */
16 
17 #define PETSC_ERR_MEM              55   /* unable to allocate requested memory */
18 #define PETSC_ERR_SUP              56   /* no support for requested operation */
19 #define PETSC_ERR_SUP_SYS          57   /* no support for requested operation on this computer system */
20 #define PETSC_ERR_ORDER            58   /* operation done in wrong order */
21 #define PETSC_ERR_SIG              59   /* signal received */
22 #define PETSC_ERR_FP               72   /* floating point exception */
23 #define PETSC_ERR_COR              74   /* corrupted PETSc object */
24 #define PETSC_ERR_LIB              76   /* error in library called by PETSc */
25 #define PETSC_ERR_PLIB             77   /* PETSc library generated inconsistent data */
26 #define PETSC_ERR_MEMC             78   /* memory corruption */
27 #define PETSC_ERR_CONV_FAILED      82   /* iterative method (KSP or SNES) failed */
28 #define PETSC_ERR_USER             83   /* user has not provided needed function */
29 #define PETSC_ERR_SYS              88   /* error in system call */
30 #define PETSC_ERR_POINTER          70   /* pointer does not point to valid address */
31 
32 #define PETSC_ERR_ARG_SIZ          60   /* nonconforming object sizes used in operation */
33 #define PETSC_ERR_ARG_IDN          61   /* two arguments not allowed to be the same */
34 #define PETSC_ERR_ARG_WRONG        62   /* wrong argument (but object probably ok) */
35 #define PETSC_ERR_ARG_CORRUPT      64   /* null or corrupted PETSc object as argument */
36 #define PETSC_ERR_ARG_OUTOFRANGE   63   /* input argument, out of range */
37 #define PETSC_ERR_ARG_BADPTR       68   /* invalid pointer argument */
38 #define PETSC_ERR_ARG_NOTSAMETYPE  69   /* two args must be same object type */
39 #define PETSC_ERR_ARG_NOTSAMECOMM  80   /* two args must be same communicators */
40 #define PETSC_ERR_ARG_WRONGSTATE   73   /* object in argument is in wrong state, e.g. unassembled mat */
41 #define PETSC_ERR_ARG_TYPENOTSET   89   /* the type of the object has not yet been set */
42 #define PETSC_ERR_ARG_INCOMP       75   /* two arguments are incompatible */
43 #define PETSC_ERR_ARG_NULL         85   /* argument is null that should not be */
44 #define PETSC_ERR_ARG_UNKNOWN_TYPE 86   /* type name doesn't match any registered type */
45 
46 #define PETSC_ERR_FILE_OPEN        65   /* unable to open file */
47 #define PETSC_ERR_FILE_READ        66   /* unable to read from file */
48 #define PETSC_ERR_FILE_WRITE       67   /* unable to write to file */
49 #define PETSC_ERR_FILE_UNEXPECTED  79   /* unexpected data in file */
50 
51 #define PETSC_ERR_MAT_LU_ZRPVT     71   /* detected a zero pivot during LU factorization */
52 #define PETSC_ERR_MAT_CH_ZRPVT     81   /* detected a zero pivot during Cholesky factorization */
53 
54 #define PETSC_ERR_INT_OVERFLOW     84
55 
56 #define PETSC_ERR_FLOP_COUNT       90
57 #define PETSC_ERR_NOT_CONVERGED    91  /* solver did not converge */
58 #define PETSC_ERR_MISSING_FACTOR   92  /* MatGetFactor() failed */
59 #define PETSC_ERR_OPT_OVERWRITE    93  /* attempted to over wrote options which should not be changed */
60 
61 #define PETSC_ERR_MAX_VALUE        94  /* this is always the one more than the largest error code */
62 
63 #define PetscStringizeArg(a) #a
64 #define PetscStringize(a) PetscStringizeArg(a)
65 
66 #if defined(PETSC_USE_ERRORCHECKING)
67 
68 /*MC
69    SETERRQ - Macro to be called when an error has been detected,
70 
71    Synopsis:
72    #include <petscsys.h>
73    PetscErrorCode SETERRQ(MPI_Comm comm,PetscErrorCode ierr,char *message)
74 
75    Collective on MPI_Comm
76 
77    Input Parameters:
78 +  comm - A communicator, use PETSC_COMM_SELF unless you know all ranks of another communicator will detect the error
79 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
80 -  message - error message
81 
82   Level: beginner
83 
84    Notes:
85     Once the error handler is called the calling function is then returned from with the given error code.
86 
87     See SETERRQ1(), SETERRQ2(), SETERRQ3() for versions that take arguments
88 
89     In Fortran MPI_Abort() is always called
90 
91     Experienced users can set the error handler with PetscPushErrorHandler().
92 
93    Concepts: error^setting condition
94 
95 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3()
96 M*/
97 #define SETERRQ(comm,ierr,s) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s)
98 
99 /*MC
100    SETERRQ1 - Macro that is called when an error has been detected,
101 
102    Synopsis:
103    #include <petscsys.h>
104    PetscErrorCode SETERRQ1(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg)
105 
106    Collective on MPI_Comm
107 
108    Input Parameters:
109 +  comm - A communicator, so that the error can be collective
110 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
111 .  message - error message in the printf format
112 -  arg - argument (for example an integer, string or double)
113 
114   Level: beginner
115 
116    Notes:
117     Once the error handler is called the calling function is then returned from with the given error code.
118 
119    Experienced users can set the error handler with PetscPushErrorHandler().
120 
121    Concepts: error^setting condition
122 
123 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ(), SETERRQ2(), SETERRQ3()
124 M*/
125 #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
126 
127 /*MC
128    SETERRQ2 - Macro that is called when an error has been detected,
129 
130    Synopsis:
131    #include <petscsys.h>
132    PetscErrorCode SETERRQ2(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2)
133 
134    Collective on MPI_Comm
135 
136    Input Parameters:
137 +  comm - A communicator, so that the error can be collective
138 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
139 .  message - error message in the printf format
140 .  arg1 - argument (for example an integer, string or double)
141 -  arg2 - argument (for example an integer, string or double)
142 
143   Level: beginner
144 
145    Notes:
146     Once the error handler is called the calling function is then returned from with the given error code.
147 
148    Experienced users can set the error handler with PetscPushErrorHandler().
149 
150    Concepts: error^setting condition
151 
152 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ3()
153 M*/
154 #define SETERRQ2(comm,ierr,s,a1,a2) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2)
155 
156 /*MC
157    SETERRQ3 - Macro that is called when an error has been detected,
158 
159    Synopsis:
160    #include <petscsys.h>
161    PetscErrorCode SETERRQ3(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
162 
163    Collective on MPI_Comm
164 
165    Input Parameters:
166 +  comm - A communicator, so that the error can be collective
167 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
168 .  message - error message in the printf format
169 .  arg1 - argument (for example an integer, string or double)
170 .  arg2 - argument (for example an integer, string or double)
171 -  arg3 - argument (for example an integer, string or double)
172 
173   Level: beginner
174 
175    Notes:
176     Once the error handler is called the calling function is then returned from with the given error code.
177 
178     There are also versions for 4, 5, 6 and 7 arguments.
179 
180    Experienced users can set the error handler with PetscPushErrorHandler().
181 
182    Concepts: error^setting condition
183 
184 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
185 M*/
186 #define SETERRQ3(comm,ierr,s,a1,a2,a3) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3)
187 
188 /*MC
189    SETERRQ4 - Macro that is called when an error has been detected,
190 
191    Synopsis:
192    #include <petscsys.h>
193    PetscErrorCode SETERRQ4(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
194 
195    Collective on MPI_Comm
196 
197    Input Parameters:
198 +  comm - A communicator, so that the error can be collective
199 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
200 .  message - error message in the printf format
201 .  arg1 - argument (for example an integer, string or double)
202 .  arg2 - argument (for example an integer, string or double)
203 .  arg3 - argument (for example an integer, string or double)
204 -  arg4 - argument (for example an integer, string or double)
205 
206   Level: beginner
207 
208    Notes:
209     Once the error handler is called the calling function is then returned from with the given error code.
210 
211     There are also versions for 4, 5, 6 and 7 arguments.
212 
213    Experienced users can set the error handler with PetscPushErrorHandler().
214 
215    Concepts: error^setting condition
216 
217 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
218 M*/
219 #define SETERRQ4(comm,ierr,s,a1,a2,a3,a4) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4)
220 
221 /*MC
222    SETERRQ5 - Macro that is called when an error has been detected,
223 
224    Synopsis:
225    #include <petscsys.h>
226    PetscErrorCode SETERRQ5(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
227 
228    Collective on MPI_COmm
229 
230    Input Parameters:
231 +  comm - A communicator, so that the error can be collective
232 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
233 .  message - error message in the printf format
234 .  arg1 - argument (for example an integer, string or double)
235 .  arg2 - argument (for example an integer, string or double)
236 .  arg3 - argument (for example an integer, string or double)
237 .  arg4 - argument (for example an integer, string or double)
238 -  arg5 - argument (for example an integer, string or double)
239 
240   Level: beginner
241 
242    Notes:
243     Once the error handler is called the calling function is then returned from with the given error code.
244 
245     There are also versions for 4, 5, 6 and 7 arguments.
246 
247    Experienced users can set the error handler with PetscPushErrorHandler().
248 
249    Concepts: error^setting condition
250 
251 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
252 M*/
253 #define SETERRQ5(comm,ierr,s,a1,a2,a3,a4,a5) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5)
254 
255 /*MC
256    SETERRQ6 - Macro that is called when an error has been detected,
257 
258    Synopsis:
259    #include <petscsys.h>
260    PetscErrorCode SETERRQ6(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
261 
262    Collective on MPI_Comm
263 
264    Input Parameters:
265 +  comm - A communicator, so that the error can be collective
266 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
267 .  message - error message in the printf format
268 .  arg1 - argument (for example an integer, string or double)
269 .  arg2 - argument (for example an integer, string or double)
270 .  arg3 - argument (for example an integer, string or double)
271 .  arg4 - argument (for example an integer, string or double)
272 .  arg5 - argument (for example an integer, string or double)
273 -  arg6 - argument (for example an integer, string or double)
274 
275   Level: beginner
276 
277    Notes:
278     Once the error handler is called the calling function is then returned from with the given error code.
279 
280     There are also versions for 4, 5, 6 and 7 arguments.
281 
282    Experienced users can set the error handler with PetscPushErrorHandler().
283 
284    Concepts: error^setting condition
285 
286 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
287 M*/
288 #define SETERRQ6(comm,ierr,s,a1,a2,a3,a4,a5,a6) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6)
289 
290 /*MC
291    SETERRQ7 - Macro that is called when an error has been detected,
292 
293    Synopsis:
294    #include <petscsys.h>
295    PetscErrorCode SETERRQ7(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
296 
297    Collective on MPI_Comm
298 
299    Input Parameters:
300 +  comm - A communicator, so that the error can be collective
301 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
302 .  message - error message in the printf format
303 .  arg1 - argument (for example an integer, string or double)
304 .  arg2 - argument (for example an integer, string or double)
305 .  arg3 - argument (for example an integer, string or double)
306 .  arg4 - argument (for example an integer, string or double)
307 .  arg5 - argument (for example an integer, string or double)
308 .  arg6 - argument (for example an integer, string or double)
309 -  arg7 - argument (for example an integer, string or double)
310 
311   Level: beginner
312 
313    Notes:
314     Once the error handler is called the calling function is then returned from with the given error code.
315 
316     There are also versions for 4, 5, 6 and 7 arguments.
317 
318    Experienced users can set the error handler with PetscPushErrorHandler().
319 
320    Concepts: error^setting condition
321 
322 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
323 M*/
324 #define SETERRQ7(comm,ierr,s,a1,a2,a3,a4,a5,a6,a7) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7)
325 
326 /*MC
327    SETERRQ8 - Macro that is called when an error has been detected,
328 
329    Synopsis:
330    #include <petscsys.h>
331    PetscErrorCode SETERRQ8(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
332 
333    Collective on MPI_Comm
334 
335    Input Parameters:
336 +  comm - A communicator, so that the error can be collective
337 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
338 .  message - error message in the printf format
339 .  arg1 - argument (for example an integer, string or double)
340 .  arg2 - argument (for example an integer, string or double)
341 .  arg3 - argument (for example an integer, string or double)
342 .  arg4 - argument (for example an integer, string or double)
343 .  arg5 - argument (for example an integer, string or double)
344 .  arg6 - argument (for example an integer, string or double)
345 .  arg7 - argument (for example an integer, string or double)
346 -  arg8 - argument (for example an integer, string or double)
347 
348   Level: beginner
349 
350    Notes:
351     Once the error handler is called the calling function is then returned from with the given error code.
352 
353     There are also versions for 4, 5, 6 and 7 arguments.
354 
355    Experienced users can set the error handler with PetscPushErrorHandler().
356 
357    Concepts: error^setting condition
358 
359 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
360 M*/
361 #define SETERRQ8(comm,ierr,s,a1,a2,a3,a4,a5,a6,a7,a8) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7,a8)
362 
363 /*MC
364    SETERRABORT - Macro that can be called when an error has been detected,
365 
366    Synopsis:
367    #include <petscsys.h>
368    PetscErrorCode SETERRABORT(MPI_Comm comm,PetscErrorCode ierr,char *message)
369 
370    Collective on MPI_Comm
371 
372    Input Parameters:
373 +  comm - A communicator, so that the error can be collective
374 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
375 -  message - error message in the printf format
376 
377   Level: beginner
378 
379    Notes:
380     This function just calls MPI_Abort().
381 
382    Concepts: error^setting condition
383 
384 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
385 M*/
386 #define SETERRABORT(comm,ierr,s) do {PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s);MPI_Abort(comm,ierr);} while (0)
387 
388 /*MC
389    CHKERRQ - Checks error code, if non-zero it calls the error handler and then returns
390 
391    Synopsis:
392    #include <petscsys.h>
393    PetscErrorCode CHKERRQ(PetscErrorCode ierr)
394 
395    Not Collective
396 
397    Input Parameters:
398 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
399 
400   Level: beginner
401 
402    Notes:
403     Once the error handler is called the calling function is then returned from with the given error code.
404 
405     Experienced users can set the error handler with PetscPushErrorHandler().
406 
407     CHKERRQ(ierr) is fundamentally a macro replacement for
408          if (ierr) return(PetscError(...,ierr,...));
409 
410     Although typical usage resembles "void CHKERRQ(PetscErrorCode)" as described above, for certain uses it is
411     highly inappropriate to use it in this manner as it invokes return(PetscErrorCode). In particular,
412     it cannot be used in functions which return(void) or any other datatype.  In these types of functions,
413     you can use CHKERRV() which returns without an error code (bad idea since the error is ignored or
414          if (ierr) {PetscError(....); return(YourReturnType);}
415     where you may pass back a NULL to indicate an error. You can also call CHKERRABORT(comm,n) to have
416     MPI_Abort() returned immediately.
417 
418     In Fortran MPI_Abort() is always called
419 
420    Concepts: error^setting condition
421 
422 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2()
423 M*/
424 #define CHKERRQ(ierr)          do {if (PetscUnlikely(ierr)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");} while (0)
425 
426 #define CHKERRV(ierr)          do {if (PetscUnlikely(ierr)) {ierr = PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");return;}} while(0)
427 #define CHKERRABORT(comm,ierr) do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");MPI_Abort(comm,ierr);}} while (0)
428 #define CHKERRCONTINUE(ierr)   do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");}} while (0)
429 
430 #ifdef PETSC_CLANGUAGE_CXX
431 
432 /*MC
433    CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception
434 
435    Synopsis:
436    #include <petscsys.h>
437    void CHKERRXX(PetscErrorCode ierr)
438 
439    Not Collective
440 
441    Input Parameters:
442 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
443 
444   Level: beginner
445 
446    Notes:
447     Once the error handler throws a ??? exception.
448 
449     You can use CHKERRV() which returns without an error code (bad idea since the error is ignored)
450     or CHKERRABORT(comm,n) to have MPI_Abort() returned immediately.
451 
452    Concepts: error^setting condition
453 
454 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKERRQ(), CHKMEMQ
455 M*/
456 #define CHKERRXX(ierr)  do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_IN_CXX,0);}} while(0)
457 
458 #endif
459 
460 #define CHKERRCUDA(err)   do {if (PetscUnlikely(err)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUDA error %d",err);} while(0)
461 #define CHKERRCUBLAS(err) do {if (PetscUnlikely(err)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUBLAS error %d",err);} while(0)
462 
463 /*MC
464    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
465 
466    Synopsis:
467    #include <petscsys.h>
468    CHKMEMQ;
469 
470    Not Collective
471 
472   Level: beginner
473 
474    Notes:
475     We highly recommend using valgrind http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind for finding memory problems. This is useful
476     on systems that do not have valgrind, but much much less useful.
477 
478     Must run with the option -malloc_debug to enable this option
479 
480     Once the error handler is called the calling function is then returned from with the given error code.
481 
482     By defaults prints location where memory that is corrupted was allocated.
483 
484     Use CHKMEMA for functions that return void
485 
486    Concepts: memory corruption
487 
488 .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(),
489           PetscMallocValidate()
490 M*/
491 #define CHKMEMQ do {PetscErrorCode _7_ierr = PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__);CHKERRQ(_7_ierr);} while(0)
492 
493 #define CHKMEMA PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__)
494 
495 #else /* PETSC_USE_ERRORCHECKING */
496 
497 /*
498     These are defined to be empty for when error checking is turned off, with ./configure --with-errorchecking=0
499 */
500 
501 #define SETERRQ(c,ierr,s)
502 #define SETERRQ1(c,ierr,s,a1)
503 #define SETERRQ2(c,ierr,s,a1,a2)
504 #define SETERRQ3(c,ierr,s,a1,a2,a3)
505 #define SETERRQ4(c,ierr,s,a1,a2,a3,a4)
506 #define SETERRQ5(c,ierr,s,a1,a2,a3,a4,a5)
507 #define SETERRQ6(c,ierr,s,a1,a2,a3,a4,a5,a6)
508 #define SETERRQ7(c,ierr,s,a1,a2,a3,a4,a5,a6,a7)
509 #define SETERRQ8(c,ierr,s,a1,a2,a3,a4,a5,a6,a7,a8)
510 #define SETERRABORT(comm,ierr,s)
511 
512 #define CHKERRQ(ierr)     ;
513 #define CHKERRV(ierr)     ;
514 #define CHKERRABORT(comm,n) ;
515 #define CHKERRCONTINUE(ierr) ;
516 #define CHKMEMQ        ;
517 #define CHKERRCUDA(err) ;
518 #define CHKERRCUBLAS(err) ;
519 
520 #ifdef PETSC_CLANGUAGE_CXX
521 #define CHKERRXX(ierr) ;
522 #endif
523 
524 #endif /* PETSC_USE_ERRORCHECKING */
525 
526 /*E
527   PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers
528 
529   Level: advanced
530 
531   PETSC_ERROR_IN_CXX indicates the error was detected in C++ and an exception should be generated
532 
533   Developer Notes: This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandler()
534 
535 .seealso: PetscError(), SETERRXX()
536 E*/
537 typedef enum {PETSC_ERROR_INITIAL=0,PETSC_ERROR_REPEAT=1,PETSC_ERROR_IN_CXX = 2} PetscErrorType;
538 
539 #if defined(__clang_analyzer__)
540 __attribute__((analyzer_noreturn))
541 #endif
542 PETSC_EXTERN PetscErrorCode PetscError(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,...);
543 
544 PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void);
545 PETSC_EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **);
546 PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
547 PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
548 PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
549 PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
550 PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
551 PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
552 PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
553 PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void*);
554 PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void);
555 PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int,void*);
556 PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*);
557 PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void);
558 PETSC_EXTERN PetscErrorCode PetscCheckPointerSetIntensity(PetscInt);
559 
560 /*MC
561     PetscErrorPrintf - Prints error messages.
562 
563    Synopsis:
564     #include <petscsys.h>
565      PetscErrorCode (*PetscErrorPrintf)(const char format[],...);
566 
567     Not Collective
568 
569     Input Parameters:
570 .   format - the usual printf() format string
571 
572    Options Database Keys:
573 +    -error_output_stdout - cause error messages to be printed to stdout instead of the  (default) stderr
574 -    -error_output_none - to turn off all printing of error messages (does not change the way the error is handled.)
575 
576    Notes: Use
577 $     PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the
578 $                        error is handled.) and
579 $     PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on or you can use your own function
580 
581           Use
582      PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file.
583      PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file.
584 
585           Use
586       PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print
587 
588    Level: developer
589 
590     Fortran Note:
591     This routine is not supported in Fortran.
592 
593     Concepts: error messages^printing
594     Concepts: printing^error messages
595 
596 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf(), PetscPrintf(), PetscErrorHandlerPush(), PetscVFPrintf(), PetscHelpPrintf()
597 M*/
598 PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[],...);
599 
600 typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap;
601 PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap);
602 PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap);
603 PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void);
604 
605 /*
606       Allows the code to build a stack frame as it runs
607 */
608 
609 #define PETSCSTACKSIZE 64
610 
611 typedef struct  {
612   const char      *function[PETSCSTACKSIZE];
613   const char      *file[PETSCSTACKSIZE];
614         int       line[PETSCSTACKSIZE];
615         PetscBool petscroutine[PETSCSTACKSIZE];
616         int       currentsize;
617         int       hotdepth;
618 } PetscStack;
619 
620 PETSC_EXTERN PetscStack *petscstack;
621 
622 PetscErrorCode  PetscStackCopy(PetscStack*,PetscStack*);
623 PetscErrorCode  PetscStackPrint(PetscStack *,FILE*);
624 #if defined(PETSC_USE_DEBUG)
625 PETSC_STATIC_INLINE PetscBool PetscStackActive(void)
626 {
627   return(petscstack ? PETSC_TRUE : PETSC_FALSE);
628 }
629 
630 /* Stack handling is based on the following two "NoCheck" macros.  These should only be called directly by other error
631  * handling macros.  We record the line of the call, which may or may not be the location of the definition.  But is at
632  * least more useful than "unknown" because it can distinguish multiple calls from the same function.
633  */
634 
635 #define PetscStackPushNoCheck(funct,petsc_routine,hot)                        \
636   do {                                                                        \
637     PetscStackSAWsTakeAccess();                                                \
638     if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {         \
639       petscstack->function[petscstack->currentsize]  = funct;               \
640       petscstack->file[petscstack->currentsize]      = __FILE__;            \
641       petscstack->line[petscstack->currentsize]      = __LINE__;            \
642       petscstack->petscroutine[petscstack->currentsize] = petsc_routine;    \
643       petscstack->currentsize++;                                             \
644     }                                                                         \
645     if (petscstack) {                                                        \
646       petscstack->hotdepth += (hot || petscstack->hotdepth);                \
647     }                                                                         \
648     PetscStackSAWsGrantAccess();                                               \
649   } while (0)
650 
651 #define PetscStackPopNoCheck                                            \
652   do {                                                                  \
653     PetscStackSAWsTakeAccess();                                          \
654     if (petscstack && petscstack->currentsize > 0) {                  \
655       petscstack->currentsize--;                                       \
656       petscstack->function[petscstack->currentsize]  = 0;             \
657       petscstack->file[petscstack->currentsize]      = 0;             \
658       petscstack->line[petscstack->currentsize]      = 0;             \
659       petscstack->petscroutine[petscstack->currentsize] = PETSC_FALSE;\
660     }                                                                   \
661     if (petscstack) {                                                  \
662       petscstack->hotdepth = PetscMax(petscstack->hotdepth-1,0);      \
663     }                                                                   \
664     PetscStackSAWsGrantAccess();                                         \
665   } while (0)
666 
667 /*MC
668    PetscFunctionBegin - First executable line of each PETSc function,  used for error handling. Final
669       line of PETSc functions should be PetscFunctionReturn(0);
670 
671    Synopsis:
672    #include <petscsys.h>
673    void PetscFunctionBegin;
674 
675    Not Collective
676 
677    Usage:
678 .vb
679      int something;
680 
681      PetscFunctionBegin;
682 .ve
683 
684    Notes:
685      Use PetscFunctionBeginUser for application codes.
686 
687      Not available in Fortran
688 
689    Level: developer
690 
691 .seealso: PetscFunctionReturn(), PetscFunctionBeginHot(), PetscFunctionBeginUser()
692 
693 .keywords: traceback, error handling
694 M*/
695 #define PetscFunctionBegin do {                                        \
696     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE,PETSC_FALSE); \
697     PetscRegister__FUNCT__();                                          \
698   } while (0)
699 
700 /*MC
701    PetscFunctionBeginHot - Substitute for PetscFunctionBegin to be used in functions that are called in
702    performance-critical circumstances.  Use of this function allows for lighter profiling by default.
703 
704    Synopsis:
705    #include <petscsys.h>
706    void PetscFunctionBeginHot;
707 
708    Not Collective
709 
710    Usage:
711 .vb
712      int something;
713 
714      PetscFunctionBeginHot;
715 .ve
716 
717    Notes:
718      Not available in Fortran
719 
720    Level: developer
721 
722 .seealso: PetscFunctionBegin, PetscFunctionReturn()
723 
724 .keywords: traceback, error handling
725 M*/
726 #define PetscFunctionBeginHot do {                                     \
727     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE,PETSC_TRUE);  \
728     PetscRegister__FUNCT__();                                          \
729   } while (0)
730 
731 /*MC
732    PetscFunctionBeginUser - First executable line of user provided PETSc routine
733 
734    Synopsis:
735    #include <petscsys.h>
736    void PetscFunctionBeginUser;
737 
738    Not Collective
739 
740    Usage:
741 .vb
742      int something;
743 
744      PetscFunctionBeginUser;
745 .ve
746 
747    Notes:
748       Final line of PETSc functions should be PetscFunctionReturn(0) except for main().
749 
750       Not available in Fortran
751 
752       This is identical to PetscFunctionBegin except it labels the routine as a user
753       routine instead of as a PETSc library routine.
754 
755    Level: intermediate
756 
757 .seealso: PetscFunctionReturn(), PetscFunctionBegin, PetscFunctionBeginHot
758 
759 .keywords: traceback, error handling
760 M*/
761 #define PetscFunctionBeginUser                                          \
762   do {                                                                  \
763     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_FALSE,PETSC_FALSE); \
764     PetscRegister__FUNCT__();                                           \
765   } while (0)
766 
767 
768 #if defined(PETSC_SERIALIZE_FUNCTIONS)
769 #include <petsc/private/petscfptimpl.h>
770 /*
771    Registers the current function into the global function pointer to function name table
772 
773    Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc
774 */
775 #define PetscRegister__FUNCT__() do { \
776   static PetscBool __chked = PETSC_FALSE; \
777   if (!__chked) {\
778   void *ptr; PetscDLSym(NULL,PETSC_FUNCTION_NAME,&ptr);\
779   __chked = PETSC_TRUE;\
780   }} while (0)
781 #else
782 #define PetscRegister__FUNCT__()
783 #endif
784 
785 #define PetscStackPush(n) \
786   do {                                                                  \
787     PetscStackPushNoCheck(n,PETSC_FALSE,PETSC_FALSE);                   \
788     CHKMEMQ;                                                            \
789   } while (0)
790 
791 #define PetscStackPop                           \
792     do {                                        \
793       CHKMEMQ;                                  \
794       PetscStackPopNoCheck;                     \
795     } while (0)
796 
797 /*MC
798    PetscFunctionReturn - Last executable line of each PETSc function
799         used for error handling. Replaces return()
800 
801    Synopsis:
802    #include <petscsys.h>
803    void PetscFunctionReturn(0);
804 
805    Not Collective
806 
807    Usage:
808 .vb
809     ....
810      PetscFunctionReturn(0);
811    }
812 .ve
813 
814    Notes:
815      Not available in Fortran
816 
817    Level: developer
818 
819 .seealso: PetscFunctionBegin()
820 
821 .keywords: traceback, error handling
822 M*/
823 #define PetscFunctionReturn(a) \
824   do {                                                                \
825     PetscStackPopNoCheck;                                             \
826     return(a);} while (0)
827 
828 #define PetscFunctionReturnVoid() \
829   do {                                                                \
830     PetscStackPopNoCheck;                                             \
831     return;} while (0)
832 
833 #else
834 
835 PETSC_STATIC_INLINE PetscBool PetscStackActive(void) {return PETSC_FALSE;}
836 #define PetscStackPushNoCheck(funct,petsc_routine,hot) do {} while (0)
837 #define PetscStackPopNoCheck                           do {} while (0)
838 #define PetscFunctionBegin
839 #define PetscFunctionBeginUser
840 #define PetscFunctionBeginHot
841 #define PetscFunctionReturn(a)    return(a)
842 #define PetscFunctionReturnVoid() return
843 #define PetscStackPop             CHKMEMQ
844 #define PetscStackPush(f)         CHKMEMQ
845 
846 #endif
847 
848 /*
849     PetscStackCall - Calls an external library routine or user function after pushing the name of the routine on the stack.
850 
851    Input Parameters:
852 +   name - string that gives the name of the function being called
853 -   routine - actual call to the routine, including ierr = and CHKERRQ(ierr);
854 
855    Note: Often one should use PetscStackCallStandard() instead. This routine is intended for external library routines that DO NOT return error codes
856 
857    Developer Note: this is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc.
858 
859 
860 
861 */
862 #define PetscStackCall(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while(0)
863 
864 /*
865     PetscStackCallStandard - Calls an external library routine after pushing the name of the routine on the stack.
866 
867    Input Parameters:
868 +   func-  name of the routine
869 -   args - arguments to the routine surrounded by ()
870 
871    Notes: This is intended for external package routines that return error codes. Use PetscStackCall() for those that do not.
872 
873    Developer Note: this is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc.
874 
875 */
876 #define PetscStackCallStandard(func,args) do {                        \
877     PetscStackPush(#func);ierr = func args;PetscStackPop; if (ierr) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s(): error code %d",#func,(int)ierr); \
878   } while (0)
879 
880 PETSC_EXTERN PetscErrorCode PetscStackCreate(void);
881 PETSC_EXTERN PetscErrorCode PetscStackView(FILE*);
882 PETSC_EXTERN PetscErrorCode PetscStackDestroy(void);
883 
884 #endif
885