xref: /petsc/include/petscerror.h (revision e33ced7f1259e0d8fe47f0fb829d6b7e8bd05a92)
1 /*
2     Contains all error handling interfaces for PETSc.
3 */
4 #if !defined(PETSCERROR_H)
5 #define PETSCERROR_H
6 
7 #include <petscmacros.h>
8 #include <petscsystypes.h>
9 
10 /* SUBMANSEC = Sys */
11 
12 /*
13      These are the generic error codes. These error codes are used
14      many different places in the PETSc source code. The string versions are
15      at src/sys/error/err.c any changes here must also be made there
16      These are also define in src/sys/f90-mod/petscerror.h any CHANGES here
17      must be also made there.
18 
19 */
20 #define PETSC_ERR_MIN_VALUE        54   /* should always be one less then the smallest value */
21 
22 #define PETSC_ERR_MEM              55   /* unable to allocate requested memory */
23 #define PETSC_ERR_SUP              56   /* no support for requested operation */
24 #define PETSC_ERR_SUP_SYS          57   /* no support for requested operation on this computer system */
25 #define PETSC_ERR_ORDER            58   /* operation done in wrong order */
26 #define PETSC_ERR_SIG              59   /* signal received */
27 #define PETSC_ERR_FP               72   /* floating point exception */
28 #define PETSC_ERR_COR              74   /* corrupted PETSc object */
29 #define PETSC_ERR_LIB              76   /* error in library called by PETSc */
30 #define PETSC_ERR_PLIB             77   /* PETSc library generated inconsistent data */
31 #define PETSC_ERR_MEMC             78   /* memory corruption */
32 #define PETSC_ERR_CONV_FAILED      82   /* iterative method (KSP or SNES) failed */
33 #define PETSC_ERR_USER             83   /* user has not provided needed function */
34 #define PETSC_ERR_SYS              88   /* error in system call */
35 #define PETSC_ERR_POINTER          70   /* pointer does not point to valid address */
36 #define PETSC_ERR_MPI_LIB_INCOMP   87   /* MPI library at runtime is not compatible with MPI user compiled with */
37 
38 #define PETSC_ERR_ARG_SIZ          60   /* nonconforming object sizes used in operation */
39 #define PETSC_ERR_ARG_IDN          61   /* two arguments not allowed to be the same */
40 #define PETSC_ERR_ARG_WRONG        62   /* wrong argument (but object probably ok) */
41 #define PETSC_ERR_ARG_CORRUPT      64   /* null or corrupted PETSc object as argument */
42 #define PETSC_ERR_ARG_OUTOFRANGE   63   /* input argument, out of range */
43 #define PETSC_ERR_ARG_BADPTR       68   /* invalid pointer argument */
44 #define PETSC_ERR_ARG_NOTSAMETYPE  69   /* two args must be same object type */
45 #define PETSC_ERR_ARG_NOTSAMECOMM  80   /* two args must be same communicators */
46 #define PETSC_ERR_ARG_WRONGSTATE   73   /* object in argument is in wrong state, e.g. unassembled mat */
47 #define PETSC_ERR_ARG_TYPENOTSET   89   /* the type of the object has not yet been set */
48 #define PETSC_ERR_ARG_INCOMP       75   /* two arguments are incompatible */
49 #define PETSC_ERR_ARG_NULL         85   /* argument is null that should not be */
50 #define PETSC_ERR_ARG_UNKNOWN_TYPE 86   /* type name doesn't match any registered type */
51 
52 #define PETSC_ERR_FILE_OPEN        65   /* unable to open file */
53 #define PETSC_ERR_FILE_READ        66   /* unable to read from file */
54 #define PETSC_ERR_FILE_WRITE       67   /* unable to write to file */
55 #define PETSC_ERR_FILE_UNEXPECTED  79   /* unexpected data in file */
56 
57 #define PETSC_ERR_MAT_LU_ZRPVT     71   /* detected a zero pivot during LU factorization */
58 #define PETSC_ERR_MAT_CH_ZRPVT     81   /* detected a zero pivot during Cholesky factorization */
59 
60 #define PETSC_ERR_INT_OVERFLOW     84
61 
62 #define PETSC_ERR_FLOP_COUNT       90
63 #define PETSC_ERR_NOT_CONVERGED    91  /* solver did not converge */
64 #define PETSC_ERR_MISSING_FACTOR   92  /* MatGetFactor() failed */
65 #define PETSC_ERR_OPT_OVERWRITE    93  /* attempted to over write options which should not be changed */
66 #define PETSC_ERR_WRONG_MPI_SIZE   94  /* example/application run with number of MPI ranks it does not support */
67 #define PETSC_ERR_USER_INPUT       95  /* missing or incorrect user input */
68 #define PETSC_ERR_GPU_RESOURCE     96  /* unable to load a GPU resource, for example cuBLAS */
69 #define PETSC_ERR_GPU              97  /* An error from a GPU call, this may be due to lack of resources on the GPU or a true error in the call */
70 #define PETSC_ERR_MPI              98  /* general MPI error */
71 #define PETSC_ERR_MAX_VALUE        99  /* this is always the one more than the largest error code */
72 
73 #define SETERRQ1(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
74 #define SETERRQ2(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
75 #define SETERRQ3(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
76 #define SETERRQ4(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
77 #define SETERRQ5(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
78 #define SETERRQ6(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
79 #define SETERRQ7(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
80 #define SETERRQ8(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
81 #define SETERRQ9(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
82 
83 /*MC
84    SETERRQ - Macro to be called when an error has been detected,
85 
86    Synopsis:
87    #include <petscsys.h>
88    PetscErrorCode SETERRQ(MPI_Comm comm,PetscErrorCode ierr,char *message,...)
89 
90    Collective
91 
92    Input Parameters:
93 +  comm - A communicator, use PETSC_COMM_SELF unless you know all ranks of another communicator will detect the error
94 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
95 -  message - error message
96 
97   Level: beginner
98 
99    Notes:
100     Once the error handler is called the calling function is then returned from with the given error code.
101 
102     Experienced users can set the error handler with PetscPushErrorHandler().
103 
104    Fortran Notes:
105       SETERRQ() may be called from Fortran subroutines but SETERRA() must be called from the
106       Fortran main program.
107 
108 .seealso: `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`,
109           `PetscError()`, `PetscCall()`, `CHKMEMQ`, `CHKERRA()`, `PetscCallMPI()`
110 M*/
111 #define SETERRQ(comm,ierr,...) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,__VA_ARGS__)
112 
113 /*
114     Returned from PETSc functions that are called from MPI, such as related to attributes
115       Do not confuse PETSC_MPI_ERROR_CODE and PETSC_ERR_MPI, the first is registered with MPI and returned to MPI as
116       an error code, the latter is a regular PETSc error code passed within PETSc code indicating an error was detected in an MPI call.
117 */
118 PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CLASS;
119 PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CODE;
120 
121 /*MC
122    SETERRMPI - Macro to be called when an error has been detected within an MPI callback function
123 
124    Synopsis:
125    #include <petscsys.h>
126    PetscErrorCode SETERRMPI(MPI_Comm comm,PetscErrorCode ierr,char *message,...)
127 
128    Collective
129 
130    Input Parameters:
131 +  comm - A communicator, use PETSC_COMM_SELF unless you know all ranks of another communicator will detect the error
132 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
133 -  message - error message
134 
135   Level: developer
136 
137    Notes:
138     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
139     which is registered with MPI_Add_error_code() when PETSc is initialized.
140 
141 .seealso: `SETERRQ()`, `PetscCall()`, `PetscCallMPI()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
142 M*/
143 #define SETERRMPI(comm,ierr,...) return (PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,__VA_ARGS__),PETSC_MPI_ERROR_CODE)
144 
145 /*MC
146    SETERRA - Fortran-only macro that can be called when an error has been detected from the main program
147 
148    Synopsis:
149    #include <petscsys.h>
150    PetscErrorCode SETERRA(MPI_Comm comm,PetscErrorCode ierr,char *message)
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 
159   Level: beginner
160 
161    Notes:
162     This should only be used with Fortran. With C/C++, use SETERRQ().
163 
164    Fortran Notes:
165       SETERRQ() may be called from Fortran subroutines but SETERRA() must be called from the
166       Fortran main program.
167 
168 .seealso: `SETERRQ()`, `SETERRABORT()`, `PetscCall()`, `CHKERRA()`, `PetscCallAbort()`
169 M*/
170 
171 /*MC
172    SETERRABORT - Macro that can be called when an error has been detected,
173 
174    Synopsis:
175    #include <petscsys.h>
176    PetscErrorCode SETERRABORT(MPI_Comm comm,PetscErrorCode ierr,char *message,...)
177 
178    Collective
179 
180    Input Parameters:
181 +  comm - A communicator, so that the error can be collective
182 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
183 -  message - error message in the printf format
184 
185   Level: beginner
186 
187    Notes:
188     This function just calls MPI_Abort().
189 
190 .seealso: `SETERRQ()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `PetscCall()`, `CHKMEMQ`
191 M*/
192 #define SETERRABORT(comm,ierr,...) do {                                                        \
193     PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,__VA_ARGS__); \
194     MPI_Abort(comm,ierr);                                                                      \
195   } while (0)
196 
197 /*MC
198   PetscCheck - Check that a particular condition is true
199 
200   Synopsis:
201   #include <petscerror.h>
202   void PetscCheck(bool cond, MPI_Comm comm, PetscErrorCode ierr, const char *message, ...)
203 
204   Collective
205 
206   Input Parameters:
207 + cond    - The boolean condition
208 . comm    - The communicator on which the check can be collective on
209 . ierr    - A nonzero error code, see include/petscerror.h for the complete list
210 - message - Error message in printf format
211 
212   Notes:
213   Enabled in both optimized and debug builds.
214 
215   Calls SETERRQ() if the assertion fails, so can only be called from functions returning a
216   PetscErrorCode (or equivalent type after conversion).
217 
218   Level: beginner
219 
220 .seealso: `PetscAssert()`, `SETERRQ()`, `PetscError()`, `PetscCall()`, `PetscCheckAbort()`
221 M*/
222 #define PetscCheck(cond,comm,ierr,...) do { if (PetscUnlikely(!(cond))) SETERRQ(comm,ierr,__VA_ARGS__); } while (0)
223 
224 /*MC
225   PetscCheckAbort - Check that a particular condition is true, otherwise prints error and aborts
226 
227   Synopsis:
228   #include <petscerror.h>
229   void PetscCheckAbort(bool cond, MPI_Comm comm, PetscErrorCode ierr, const char *message, ...)
230 
231   Collective
232 
233   Input Parameters:
234 + cond    - The boolean condition
235 . comm    - The communicator on which the check can be collective on
236 . ierr    - A nonzero error code, see include/petscerror.h for the complete list
237 - message - Error message in printf format
238 
239   Notes:
240   Enabled in both optimized and debug builds.
241 
242   Calls SETERRABORT() if the assertion fails, can be called from a function that does not return an
243   error code. usually `PetscCheck()` should be used.
244 
245   Level: developer
246 
247 .seealso: `PetscAssert()`, `SETERRQ()`, `PetscError()`, `PetscCall()`, `PetscCheck()`, `SETTERRABORT()`
248 M*/
249 #define PetscCheckAbort(cond,comm,ierr,...) if (PetscUnlikely(!(cond))) SETERRABORT(comm,ierr,__VA_ARGS__)
250 
251 /*MC
252   PetscAssert - Assert that a particular condition is true
253 
254   Synopsis:
255   #include <petscerror.h>
256   void PetscAssert(bool cond, MPI_Comm comm, PetscErrorCode ierr, const char *message, ...)
257 
258   Collective
259 
260   Input Parameters:
261 + cond    - The boolean condition
262 . comm    - The communicator on which the check can be collective on
263 . ierr    - A nonzero error code, see include/petscerror.h for the complete list
264 - message - Error message in printf format
265 
266   Notes:
267   Enabled only in debug builds. Note that any arguments to this macros are still visible to the
268   compiler optimized builds (so must still contain valid code) but are guaranteed to not be
269   executed.
270 
271   See PetscCheck() for usage and behaviour.
272 
273   Level: beginner
274 
275 .seealso: `PetscCheck()`, `SETERRQ()`, `PetscError()`
276 M*/
277 #define PetscAssert(cond,comm,ierr,...) do { if (PetscUnlikelyDebug(!(cond))) SETERRQ(comm,ierr,__VA_ARGS__); } while (0)
278 
279 /*MC
280   PetscCall - Calls a PETSc function and then checks the resulting error code, if it is non-zero it calls the error
281   handler and returns from the current function with the error code.
282 
283   Synopsis:
284   #include <petscerror.h>
285   void PetscCall(PetscFunction(args))
286 
287   Not Collective
288 
289   Input Parameter:
290 . PetscFunction - any PETSc function that returns an error code
291 
292   Notes:
293   Once the error handler is called the calling function is then returned from with the given
294   error code. Experienced users can set the error handler with PetscPushErrorHandler().
295 
296   PetscCall() cannot be used in functions returning a datatype not convertible to
297   PetscErrorCode. For example, PetscCall() may not be used in functions returning void, use
298   PetscCallVoid() in this case.
299 
300   Example Usage:
301 .vb
302   PetscCall(PetscInitiailize(...)); // OK to call even when PETSc is not yet initialized!
303 
304   struct my_struct
305   {
306     void *data;
307   } my_complex_type;
308 
309   struct my_struct bar(void)
310   {
311     PetscCall(foo(15)); // ERROR PetscErrorCode not convertible to struct my_struct!
312   }
313 
314   PetscCall(bar()) // ERROR input not convertible to PetscErrorCode
315 .ve
316 
317   It is also possible to call this directly on a PetscErrorCode variable
318 .vb
319   PetscCall(ierr);  // check if ierr is nonzero
320 .ve
321 
322   Should not be used to call callback functions provided by users, `PetscCallBack()` should be used in that situation.
323 
324   Fortran Notes:
325     The Fortran function from which this is used must declare a variable PetscErrorCode ierr and ierr must be
326     the final argument to the PetscFunction being called.
327 
328     In the main program and in Fortran subroutines that do not have ierr as the final return parameter one
329     should use PetscCallA()
330 
331   Example Fortran Usage:
332 .vb
333   PetscErrorCode ierr
334   Vec v
335 
336   ...
337   PetscCall(VecShift(v,1.0,ierr))
338   PetscCallA(VecShift(v,1.0,ierr))
339 .ve
340 
341   Level: beginner
342 
343 .seealso: `SETERRQ()`, `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscCallMPI()`
344           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`, `CHKERRA()`, `CHKERRMPI()`, `PetscCallBack()`
345 M*/
346 
347 /*MC
348   PetscCallBack - Calls a user provided PETSc callback function and then checks the resulting error code, if it is non-zero it calls the error
349   handler and returns from the current function with the error code.
350 
351   Synopsis:
352   #include <petscerror.h>
353   void PetscCallBack(const char *functionname,PetscFunction(args))
354 
355   Not Collective
356 
357   Input Parameters:
358 + functionname - the name of the function being called, this can be a string with spaces that describes the meaning of the callback
359 - PetscFunction - any PETSc function that returns an error code
360 
361   Notes:
362   Once the error handler is called the calling function is then returned from with the given
363   error code. Experienced users can set the error handler with PetscPushErrorHandler().
364 
365   PetscCallBack() should only be called in PETSc when a call is being made to a user provided call-back routine.
366 
367   Example Usage:
368 .vb
369   PetscCallBack("XXX callback to do something",a->callback(...));
370 .ve
371 
372   Level: developer
373 
374 .seealso: `SETERRQ()`, `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscCallMPI()`
375           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`, `CHKERRA()`, `CHKERRMPI()`, `PetscCall()`
376 M*/
377 
378 #if defined(PETSC_CLANG_STATIC_ANALYZER)
379 void PetscCall(PetscErrorCode);
380 void PetscCallBack(const char *,PetscErrorCode);
381 void PetscCallVoid(PetscErrorCode);
382 #else
383 #define PetscCall(...) do {                                             \
384     PetscErrorCode ierr_q_;                                             \
385     PetscStackUpdateLine;                                               \
386     ierr_q_ = __VA_ARGS__;                                              \
387     if (PetscUnlikely(ierr_q_)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_q_,PETSC_ERROR_REPEAT," "); \
388   } while (0)
389 #define PetscCallBack(function,...) do {                                \
390     PetscErrorCode ierr_q_;                                             \
391     PetscStackUpdateLine;                                               \
392     PetscStackPushExternal(function);                                   \
393     ierr_q_ = __VA_ARGS__;                                              \
394     PetscStackPop;                                                      \
395     if (PetscUnlikely(ierr_q_)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_q_,PETSC_ERROR_REPEAT," "); \
396   } while (0)
397 #define PetscCallVoid(...) do {                                         \
398     PetscErrorCode ierr_void_;                                          \
399     PetscStackUpdateLine;                                               \
400     ierr_void_ = __VA_ARGS__;                                           \
401     if (PetscUnlikely(ierr_void_)) {(void)PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_void_,PETSC_ERROR_REPEAT," "); return;} \
402   } while (0)
403 #endif
404 
405 /*MC
406   CHKERRQ - Checks error code returned from PETSc function
407 
408   Synopsis:
409   #include <petscsys.h>
410   void CHKERRQ(PetscErrorCode ierr)
411 
412   Not Collective
413 
414   Input Parameters:
415 . ierr - nonzero error code
416 
417   Notes:
418   Deprecated in favor of PetscCall(). This routine behaves identically to it.
419 
420   Level: deprecated
421 
422 .seealso: `PetscCall()`
423 M*/
424 #define CHKERRQ(...) PetscCall(__VA_ARGS__)
425 #define CHKERRV(...) PetscCallVoid(__VA_ARGS__)
426 
427 PETSC_EXTERN void PetscMPIErrorString(PetscMPIInt, char*);
428 
429 /*MC
430   PetscCallMPI - Checks error code returned from MPI calls, if non-zero it calls the error
431   handler and then returns
432 
433   Synopsis:
434   #include <petscerror.h>
435   void PetscCallMPI(MPI_Function(args))
436 
437   Not Collective
438 
439   Input Parameters:
440 . MPI_Function - an MPI function that returns an MPI error code
441 
442   Notes:
443   Always returns the error code PETSC_ERR_MPI; the MPI error code and string are embedded in
444   the string error message. Do not use this to call any other routines (for example PETSc
445   routines), it should only be used for direct MPI calls. Due to limitations of the
446   preprocessor this can unfortunately not easily be enforced, so the user should take care to
447   check this themselves.
448 
449   Example Usage:
450 .vb
451   PetscCallMPI(MPI_Comm_size(...)); // OK, calling MPI function
452 
453   PetscCallMPI(PetscFunction(...)); // ERROR, use PetscCall() instead!
454 .ve
455 
456   Fortran Notes:
457     The Fortran function from which this is used must declare a variable PetscErrorCode ierr and ierr must be
458     the final argument to the MPI function being called.
459 
460     In the main program and in Fortran subroutines that do not have ierr as the final return parameter one
461     should use PetscCallMPIA()
462 
463   Fortran Usage:
464 .vb
465   PetscErrorCode ierr or integer ierr
466   ...
467   PetscCallMPI(MPI_Comm_size(...,ierr))
468   PetscCallMPIA(MPI_Comm_size(...,ierr)) ! Will abort after calling error handler
469 
470   PetscCallMPI(MPI_Comm_size(...,eflag)) ! ERROR, final argument must be ierr
471 .ve
472 
473   Level: beginner
474 
475 .seealso: `SETERRMPI()`, `PetscCall()`, `SETERRQ()`, `SETERRABORT()`, `PetscCallAbort()`,
476           `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
477 M*/
478 #if defined(PETSC_CLANG_STATIC_ANALYZER)
479 void PetscCallMPI(PetscMPIInt);
480 #else
481 #define PetscCallMPI(...) do {                                          \
482     PetscMPIInt _7_errorcode;                                           \
483     char _7_errorstring[2*MPI_MAX_ERROR_STRING];                        \
484     PetscStackUpdateLine;                                               \
485     PetscStackPushExternal("MPI function");                             \
486     {_7_errorcode = __VA_ARGS__;}                                       \
487     PetscStackPop;                                                      \
488     if (PetscUnlikely(_7_errorcode)) {                                  \
489       PetscMPIErrorString(_7_errorcode,(char*)_7_errorstring);          \
490       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MPI,"MPI error %d %s",(int)_7_errorcode,_7_errorstring); \
491     }                                                                   \
492   } while (0)
493 #endif
494 
495 /*MC
496   CHKERRMPI - Checks error code returned from MPI calls, if non-zero it calls the error
497   handler and then returns
498 
499   Synopsis:
500   #include <petscerror.h>
501   void CHKERRMPI(PetscErrorCode ierr)
502 
503   Not Collective
504 
505   Input Parameter:
506 . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
507 
508   Notes:
509   Deprecated in favor of PetscCallMPI(). This routine behaves identically to it.
510 
511   Level: deprecated
512 
513 .seealso: `PetscCallMPI()`
514 M*/
515 #define CHKERRMPI(...) PetscCallMPI(__VA_ARGS__)
516 
517 /*MC
518   PetscCallAbort - Checks error code returned from PETSc function, if non-zero it aborts immediately
519 
520   Synopsis:
521   #include <petscerror.h>
522   void PetscCallAbort(MPI_Comm comm, PetscErrorCode ierr)
523 
524   Collective on comm
525 
526   Input Parameters:
527 + comm - the MPI communicator on which to abort
528 - ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
529 
530   Notes:
531   This macro has identical type and usage semantics to PetscCall() with the important caveat
532   that this macro does not return. Instead, if ierr is nonzero it calls the PETSc error handler
533   and then immediately calls MPI_Abort(). It can therefore be used anywhere.
534 
535   As per MPI_Abort semantics the communicator passed must be valid, although there is currently
536   no attempt made at handling any potential errors from MPI_Abort(). Note that while
537   MPI_Abort() is required to terminate only those processes which reside on comm, it is often
538   the case that MPI_Abort() terminates *all* processes.
539 
540   Example Usage:
541 .vb
542   PetscErrorCode boom(void) { return PETSC_ERR_MEM; }
543 
544   void foo(void)
545   {
546     PetscCallAbort(PETSC_COMM_WORLD,boom()); // OK, does not return a type
547   }
548 
549   double bar(void)
550   {
551     PetscCallAbort(PETSC_COMM_WORLD,boom()); // OK, does not return a type
552   }
553 
554   PetscCallAbort(MPI_COMM_NULL,boom()); // ERROR, communicator should be valid
555 
556   struct baz
557   {
558     baz()
559     {
560       PetscCallAbort(PETSC_COMM_SELF,boom()); // OK
561     }
562 
563     ~baz()
564     {
565       PetscCallAbort(PETSC_COMM_SELF,boom()); // OK (in fact the only way to handle PETSc errors)
566     }
567   };
568 .ve
569 
570   Level: intermediate
571 
572 .seealso: `SETERRABORT()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`,
573           `SETERRQ()`, `CHKMEMQ`, `PetscCallMPI()`
574 M*/
575 #if defined(PETSC_CLANG_STATIC_ANALYZER)
576 void PetscCallAbort(MPI_Comm,PetscErrorCode);
577 void PetscCallContinue(PetscErrorCode);
578 #else
579 #define PetscCallAbort(comm,...) do {                                                          \
580     PetscErrorCode ierr_abort_ = __VA_ARGS__;                                                  \
581     if (PetscUnlikely(ierr_abort_)) {                                                          \
582       PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_abort_,PETSC_ERROR_REPEAT," "); \
583       MPI_Abort(comm,ierr_abort_);                                                             \
584     }                                                                                          \
585   } while (0)
586 #define PetscCallContinue(...)   do {                                                          \
587     PetscErrorCode ierr_continue_ = __VA_ARGS__;                                               \
588     if (PetscUnlikely(ierr_continue_)) PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_continue_,PETSC_ERROR_REPEAT," "); \
589   } while (0)
590 #endif
591 
592 /*MC
593   CHKERRABORT - Checks error code returned from PETSc function. If non-zero it aborts immediately.
594 
595   Synopsis:
596   #include <petscerror.h>
597   void CHKERRABORT(MPI_Comm comm, PetscErrorCode ierr)
598 
599   Not Collective
600 
601   Input Parameters:
602 + comm - the MPI communicator
603 - ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
604 
605   Notes:
606   Deprecated in favor of PetscCallAbort(). This routine behaves identically to it.
607 
608   Level: deprecated
609 
610 .seealso: `PetscCallAbort()`
611 M*/
612 #define CHKERRABORT(comm,...) PetscCallAbort(comm,__VA_ARGS__)
613 #define CHKERRCONTINUE(...)   PetscCallContinue(__VA_ARGS__)
614 
615 /*MC
616    CHKERRA - Fortran-only replacement for PetscCall in the main program, which aborts immediately
617 
618    Synopsis:
619    #include <petscsys.h>
620    PetscErrorCode CHKERRA(PetscErrorCode ierr)
621 
622    Not Collective
623 
624    Input Parameters:
625 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
626 
627   Level: beginner
628 
629    Notes:
630       This should only be used with Fortran. With C/C++, use PetscCall() in normal usage,
631       or PetscCallAbort() if wanting to abort immediately on error.
632 
633    Fortran Notes:
634       PetscCall() may be called from Fortran subroutines but CHKERRA() must be called from the
635       Fortran main program.
636 
637 .seealso: `PetscCall()`, `PetscCallAbort()`, `SETERRA()`, `SETERRQ()`, `SETERRABORT()`
638 M*/
639 
640 PETSC_EXTERN PetscBool petscwaitonerrorflg;
641 PETSC_EXTERN PetscBool petscindebugger;
642 
643 /*MC
644    PETSCABORT - Call MPI_Abort with an informative error code
645 
646    Synopsis:
647    #include <petscsys.h>
648    PETSCABORT(MPI_Comm comm, PetscErrorCode ierr)
649 
650    Collective
651 
652    Input Parameters:
653 +  comm - A communicator, so that the error can be collective
654 -  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
655 
656    Level: advanced
657 
658    Notes:
659    If the option -start_in_debugger was used then this calls abort() to stop the program in the debugger.
660 
661    if PetscCIEnabledPortableErrorOutput it strives to exit cleanly without call `MPI_Abort()`
662 
663  M*/
664 #define PETSCABORT(comm,...) do {                                                              \
665     if (petscwaitonerrorflg) PetscSleep(1000);                                                 \
666     if (petscindebugger) abort();                                                              \
667     else {                                                                                     \
668       PetscErrorCode ierr_petsc_abort_ = __VA_ARGS__;                                          \
669       PetscMPIInt    size;                                                                     \
670       MPI_Comm_size(comm,&size);                                                               \
671       if (PetscCIEnabledPortableErrorOutput && size == PetscGlobalSize && ierr_petsc_abort_ != PETSC_ERR_SIG) { \
672         MPI_Finalize(); exit(0);                                                               \
673       } else if (PetscCIEnabledPortableErrorOutput && PetscGlobalSize == 1) {                  \
674         exit(0);                                                        \
675       } else {                                                                                 \
676         MPI_Abort(comm,(PetscMPIInt)ierr_petsc_abort_);                 \
677       }                                                                                        \
678     }                                                                                          \
679   } while (0)
680 
681 #ifdef PETSC_CLANGUAGE_CXX
682 /*MC
683   PetscCallThrow - Checks error code, if non-zero it calls the C++ error handler which throws
684   an exception
685 
686   Synopsis:
687   #include <petscerror.h>
688   void PetscCallThrow(PetscErrorCode ierr)
689 
690   Not Collective
691 
692   Input Parameter:
693 . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
694 
695   Notes:
696   Requires PETSc to be configured with clanguage = c++. Throws a std::runtime_error() on error.
697 
698   Once the error handler throws the exception you can use PetscCallVoid() which returns without
699   an error code (bad idea since the error is ignored) or PetscCallAbort() to have MPI_Abort()
700   called immediately.
701 
702   Level: beginner
703 
704 .seealso: `SETERRQ()`, `PetscCall()`, `SETERRABORT()`, `PetscCallAbort()`, `PetscTraceBackErrorHandler()`,
705           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
706 M*/
707 #define PetscCallThrow(...) do {                                                                    \
708     PetscErrorCode ierr_cxx_ = __VA_ARGS__;                                                    \
709     if (PetscUnlikely(ierr_cxx_)) PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_cxx_,PETSC_ERROR_IN_CXX,PETSC_NULLPTR); \
710   } while (0)
711 
712 /*MC
713   CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception
714 
715   Synopsis:
716   #include <petscerror.h>
717   void CHKERRXX(PetscErrorCode ierr)
718 
719   Not Collective
720 
721   Input Parameter:
722 . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
723 
724   Notes:
725   Deprecated in favor of PetscCallThrow(). This routine behaves identically to it.
726 
727   Level: deprecated
728 
729 .seealso: `PetscCallThrow()`
730 M*/
731 #define CHKERRXX(...) PetscCallThrow(__VA_ARGS__)
732 #endif
733 
734 /*MC
735   PetscCallCXX - Checks C++ function calls and if they throw an exception, catch it and then
736   return a PETSc error code
737 
738   Synopsis:
739   #include <petscerror.h>
740   void PetscCallCXX(expr) noexcept;
741 
742   Not Collective
743 
744   Input Parameter:
745 . expr - An arbitrary expression
746 
747   Notes:
748   PetscCallCXX(expr) is a macro replacement for
749 .vb
750   try {
751     expr;
752   } catch (const std::exception& e) {
753     return ConvertToPetscErrorCode(e);
754   }
755 .ve
756   Due to the fact that it catches any (reasonable) exception, it is essentially noexcept.
757 
758   Example Usage:
759 .vb
760   void foo(void) { throw std::runtime_error("error"); }
761 
762   void bar()
763   {
764     PetscCallCXX(foo()); // ERROR bar() does not return PetscErrorCode
765   }
766 
767   PetscErrorCode baz()
768   {
769     PetscCallCXX(foo()); // OK
770 
771     PetscCallCXX(
772       bar();
773       foo(); // OK mutliple statements allowed
774     );
775   }
776 
777   struct bop
778   {
779     bop()
780     {
781       PetscCallCXX(foo()); // ERROR returns PetscErrorCode, cannot be used in constructors
782     }
783   };
784 
785   // ERROR contains do-while, cannot be used as function-try block
786   PetscErrorCode qux() PetscCallCXX(
787     bar();
788     baz();
789     foo();
790     return 0;
791   )
792 .ve
793 
794   Level: beginner
795 
796 .seealso: `PetscCallThrow()`, `SETERRQ()`, `PetscCall()`, `SETERRABORT()`, `PetscCallAbort()`,
797           `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
798 M*/
799 #define PetscCallCXX(...) do {                                  \
800     PetscStackUpdateLine;                                       \
801     try {                                                       \
802       __VA_ARGS__;                                              \
803     } catch (const std::exception& e) {                         \
804       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"%s",e.what());     \
805     }                                                           \
806   } while (0)
807 
808 /*MC
809   CHKERRCXX - Checks C++ function calls and if they throw an exception, catch it and then
810   return a PETSc error code
811 
812   Synopsis:
813   #include <petscerror.h>
814   void CHKERRCXX(func) noexcept;
815 
816   Not Collective
817 
818   Input Parameter:
819 . func - C++ function calls
820 
821   Notes:
822   Deprecated in favor of PetscCallCXX(). This routine behaves identically to it.
823 
824   Level: deprecated
825 
826 .seealso: `PetscCallCXX()`
827 M*/
828 #define CHKERRCXX(...) PetscCallCXX(__VA_ARGS__)
829 
830 /*MC
831    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
832 
833    Synopsis:
834    #include <petscsys.h>
835    CHKMEMQ;
836 
837    Not Collective
838 
839   Level: beginner
840 
841    Notes:
842     We highly recommend using Valgrind https://petsc.org/release/faq/#valgrind or for NVIDIA CUDA systems
843     https://docs.nvidia.com/cuda/cuda-memcheck/index.html for finding memory problems. The ``CHKMEMQ`` macro is useful on systems that
844     do not have valgrind, but is not as good as valgrind or cuda-memcheck.
845 
846     Must run with the option -malloc_debug (-malloc_test in debug mode; or if PetscMallocSetDebug() called) to enable this option
847 
848     Once the error handler is called the calling function is then returned from with the given error code.
849 
850     By defaults prints location where memory that is corrupted was allocated.
851 
852     Use CHKMEMA for functions that return void
853 
854 .seealso: `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `SETERRQ()`, `PetscMallocValidate()`
855 M*/
856 #if defined(PETSC_CLANG_STATIC_ANALYZER)
857 #define CHKMEMQ
858 #define CHKMEMA
859 #else
860 #define CHKMEMQ PetscCall(PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__));
861 #define CHKMEMA PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__)
862 #endif
863 
864 /*E
865   PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers
866 
867   Level: advanced
868 
869   PETSC_ERROR_IN_CXX indicates the error was detected in C++ and an exception should be generated
870 
871   Developer Notes:
872     This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandler()
873 
874 .seealso: `PetscError()`, `SETERRXX()`
875 E*/
876 typedef enum {PETSC_ERROR_INITIAL=0,PETSC_ERROR_REPEAT=1,PETSC_ERROR_IN_CXX = 2} PetscErrorType;
877 
878 #if defined(__clang_analyzer__)
879 __attribute__((analyzer_noreturn))
880 #endif
881 PETSC_EXTERN PetscErrorCode PetscError(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,...) PETSC_ATTRIBUTE_COLD PETSC_ATTRIBUTE_FORMAT(7,8);
882 
883 PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void);
884 PETSC_EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **);
885 PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
886 PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
887 PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
888 PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
889 PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
890 PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
891 PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
892 PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void*);
893 PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void);
894 PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int,void*);
895 PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*);
896 PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void);
897 PETSC_EXTERN PetscErrorCode PetscCheckPointerSetIntensity(PetscInt);
898 PETSC_EXTERN void PetscSignalSegvCheckPointerOrMpi(void);
899 PETSC_DEPRECATED_FUNCTION("Use PetscSignalSegvCheckPointerOrMpi() (since version 3.13)") static inline void PetscSignalSegvCheckPointer(void) {PetscSignalSegvCheckPointerOrMpi();}
900 
901 /*MC
902     PetscErrorPrintf - Prints error messages.
903 
904    Synopsis:
905     #include <petscsys.h>
906      PetscErrorCode (*PetscErrorPrintf)(const char format[],...);
907 
908     Not Collective
909 
910     Input Parameter:
911 .   format - the usual printf() format string
912 
913    Options Database Keys:
914 +    -error_output_stdout - cause error messages to be printed to stdout instead of the  (default) stderr
915 -    -error_output_none - to turn off all printing of error messages (does not change the way the error is handled.)
916 
917    Notes:
918     Use
919 $     PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the
920 $                        error is handled.) and
921 $     PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on or you can use your own function
922 
923           Use
924      PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file.
925      PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file.
926 
927           Use
928       PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print
929 
930    Level: developer
931 
932     Fortran Note:
933     This routine is not supported in Fortran.
934 
935 .seealso: `PetscFPrintf()`, `PetscSynchronizedPrintf()`, `PetscHelpPrintf()`, `PetscPrintf()`, `PetscPushErrorHandler()`, `PetscVFPrintf()`, `PetscHelpPrintf()`
936 M*/
937 PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[],...) PETSC_ATTRIBUTE_FORMAT(1,2);
938 
939 /*E
940      PetscFPTrap - types of floating point exceptions that may be trapped
941 
942      Currently only PETSC_FP_TRAP_OFF and PETSC_FP_TRAP_ON are handled. All others are treated as PETSC_FP_TRAP_ON.
943 
944      Level: intermediate
945 
946 .seealso: `PetscSetFPTrap()`, `PetscPushFPTrap()`
947  E*/
948 typedef enum {PETSC_FP_TRAP_OFF=0, PETSC_FP_TRAP_INDIV=1, PETSC_FP_TRAP_FLTOPERR=2, PETSC_FP_TRAP_FLTOVF=4, PETSC_FP_TRAP_FLTUND=8, PETSC_FP_TRAP_FLTDIV=16, PETSC_FP_TRAP_FLTINEX=32} PetscFPTrap;
949 #define  PETSC_FP_TRAP_ON  (PETSC_FP_TRAP_INDIV | PETSC_FP_TRAP_FLTOPERR | PETSC_FP_TRAP_FLTOVF | PETSC_FP_TRAP_FLTDIV | PETSC_FP_TRAP_FLTINEX)
950 PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap);
951 PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap);
952 PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void);
953 PETSC_EXTERN PetscErrorCode PetscDetermineInitialFPTrap(void);
954 
955 /*
956       Allows the code to build a stack frame as it runs
957 */
958 
959 #if defined(PETSC_USE_DEBUG)
960 #define PETSCSTACKSIZE 64
961 typedef struct  {
962   const char *function[PETSCSTACKSIZE];
963   const char *file[PETSCSTACKSIZE];
964         int  line[PETSCSTACKSIZE];
965         int  petscroutine[PETSCSTACKSIZE]; /* 0 external called from petsc, 1 petsc functions, 2 petsc user functions */
966         int  currentsize;
967         int  hotdepth;
968         PetscBool  check; /* option to check for correct Push/Pop semantics, true for default petscstack but not other stacks */
969 } PetscStack;
970 PETSC_EXTERN PetscStack petscstack;
971 #else
972 typedef struct {
973   char Silence_empty_struct_has_size_0_in_C_size_1_in_Cpp;
974 } PetscStack;
975 #endif
976 
977 #if defined(PETSC_SERIALIZE_FUNCTIONS)
978 #include <petsc/private/petscfptimpl.h>
979 /*
980    Registers the current function into the global function pointer to function name table
981 
982    Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc
983 */
984 #define PetscRegister__FUNCT__() do { \
985   static PetscBool __chked = PETSC_FALSE; \
986   if (!__chked) {\
987   void *ptr; PetscDLSym(NULL,PETSC_FUNCTION_NAME,&ptr);\
988   __chked = PETSC_TRUE;\
989   }} while (0)
990 #else
991 #define PetscRegister__FUNCT__()
992 #endif
993 
994 #if defined(PETSC_CLANG_STATIC_ANALYZER)
995 #define PetscStackPushNoCheck(funct,petsc_routine,hot)
996 #define PetscStackUpdateLine
997 #define PetscStackPushExternal(funct)
998 #define PetscStackPopNoCheck
999 #define PetscStackClearTop
1000 #define PetscFunctionBegin
1001 #define PetscFunctionBeginUser
1002 #define PetscFunctionBeginHot
1003 #define PetscFunctionReturn(a)    return a
1004 #define PetscFunctionReturnVoid() return
1005 #define PetscStackPop
1006 #define PetscStackPush(f)
1007 #elif defined(PETSC_USE_DEBUG)
1008 
1009 #define PetscStackPush_Private(stack__,file__,func__,line__,petsc_routine__,hot__) do { \
1010     if (stack__.currentsize < PETSCSTACKSIZE) {                                         \
1011       stack__.function[stack__.currentsize]     = func__;                               \
1012       if (petsc_routine__) {                                                            \
1013         stack__.file[stack__.currentsize]         = file__;                             \
1014         stack__.line[stack__.currentsize]         = line__;                             \
1015       } else {                                                                          \
1016         stack__.file[stack__.currentsize]         = PETSC_NULLPTR;                      \
1017         stack__.line[stack__.currentsize]         = 0;                                  \
1018       }                                                                                 \
1019       stack__.petscroutine[stack__.currentsize] = petsc_routine__;                      \
1020     }                                                                                   \
1021     ++stack__.currentsize;                                                              \
1022     stack__.hotdepth += (hot__ || stack__.hotdepth);                                    \
1023   } while (0)
1024 
1025 /* uses PetscCheckAbort() because may be used in a function that does not return an error code */
1026 #define PetscStackPop_Private(stack__,func__) do {                                             \
1027     PetscCheckAbort(!stack__.check || stack__.currentsize > 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Invalid stack size %d, pop %s %s:%d.\n",stack__.currentsize,func__,__FILE__,__LINE__);\
1028     if (--stack__.currentsize < PETSCSTACKSIZE) {\
1029       PetscCheckAbort(!stack__.check || stack__.petscroutine[stack__.currentsize] != 1 || stack__.function[stack__.currentsize] == (const char*)(func__),PETSC_COMM_SELF,PETSC_ERR_PLIB,"Invalid stack: push from %s %s:%d. Pop from %s %s:%d.\n",stack__.function[stack__.currentsize],stack__.file[stack__.currentsize],stack__.line[stack__.currentsize],func__,__FILE__,__LINE__); \
1030       stack__.function[stack__.currentsize]     = PETSC_NULLPTR;                             \
1031       stack__.file[stack__.currentsize]         = PETSC_NULLPTR;                             \
1032       stack__.line[stack__.currentsize]         = 0;                                         \
1033       stack__.petscroutine[stack__.currentsize] = 0;                                         \
1034     }                                                                                        \
1035     stack__.hotdepth = PetscMax(stack__.hotdepth-1,0);                                       \
1036   } while (0)
1037 
1038 /*MC
1039    PetscStackPushNoCheck - Pushes a new function name and line number onto the PETSc default stack that tracks where the running program is
1040    currently in the source code.
1041 
1042    Not Collective
1043 
1044    Synopsis:
1045    #include <petscsys.h>
1046    void PetscStackPushNoCheck(char *funct,int petsc_routine,PetscBool hot);
1047 
1048    Input Parameters:
1049 +  funct - the function name
1050 .  petsc_routine - 2 user function, 1 PETSc function, 0 some other function
1051 -  hot - indicates that the function may be called often so expensive error checking should be turned off inside the function
1052 
1053    Level: developer
1054 
1055    Notes:
1056    In debug mode PETSc maintains a stack of the current function calls that can be used to help to quickly see where a problem has
1057    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1058    help debug the problem.
1059 
1060    This version does not check the memory corruption (an expensive operation), use `PetscStackPush()` to check the memory.
1061 
1062    Use `PetscStackPushExternal()` for a function call that is about to be made to a non-PETSc or user function (such as BLAS etc).
1063 
1064    The default stack is a global variable called `petscstack`.
1065 
1066    In general the line number is at the beginning of the function (where `PetscFunctionBegin` is called) so it is not accurate
1067 
1068 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1069           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPush()`, `PetscStackPop`,
1070           `PetscStackPushExternal()`
1071 M*/
1072 #define PetscStackPushNoCheck(funct,petsc_routine,hot) do {                             \
1073     PetscStackSAWsTakeAccess();                                                         \
1074     PetscStackPush_Private(petscstack,__FILE__,funct,__LINE__,petsc_routine,hot);       \
1075     PetscStackSAWsGrantAccess();                                                        \
1076   } while (0)
1077 
1078 /*MC
1079    PetscStackUpdateLine - in a function that has a PetscFunctionBegin or PetscFunctionBeginUser updates the stack line number to the
1080    current line number.
1081 
1082    Not Collective
1083 
1084    Synopsis:
1085    #include <petscsys.h>
1086    void PetscStackUpdateLine
1087 
1088    Level: developer
1089 
1090    Notes:
1091    In debug mode PETSc maintains a stack of the current function calls that can be used to help to quickly see where a problem has
1092    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1093    help debug the problem.
1094 
1095    The default stack is a global variable called petscstack.
1096 
1097    This is used by `PetscCall()` and is otherwise not like to be needed
1098 
1099 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPop`, `PetscCall()`
1100 M*/
1101 #define PetscStackUpdateLine                                         \
1102   if (petscstack.currentsize > 0 && petscstack.function[petscstack.currentsize-1] == PETSC_FUNCTION_NAME){ \
1103     petscstack.line[petscstack.currentsize-1] = __LINE__;              \
1104   }
1105 
1106 /*MC
1107    PetscStackPushExternal - Pushes a new function name onto the PETSc default stack that tracks where the running program is
1108    currently in the source code. Does not include the filename or line number since this is called by the calling routine
1109    for non-PETSc or user functions.
1110 
1111    Not Collective
1112 
1113    Synopsis:
1114    #include <petscsys.h>
1115    void PetscStackPushExternal(char *funct);
1116 
1117    Input Parameters:
1118 .  funct - the function name
1119 
1120    Level: developer
1121 
1122    Notes:
1123    In debug mode PETSc maintains a stack of the current function calls that can be used to help to quickly see where a problem has
1124    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1125    help debug the problem.
1126 
1127    The default stack is a global variable called `petscstack`.
1128 
1129    This is to be used when calling an external package function such as a BLAS function.
1130 
1131    This also updates the stack line number for the current stack function.
1132 
1133 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1134           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1135 M*/
1136 #define PetscStackPushExternal(funct) do {PetscStackUpdateLine; PetscStackPushNoCheck(funct,0,PETSC_TRUE);} while (0);
1137 
1138 /*MC
1139    PetscStackPopNoCheck - Pops a function name from the PETSc default stack that tracks where the running program is
1140    currently in the source code.
1141 
1142    Not Collective
1143 
1144    Synopsis:
1145    #include <petscsys.h>
1146    void PetscStackPopNoCheck(char *funct);
1147 
1148    Input Parameter:
1149 .   funct - the function name
1150 
1151    Level: developer
1152 
1153    Notes:
1154    In debug mode PETSc maintains a stack of the current function calls that can be used to help to quickly see where a problem has
1155    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1156    help debug the problem.
1157 
1158    The default stack is a global variable called petscstack.
1159 
1160    Developer Note:
1161    `PetscStackPopNoCheck()` takes a function argument while  `PetscStackPop` does not, this difference is likely just historical.
1162 
1163 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1164 M*/
1165 #define PetscStackPopNoCheck(funct)                    do {     \
1166     PetscStackSAWsTakeAccess();                                 \
1167     PetscStackPop_Private(petscstack,funct);                    \
1168     PetscStackSAWsGrantAccess();                                \
1169   } while (0)
1170 
1171 #define PetscStackClearTop                             do {             \
1172     PetscStackSAWsTakeAccess();                                         \
1173     if (petscstack.currentsize > 0 &&                                   \
1174         --petscstack.currentsize < PETSCSTACKSIZE) {                    \
1175       petscstack.function[petscstack.currentsize]     = PETSC_NULLPTR;  \
1176       petscstack.file[petscstack.currentsize]         = PETSC_NULLPTR;  \
1177       petscstack.line[petscstack.currentsize]         = 0;              \
1178       petscstack.petscroutine[petscstack.currentsize] = 0;              \
1179     }                                                                   \
1180     petscstack.hotdepth = PetscMax(petscstack.hotdepth-1,0);            \
1181     PetscStackSAWsGrantAccess();                                        \
1182   } while (0)
1183 
1184 /*MC
1185    PetscFunctionBegin - First executable line of each PETSc function,  used for error handling. Final
1186       line of PETSc functions should be PetscFunctionReturn(0);
1187 
1188    Synopsis:
1189    #include <petscsys.h>
1190    void PetscFunctionBegin;
1191 
1192    Not Collective
1193 
1194    Usage:
1195 .vb
1196      int something;
1197 
1198      PetscFunctionBegin;
1199 .ve
1200 
1201    Notes:
1202      Use PetscFunctionBeginUser for application codes.
1203 
1204      Not available in Fortran
1205 
1206    Level: developer
1207 
1208 .seealso: `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`
1209 
1210 M*/
1211 #define PetscFunctionBegin do {                               \
1212     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,1,PETSC_FALSE); \
1213     PetscRegister__FUNCT__();                                 \
1214   } while (0)
1215 
1216 /*MC
1217    PetscFunctionBeginHot - Substitute for PetscFunctionBegin to be used in functions that are called in
1218    performance-critical circumstances.  Use of this function allows for lighter profiling by default.
1219 
1220    Synopsis:
1221    #include <petscsys.h>
1222    void PetscFunctionBeginHot;
1223 
1224    Not Collective
1225 
1226    Usage:
1227 .vb
1228      int something;
1229 
1230      PetscFunctionBeginHot;
1231 .ve
1232 
1233    Notes:
1234      Not available in Fortran
1235 
1236    Level: developer
1237 
1238 .seealso: `PetscFunctionBegin`, `PetscFunctionReturn()`, `PetscStackPushNoCheck()`
1239 
1240 M*/
1241 #define PetscFunctionBeginHot do {                           \
1242     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,1,PETSC_TRUE); \
1243     PetscRegister__FUNCT__();                                \
1244   } while (0)
1245 
1246 /*MC
1247    PetscFunctionBeginUser - First executable line of user provided routines
1248 
1249    Synopsis:
1250    #include <petscsys.h>
1251    void PetscFunctionBeginUser;
1252 
1253    Not Collective
1254 
1255    Usage:
1256 .vb
1257      int something;
1258 
1259      PetscFunctionBeginUser;
1260 .ve
1261 
1262    Notes:
1263       Functions that incorporate this must call `PetscFunctionReturn()` instead of return except for main().
1264 
1265       May be used before `PetscInitialize()`
1266 
1267       Not available in Fortran
1268 
1269       This is identical to `PetscFunctionBegin` except it labels the routine as a user
1270       routine instead of as a PETSc library routine.
1271 
1272    Level: intermediate
1273 
1274 .seealso: `PetscFunctionReturn()`, `PetscFunctionBegin`, `PetscFunctionBeginHot`, `PetscStackPushNoCheck()`
1275 
1276 M*/
1277 #define PetscFunctionBeginUser do {                           \
1278     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,2,PETSC_FALSE); \
1279     PetscRegister__FUNCT__();                                 \
1280   } while (0)
1281 
1282 /*MC
1283    PetscStackPush - Pushes a new function name and line number onto the PETSc default stack that tracks where the running program is
1284    currently in the source code and verifies the memory is not corrupted.
1285 
1286    Not Collective
1287 
1288    Synopsis:
1289    #include <petscsys.h>
1290    void PetscStackPush(char *funct)
1291 
1292    Input Parameter:
1293 .  funct - the function name
1294 
1295    Level: developer
1296 
1297    Notes:
1298    In debug mode PETSc maintains a stack of the current function calls that can be used to help to quickly see where a problem has
1299    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1300    help debug the problem.
1301 
1302    The default stack is a global variable called petscstack.
1303 
1304    In general the line number is at the beginning of the function (where `PetscFunctionBegin` is called) so it is not accurate
1305 
1306 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1307           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1308 M*/
1309 #define PetscStackPush(n)       do {        \
1310     PetscStackPushNoCheck(n,0,PETSC_FALSE); \
1311     CHKMEMQ;                                \
1312   } while (0)
1313 
1314 /*MC
1315    PetscStackPop - Pops a function name from the PETSc default stack that tracks where the running program is
1316    currently in the source code and verifies the memory is not corrupted.
1317 
1318    Not Collective
1319 
1320    Synopsis:
1321    #include <petscsys.h>
1322    void PetscStackPop
1323 
1324    Level: developer
1325 
1326    Notes:
1327    In debug mode PETSc maintains a stack of the current function calls that can be used to help to quickly see where a problem has
1328    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1329    help debug the problem.
1330 
1331    The default stack is a global variable called petscstack.
1332 
1333 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPopNoCheck()`, `PetscStackPush()`
1334 M*/
1335 #define PetscStackPop           do {       \
1336       CHKMEMQ;                                   \
1337       PetscStackPopNoCheck(PETSC_FUNCTION_NAME); \
1338     } while (0)
1339 
1340 /*MC
1341    PetscFunctionReturn - Last executable line of each PETSc function
1342         used for error handling. Replaces return()
1343 
1344    Synopsis:
1345    #include <petscsys.h>
1346    void PetscFunctionReturn(0);
1347 
1348    Not Collective
1349 
1350    Usage:
1351 .vb
1352     ....
1353      PetscFunctionReturn(0);
1354    }
1355 .ve
1356 
1357    Notes:
1358      Not available in Fortran
1359 
1360    Level: developer
1361 
1362 .seealso: `PetscFunctionBegin()`, `PetscStackPopNoCheck()`
1363 
1364 M*/
1365 #define PetscFunctionReturn(a)    do {          \
1366     PetscStackPopNoCheck(PETSC_FUNCTION_NAME);  \
1367     return a;                                   \
1368   } while (0)
1369 
1370 #define PetscFunctionReturnVoid() do {          \
1371     PetscStackPopNoCheck(PETSC_FUNCTION_NAME);  \
1372     return;                                     \
1373   } while (0)
1374 #else /* PETSC_USE_DEBUG */
1375 #define PetscStackPushNoCheck(funct,petsc_routine,hot)
1376 #define PetscStackUpdateLine
1377 #define PetscStackPushExternal(funct)
1378 #define PetscStackPopNoCheck
1379 #define PetscStackClearTop
1380 #define PetscFunctionBegin
1381 #define PetscFunctionBeginUser
1382 #define PetscFunctionBeginHot
1383 #define PetscFunctionReturn(a)    return a
1384 #define PetscFunctionReturnVoid() return
1385 #define PetscStackPop             CHKMEMQ
1386 #define PetscStackPush(f)         CHKMEMQ
1387 #endif /* PETSC_USE_DEBUG */
1388 
1389 #if defined(PETSC_CLANG_STATIC_ANALYZER)
1390 #define PetscStackCallExternalVoid(name,routine)
1391 #define PetscCallExternal(func,...)
1392 #else
1393 /*MC
1394     PetscStackCallExternalVoid - Calls an external library routine or user function after pushing the name of the routine on the stack.
1395 
1396    Input Parameters:
1397 +   name - string that gives the name of the function being called
1398 -   routine - actual call to the routine, for example, functionname(a,b)
1399 
1400    Level: developer
1401 
1402    Note:
1403    Often one should use `PetscCallExternal()` instead. This routine is intended for external library routines that DO NOT return error codes
1404 
1405    In debug mode this also checks the memory for corruption at the end of the function call.
1406 
1407    Certain external packages, such as BLAS/LAPACK may have their own macros for managing the call, error checking, etc.
1408 
1409    Developer Note:
1410    This is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc.
1411 
1412 .seealso: `PetscCall()`, `PetscStackPushNoCheck()`, `PetscStackPush()`, `PetscCallExternal()`, `PetscCallBLAS()`
1413 @*/
1414 #define PetscStackCallExternalVoid(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while (0)
1415 
1416 /*MC
1417     PetscCallExternal - Calls an external library routine that returns an error code after pushing the name of the routine on the stack.
1418 
1419    Input Parameters:
1420 +   func-  name of the routine
1421 -   args - arguments to the routine
1422 
1423    Level: developer
1424 
1425    Notes:
1426    This is intended for external package routines that return error codes. Use `PetscStackCallExternalVoid()` for those that do not.
1427 
1428    In debug mode this also checks the memory for corruption at the end of the function call.
1429 
1430    Developer Note:
1431    This is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc.
1432 
1433 .seealso: `PetscCall()`, `PetscStackPushNoCheck()`, `PetscStackPush()`, `PetscStackCallExternalVoid()`
1434 M*/
1435 #define PetscCallExternal(func,...) do {                                                  \
1436     PetscStackPush(PetscStringize(func));                                                      \
1437     PetscErrorCode __ierr = func(__VA_ARGS__);                                                 \
1438     PetscStackPop;                                                                             \
1439     PetscCheck(!__ierr,PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s(): error code %d",PetscStringize(func),__ierr); \
1440   } while (0)
1441 #endif /* PETSC_CLANG_STATIC_ANALYZER */
1442 
1443 #endif
1444