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