xref: /petsc/include/petscerror.h (revision 6a8be23ea090b6de9945884a7fc11b82fba3e182)
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   `PetscUseTypeMethod()` or `PetscTryTypeMethod()` should be used when calling functions pointers contained in a PETSc object's `ops` array
325 
326   Fortran Notes:
327     The Fortran function from which this is used must declare a variable PetscErrorCode ierr and ierr must be
328     the final argument to the PetscFunction being called.
329 
330     In the main program and in Fortran subroutines that do not have ierr as the final return parameter one
331     should use PetscCallA()
332 
333   Example Fortran Usage:
334 .vb
335   PetscErrorCode ierr
336   Vec v
337 
338   ...
339   PetscCall(VecShift(v,1.0,ierr))
340   PetscCallA(VecShift(v,1.0,ierr))
341 .ve
342 
343   Level: beginner
344 
345 .seealso: `SETERRQ()`, `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscCallMPI()`
346           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`, `CHKERRA()`, `CHKERRMPI()`, `PetscCallBack()`
347 M*/
348 
349 /*MC
350   PetscCallBack - Calls a user provided PETSc callback function and then checks the resulting error code, if it is non-zero it calls the error
351   handler and returns from the current function with the error code.
352 
353   Synopsis:
354   #include <petscerror.h>
355   void PetscCallBack(const char *functionname,PetscFunction(args))
356 
357   Not Collective
358 
359   Input Parameters:
360 + functionname - the name of the function being called, this can be a string with spaces that describes the meaning of the callback
361 - PetscFunction - any PETSc function that returns an error code
362 
363   Notes:
364   Once the error handler is called the calling function is then returned from with the given
365   error code. Experienced users can set the error handler with PetscPushErrorHandler().
366 
367   PetscCallBack() should only be called in PETSc when a call is being made to a user provided call-back routine.
368 
369   Example Usage:
370 .vb
371   PetscCallBack("XXX callback to do something",a->callback(...));
372 .ve
373 
374   Level: developer
375 
376 .seealso: `SETERRQ()`, `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscCallMPI()`
377           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`, `CHKERRA()`, `CHKERRMPI()`, `PetscCall()`
378 M*/
379 
380 #if defined(PETSC_CLANG_STATIC_ANALYZER)
381 void PetscCall(PetscErrorCode);
382 void PetscCallBack(const char *,PetscErrorCode);
383 void PetscCallVoid(PetscErrorCode);
384 #else
385 #define PetscCall(...) do {                                             \
386     PetscErrorCode ierr_q_;                                             \
387     PetscStackUpdateLine;                                               \
388     ierr_q_ = __VA_ARGS__;                                              \
389     if (PetscUnlikely(ierr_q_)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_q_,PETSC_ERROR_REPEAT," "); \
390   } while (0)
391 #define PetscCallBack(function,...) do {                                \
392     PetscErrorCode ierr_q_;                                             \
393     PetscStackUpdateLine;                                               \
394     PetscStackPushExternal(function);                                   \
395     ierr_q_ = __VA_ARGS__;                                              \
396     PetscStackPop;                                                      \
397     if (PetscUnlikely(ierr_q_)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_q_,PETSC_ERROR_REPEAT," "); \
398   } while (0)
399 #define PetscCallVoid(...) do {                                         \
400     PetscErrorCode ierr_void_;                                          \
401     PetscStackUpdateLine;                                               \
402     ierr_void_ = __VA_ARGS__;                                           \
403     if (PetscUnlikely(ierr_void_)) {(void)PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_void_,PETSC_ERROR_REPEAT," "); return;} \
404   } while (0)
405 #endif
406 
407 /*MC
408   CHKERRQ - Checks error code returned from PETSc function
409 
410   Synopsis:
411   #include <petscsys.h>
412   void CHKERRQ(PetscErrorCode ierr)
413 
414   Not Collective
415 
416   Input Parameters:
417 . ierr - nonzero error code
418 
419   Notes:
420   Deprecated in favor of PetscCall(). This routine behaves identically to it.
421 
422   Level: deprecated
423 
424 .seealso: `PetscCall()`
425 M*/
426 #define CHKERRQ(...) PetscCall(__VA_ARGS__)
427 #define CHKERRV(...) PetscCallVoid(__VA_ARGS__)
428 
429 PETSC_EXTERN void PetscMPIErrorString(PetscMPIInt, char*);
430 
431 /*MC
432   PetscCallMPI - Checks error code returned from MPI calls, if non-zero it calls the error
433   handler and then returns
434 
435   Synopsis:
436   #include <petscerror.h>
437   void PetscCallMPI(MPI_Function(args))
438 
439   Not Collective
440 
441   Input Parameters:
442 . MPI_Function - an MPI function that returns an MPI error code
443 
444   Notes:
445   Always returns the error code PETSC_ERR_MPI; the MPI error code and string are embedded in
446   the string error message. Do not use this to call any other routines (for example PETSc
447   routines), it should only be used for direct MPI calls. Due to limitations of the
448   preprocessor this can unfortunately not easily be enforced, so the user should take care to
449   check this themselves.
450 
451   Example Usage:
452 .vb
453   PetscCallMPI(MPI_Comm_size(...)); // OK, calling MPI function
454 
455   PetscCallMPI(PetscFunction(...)); // ERROR, use PetscCall() instead!
456 .ve
457 
458   Fortran Notes:
459     The Fortran function from which this is used must declare a variable PetscErrorCode ierr and ierr must be
460     the final argument to the MPI function being called.
461 
462     In the main program and in Fortran subroutines that do not have ierr as the final return parameter one
463     should use PetscCallMPIA()
464 
465   Fortran Usage:
466 .vb
467   PetscErrorCode ierr or integer ierr
468   ...
469   PetscCallMPI(MPI_Comm_size(...,ierr))
470   PetscCallMPIA(MPI_Comm_size(...,ierr)) ! Will abort after calling error handler
471 
472   PetscCallMPI(MPI_Comm_size(...,eflag)) ! ERROR, final argument must be ierr
473 .ve
474 
475   Level: beginner
476 
477 .seealso: `SETERRMPI()`, `PetscCall()`, `SETERRQ()`, `SETERRABORT()`, `PetscCallAbort()`,
478           `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
479 M*/
480 #if defined(PETSC_CLANG_STATIC_ANALYZER)
481 void PetscCallMPI(PetscMPIInt);
482 #else
483 #define PetscCallMPI(...) do {                                          \
484     PetscMPIInt _7_errorcode;                                           \
485     char _7_errorstring[2*MPI_MAX_ERROR_STRING];                        \
486     PetscStackUpdateLine;                                               \
487     PetscStackPushExternal("MPI function");                             \
488     {_7_errorcode = __VA_ARGS__;}                                       \
489     PetscStackPop;                                                      \
490     if (PetscUnlikely(_7_errorcode)) {                                  \
491       PetscMPIErrorString(_7_errorcode,(char*)_7_errorstring);          \
492       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MPI,"MPI error %d %s",(int)_7_errorcode,_7_errorstring); \
493     }                                                                   \
494   } while (0)
495 #endif
496 
497 /*MC
498   CHKERRMPI - Checks error code returned from MPI calls, if non-zero it calls the error
499   handler and then returns
500 
501   Synopsis:
502   #include <petscerror.h>
503   void CHKERRMPI(PetscErrorCode ierr)
504 
505   Not Collective
506 
507   Input Parameter:
508 . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
509 
510   Notes:
511   Deprecated in favor of PetscCallMPI(). This routine behaves identically to it.
512 
513   Level: deprecated
514 
515 .seealso: `PetscCallMPI()`
516 M*/
517 #define CHKERRMPI(...) PetscCallMPI(__VA_ARGS__)
518 
519 /*MC
520   PetscCallAbort - Checks error code returned from PETSc function, if non-zero it aborts immediately
521 
522   Synopsis:
523   #include <petscerror.h>
524   void PetscCallAbort(MPI_Comm comm, PetscErrorCode ierr)
525 
526   Collective on comm
527 
528   Input Parameters:
529 + comm - the MPI communicator on which to abort
530 - ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
531 
532   Notes:
533   This macro has identical type and usage semantics to PetscCall() with the important caveat
534   that this macro does not return. Instead, if ierr is nonzero it calls the PETSc error handler
535   and then immediately calls MPI_Abort(). It can therefore be used anywhere.
536 
537   As per MPI_Abort semantics the communicator passed must be valid, although there is currently
538   no attempt made at handling any potential errors from MPI_Abort(). Note that while
539   MPI_Abort() is required to terminate only those processes which reside on comm, it is often
540   the case that MPI_Abort() terminates *all* processes.
541 
542   Example Usage:
543 .vb
544   PetscErrorCode boom(void) { return PETSC_ERR_MEM; }
545 
546   void foo(void)
547   {
548     PetscCallAbort(PETSC_COMM_WORLD,boom()); // OK, does not return a type
549   }
550 
551   double bar(void)
552   {
553     PetscCallAbort(PETSC_COMM_WORLD,boom()); // OK, does not return a type
554   }
555 
556   PetscCallAbort(MPI_COMM_NULL,boom()); // ERROR, communicator should be valid
557 
558   struct baz
559   {
560     baz()
561     {
562       PetscCallAbort(PETSC_COMM_SELF,boom()); // OK
563     }
564 
565     ~baz()
566     {
567       PetscCallAbort(PETSC_COMM_SELF,boom()); // OK (in fact the only way to handle PETSc errors)
568     }
569   };
570 .ve
571 
572   Level: intermediate
573 
574 .seealso: `SETERRABORT()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`,
575           `SETERRQ()`, `CHKMEMQ`, `PetscCallMPI()`
576 M*/
577 #if defined(PETSC_CLANG_STATIC_ANALYZER)
578 void PetscCallAbort(MPI_Comm,PetscErrorCode);
579 void PetscCallContinue(PetscErrorCode);
580 #else
581 #define PetscCallAbort(comm,...) do {                                                          \
582     PetscErrorCode ierr_abort_ = __VA_ARGS__;                                                  \
583     if (PetscUnlikely(ierr_abort_)) {                                                          \
584       PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_abort_,PETSC_ERROR_REPEAT," "); \
585       MPI_Abort(comm,ierr_abort_);                                                             \
586     }                                                                                          \
587   } while (0)
588 #define PetscCallContinue(...)   do {                                                          \
589     PetscErrorCode ierr_continue_ = __VA_ARGS__;                                               \
590     if (PetscUnlikely(ierr_continue_)) PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_continue_,PETSC_ERROR_REPEAT," "); \
591   } while (0)
592 #endif
593 
594 /*MC
595   CHKERRABORT - Checks error code returned from PETSc function. If non-zero it aborts immediately.
596 
597   Synopsis:
598   #include <petscerror.h>
599   void CHKERRABORT(MPI_Comm comm, PetscErrorCode ierr)
600 
601   Not Collective
602 
603   Input Parameters:
604 + comm - the MPI communicator
605 - ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
606 
607   Notes:
608   Deprecated in favor of PetscCallAbort(). This routine behaves identically to it.
609 
610   Level: deprecated
611 
612 .seealso: `PetscCallAbort()`
613 M*/
614 #define CHKERRABORT(comm,...) PetscCallAbort(comm,__VA_ARGS__)
615 #define CHKERRCONTINUE(...)   PetscCallContinue(__VA_ARGS__)
616 
617 /*MC
618    CHKERRA - Fortran-only replacement for PetscCall in the main program, which aborts immediately
619 
620    Synopsis:
621    #include <petscsys.h>
622    PetscErrorCode CHKERRA(PetscErrorCode ierr)
623 
624    Not Collective
625 
626    Input Parameters:
627 .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
628 
629   Level: beginner
630 
631    Notes:
632       This should only be used with Fortran. With C/C++, use PetscCall() in normal usage,
633       or PetscCallAbort() if wanting to abort immediately on error.
634 
635    Fortran Notes:
636       PetscCall() may be called from Fortran subroutines but CHKERRA() must be called from the
637       Fortran main program.
638 
639 .seealso: `PetscCall()`, `PetscCallAbort()`, `SETERRA()`, `SETERRQ()`, `SETERRABORT()`
640 M*/
641 
642 PETSC_EXTERN PetscBool petscwaitonerrorflg;
643 PETSC_EXTERN PetscBool petscindebugger;
644 
645 /*MC
646    PETSCABORT - Call MPI_Abort with an informative error code
647 
648    Synopsis:
649    #include <petscsys.h>
650    PETSCABORT(MPI_Comm comm, PetscErrorCode ierr)
651 
652    Collective
653 
654    Input Parameters:
655 +  comm - A communicator, so that the error can be collective
656 -  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
657 
658    Level: advanced
659 
660    Notes:
661    If the option -start_in_debugger was used then this calls abort() to stop the program in the debugger.
662 
663    if PetscCIEnabledPortableErrorOutput it strives to exit cleanly without call `MPI_Abort()`
664 
665  M*/
666 #define PETSCABORT(comm,...) do {                                                              \
667     if (petscwaitonerrorflg) PetscSleep(1000);                                                 \
668     if (petscindebugger) abort();                                                              \
669     else {                                                                                     \
670       PetscErrorCode ierr_petsc_abort_ = __VA_ARGS__;                                          \
671       PetscMPIInt    size;                                                                     \
672       MPI_Comm_size(comm,&size);                                                               \
673       if (PetscCIEnabledPortableErrorOutput && size == PetscGlobalSize && ierr_petsc_abort_ != PETSC_ERR_SIG) { \
674         MPI_Finalize(); exit(0);                                                               \
675       } else if (PetscCIEnabledPortableErrorOutput && PetscGlobalSize == 1) {                  \
676         exit(0);                                                        \
677       } else {                                                                                 \
678         MPI_Abort(comm,(PetscMPIInt)ierr_petsc_abort_);                 \
679       }                                                                                        \
680     }                                                                                          \
681   } while (0)
682 
683 #ifdef PETSC_CLANGUAGE_CXX
684 /*MC
685   PetscCallThrow - Checks error code, if non-zero it calls the C++ error handler which throws
686   an exception
687 
688   Synopsis:
689   #include <petscerror.h>
690   void PetscCallThrow(PetscErrorCode ierr)
691 
692   Not Collective
693 
694   Input Parameter:
695 . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
696 
697   Notes:
698   Requires PETSc to be configured with clanguage = c++. Throws a std::runtime_error() on error.
699 
700   Once the error handler throws the exception you can use PetscCallVoid() which returns without
701   an error code (bad idea since the error is ignored) or PetscCallAbort() to have MPI_Abort()
702   called immediately.
703 
704   Level: beginner
705 
706 .seealso: `SETERRQ()`, `PetscCall()`, `SETERRABORT()`, `PetscCallAbort()`, `PetscTraceBackErrorHandler()`,
707           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
708 M*/
709 #define PetscCallThrow(...) do {                                                                    \
710     PetscErrorCode ierr_cxx_ = __VA_ARGS__;                                                    \
711     if (PetscUnlikely(ierr_cxx_)) PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_cxx_,PETSC_ERROR_IN_CXX,PETSC_NULLPTR); \
712   } while (0)
713 
714 /*MC
715   CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception
716 
717   Synopsis:
718   #include <petscerror.h>
719   void CHKERRXX(PetscErrorCode ierr)
720 
721   Not Collective
722 
723   Input Parameter:
724 . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
725 
726   Notes:
727   Deprecated in favor of PetscCallThrow(). This routine behaves identically to it.
728 
729   Level: deprecated
730 
731 .seealso: `PetscCallThrow()`
732 M*/
733 #define CHKERRXX(...) PetscCallThrow(__VA_ARGS__)
734 #endif
735 
736 /*MC
737   PetscCallCXX - Checks C++ function calls and if they throw an exception, catch it and then
738   return a PETSc error code
739 
740   Synopsis:
741   #include <petscerror.h>
742   void PetscCallCXX(expr) noexcept;
743 
744   Not Collective
745 
746   Input Parameter:
747 . expr - An arbitrary expression
748 
749   Notes:
750   PetscCallCXX(expr) is a macro replacement for
751 .vb
752   try {
753     expr;
754   } catch (const std::exception& e) {
755     return ConvertToPetscErrorCode(e);
756   }
757 .ve
758   Due to the fact that it catches any (reasonable) exception, it is essentially noexcept.
759 
760   Example Usage:
761 .vb
762   void foo(void) { throw std::runtime_error("error"); }
763 
764   void bar()
765   {
766     PetscCallCXX(foo()); // ERROR bar() does not return PetscErrorCode
767   }
768 
769   PetscErrorCode baz()
770   {
771     PetscCallCXX(foo()); // OK
772 
773     PetscCallCXX(
774       bar();
775       foo(); // OK mutliple statements allowed
776     );
777   }
778 
779   struct bop
780   {
781     bop()
782     {
783       PetscCallCXX(foo()); // ERROR returns PetscErrorCode, cannot be used in constructors
784     }
785   };
786 
787   // ERROR contains do-while, cannot be used as function-try block
788   PetscErrorCode qux() PetscCallCXX(
789     bar();
790     baz();
791     foo();
792     return 0;
793   )
794 .ve
795 
796   Level: beginner
797 
798 .seealso: `PetscCallThrow()`, `SETERRQ()`, `PetscCall()`, `SETERRABORT()`, `PetscCallAbort()`,
799           `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
800 M*/
801 #define PetscCallCXX(...) do {                                  \
802     PetscStackUpdateLine;                                       \
803     try {                                                       \
804       __VA_ARGS__;                                              \
805     } catch (const std::exception& e) {                         \
806       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"%s",e.what());     \
807     }                                                           \
808   } while (0)
809 
810 /*MC
811   CHKERRCXX - Checks C++ function calls and if they throw an exception, catch it and then
812   return a PETSc error code
813 
814   Synopsis:
815   #include <petscerror.h>
816   void CHKERRCXX(func) noexcept;
817 
818   Not Collective
819 
820   Input Parameter:
821 . func - C++ function calls
822 
823   Notes:
824   Deprecated in favor of PetscCallCXX(). This routine behaves identically to it.
825 
826   Level: deprecated
827 
828 .seealso: `PetscCallCXX()`
829 M*/
830 #define CHKERRCXX(...) PetscCallCXX(__VA_ARGS__)
831 
832 /*MC
833    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
834 
835    Synopsis:
836    #include <petscsys.h>
837    CHKMEMQ;
838 
839    Not Collective
840 
841   Level: beginner
842 
843    Notes:
844     We highly recommend using Valgrind https://petsc.org/release/faq/#valgrind or for NVIDIA CUDA systems
845     https://docs.nvidia.com/cuda/cuda-memcheck/index.html for finding memory problems. The ``CHKMEMQ`` macro is useful on systems that
846     do not have valgrind, but is not as good as valgrind or cuda-memcheck.
847 
848     Must run with the option -malloc_debug (-malloc_test in debug mode; or if PetscMallocSetDebug() called) to enable this option
849 
850     Once the error handler is called the calling function is then returned from with the given error code.
851 
852     By defaults prints location where memory that is corrupted was allocated.
853 
854     Use CHKMEMA for functions that return void
855 
856 .seealso: `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `SETERRQ()`, `PetscMallocValidate()`
857 M*/
858 #if defined(PETSC_CLANG_STATIC_ANALYZER)
859 #define CHKMEMQ
860 #define CHKMEMA
861 #else
862 #define CHKMEMQ do { \
863     PetscErrorCode ierr_memq_ = PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__); \
864     if (PetscUnlikely(ierr_memq_)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr_memq_,PETSC_ERROR_REPEAT," "); \
865   } while (0)
866 #define CHKMEMA PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__)
867 #endif
868 
869 /*E
870   PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers
871 
872   Level: advanced
873 
874   PETSC_ERROR_IN_CXX indicates the error was detected in C++ and an exception should be generated
875 
876   Developer Notes:
877     This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandler()
878 
879 .seealso: `PetscError()`, `SETERRXX()`
880 E*/
881 typedef enum {PETSC_ERROR_INITIAL=0,PETSC_ERROR_REPEAT=1,PETSC_ERROR_IN_CXX = 2} PetscErrorType;
882 
883 #if defined(__clang_analyzer__)
884 __attribute__((analyzer_noreturn))
885 #endif
886 PETSC_EXTERN PetscErrorCode PetscError(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,...) PETSC_ATTRIBUTE_COLD PETSC_ATTRIBUTE_FORMAT(7,8);
887 
888 PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void);
889 PETSC_EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **);
890 PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
891 PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
892 PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
893 PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
894 PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
895 PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
896 PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*) PETSC_ATTRIBUTE_COLD;
897 PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void*);
898 PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void);
899 PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int,void*);
900 PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*);
901 PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void);
902 PETSC_EXTERN PetscErrorCode PetscCheckPointerSetIntensity(PetscInt);
903 PETSC_EXTERN void PetscSignalSegvCheckPointerOrMpi(void);
904 PETSC_DEPRECATED_FUNCTION("Use PetscSignalSegvCheckPointerOrMpi() (since version 3.13)") static inline void PetscSignalSegvCheckPointer(void) {PetscSignalSegvCheckPointerOrMpi();}
905 
906 /*MC
907     PetscErrorPrintf - Prints error messages.
908 
909    Synopsis:
910     #include <petscsys.h>
911      PetscErrorCode (*PetscErrorPrintf)(const char format[],...);
912 
913     Not Collective
914 
915     Input Parameter:
916 .   format - the usual printf() format string
917 
918    Options Database Keys:
919 +    -error_output_stdout - cause error messages to be printed to stdout instead of the  (default) stderr
920 -    -error_output_none - to turn off all printing of error messages (does not change the way the error is handled.)
921 
922    Notes:
923     Use
924 $     PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the
925 $                        error is handled.) and
926 $     PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on or you can use your own function
927 
928           Use
929      PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file.
930      PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file.
931 
932           Use
933       PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print
934 
935    Level: developer
936 
937     Fortran Note:
938     This routine is not supported in Fortran.
939 
940 .seealso: `PetscFPrintf()`, `PetscSynchronizedPrintf()`, `PetscHelpPrintf()`, `PetscPrintf()`, `PetscPushErrorHandler()`, `PetscVFPrintf()`, `PetscHelpPrintf()`
941 M*/
942 PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[],...) PETSC_ATTRIBUTE_FORMAT(1,2);
943 
944 /*E
945      PetscFPTrap - types of floating point exceptions that may be trapped
946 
947      Currently only PETSC_FP_TRAP_OFF and PETSC_FP_TRAP_ON are handled. All others are treated as PETSC_FP_TRAP_ON.
948 
949      Level: intermediate
950 
951 .seealso: `PetscSetFPTrap()`, `PetscPushFPTrap()`
952  E*/
953 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;
954 #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)
955 PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap);
956 PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap);
957 PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void);
958 PETSC_EXTERN PetscErrorCode PetscDetermineInitialFPTrap(void);
959 
960 /*
961       Allows the code to build a stack frame as it runs
962 */
963 
964 #if defined(PETSC_USE_DEBUG)
965 #define PETSCSTACKSIZE 64
966 typedef struct  {
967   const char *function[PETSCSTACKSIZE];
968   const char *file[PETSCSTACKSIZE];
969         int  line[PETSCSTACKSIZE];
970         int  petscroutine[PETSCSTACKSIZE]; /* 0 external called from petsc, 1 petsc functions, 2 petsc user functions */
971         int  currentsize;
972         int  hotdepth;
973         PetscBool  check; /* option to check for correct Push/Pop semantics, true for default petscstack but not other stacks */
974 } PetscStack;
975 PETSC_EXTERN PetscStack petscstack;
976 #else
977 typedef struct {
978   char Silence_empty_struct_has_size_0_in_C_size_1_in_Cpp;
979 } PetscStack;
980 #endif
981 
982 #if defined(PETSC_SERIALIZE_FUNCTIONS)
983 #include <petsc/private/petscfptimpl.h>
984 /*
985    Registers the current function into the global function pointer to function name table
986 
987    Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc
988 */
989 #define PetscRegister__FUNCT__() do { \
990   static PetscBool __chked = PETSC_FALSE; \
991   if (!__chked) {\
992   void *ptr; PetscDLSym(NULL,PETSC_FUNCTION_NAME,&ptr);\
993   __chked = PETSC_TRUE;\
994   }} while (0)
995 #else
996 #define PetscRegister__FUNCT__()
997 #endif
998 
999 #if defined(PETSC_CLANG_STATIC_ANALYZER)
1000 #define PetscStackPushNoCheck(funct,petsc_routine,hot)
1001 #define PetscStackUpdateLine
1002 #define PetscStackPushExternal(funct)
1003 #define PetscStackPopNoCheck
1004 #define PetscStackClearTop
1005 #define PetscFunctionBegin
1006 #define PetscFunctionBeginUser
1007 #define PetscFunctionBeginHot
1008 #define PetscFunctionReturn(a)    return a
1009 #define PetscFunctionReturnVoid() return
1010 #define PetscStackPop
1011 #define PetscStackPush(f)
1012 #elif defined(PETSC_USE_DEBUG)
1013 
1014 #define PetscStackPush_Private(stack__,file__,func__,line__,petsc_routine__,hot__) do { \
1015     if (stack__.currentsize < PETSCSTACKSIZE) {                                         \
1016       stack__.function[stack__.currentsize]     = func__;                               \
1017       if (petsc_routine__) {                                                            \
1018         stack__.file[stack__.currentsize]         = file__;                             \
1019         stack__.line[stack__.currentsize]         = line__;                             \
1020       } else {                                                                          \
1021         stack__.file[stack__.currentsize]         = PETSC_NULLPTR;                      \
1022         stack__.line[stack__.currentsize]         = 0;                                  \
1023       }                                                                                 \
1024       stack__.petscroutine[stack__.currentsize] = petsc_routine__;                      \
1025     }                                                                                   \
1026     ++stack__.currentsize;                                                              \
1027     stack__.hotdepth += (hot__ || stack__.hotdepth);                                    \
1028   } while (0)
1029 
1030 /* uses PetscCheckAbort() because may be used in a function that does not return an error code */
1031 #define PetscStackPop_Private(stack__,func__) do {                                             \
1032     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__);\
1033     if (--stack__.currentsize < PETSCSTACKSIZE) {\
1034       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__); \
1035       stack__.function[stack__.currentsize]     = PETSC_NULLPTR;                             \
1036       stack__.file[stack__.currentsize]         = PETSC_NULLPTR;                             \
1037       stack__.line[stack__.currentsize]         = 0;                                         \
1038       stack__.petscroutine[stack__.currentsize] = 0;                                         \
1039     }                                                                                        \
1040     stack__.hotdepth = PetscMax(stack__.hotdepth-1,0);                                       \
1041   } while (0)
1042 
1043 /*MC
1044    PetscStackPushNoCheck - Pushes a new function name and line number onto the PETSc default stack that tracks where the running program is
1045    currently in the source code.
1046 
1047    Not Collective
1048 
1049    Synopsis:
1050    #include <petscsys.h>
1051    void PetscStackPushNoCheck(char *funct,int petsc_routine,PetscBool hot);
1052 
1053    Input Parameters:
1054 +  funct - the function name
1055 .  petsc_routine - 2 user function, 1 PETSc function, 0 some other function
1056 -  hot - indicates that the function may be called often so expensive error checking should be turned off inside the function
1057 
1058    Level: developer
1059 
1060    Notes:
1061    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
1062    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1063    help debug the problem.
1064 
1065    This version does not check the memory corruption (an expensive operation), use `PetscStackPush()` to check the memory.
1066 
1067    Use `PetscStackPushExternal()` for a function call that is about to be made to a non-PETSc or user function (such as BLAS etc).
1068 
1069    The default stack is a global variable called `petscstack`.
1070 
1071    In general the line number is at the beginning of the function (where `PetscFunctionBegin` is called) so it is not accurate
1072 
1073 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1074           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPush()`, `PetscStackPop`,
1075           `PetscStackPushExternal()`
1076 M*/
1077 #define PetscStackPushNoCheck(funct,petsc_routine,hot) do {                             \
1078     PetscStackSAWsTakeAccess();                                                         \
1079     PetscStackPush_Private(petscstack,__FILE__,funct,__LINE__,petsc_routine,hot);       \
1080     PetscStackSAWsGrantAccess();                                                        \
1081   } while (0)
1082 
1083 /*MC
1084    PetscStackUpdateLine - in a function that has a PetscFunctionBegin or PetscFunctionBeginUser updates the stack line number to the
1085    current line number.
1086 
1087    Not Collective
1088 
1089    Synopsis:
1090    #include <petscsys.h>
1091    void PetscStackUpdateLine
1092 
1093    Level: developer
1094 
1095    Notes:
1096    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
1097    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1098    help debug the problem.
1099 
1100    The default stack is a global variable called petscstack.
1101 
1102    This is used by `PetscCall()` and is otherwise not like to be needed
1103 
1104 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPop`, `PetscCall()`
1105 M*/
1106 #define PetscStackUpdateLine                                         \
1107   if (petscstack.currentsize > 0 && petscstack.function[petscstack.currentsize-1] == PETSC_FUNCTION_NAME){ \
1108     petscstack.line[petscstack.currentsize-1] = __LINE__;              \
1109   }
1110 
1111 /*MC
1112    PetscStackPushExternal - Pushes a new function name onto the PETSc default stack that tracks where the running program is
1113    currently in the source code. Does not include the filename or line number since this is called by the calling routine
1114    for non-PETSc or user functions.
1115 
1116    Not Collective
1117 
1118    Synopsis:
1119    #include <petscsys.h>
1120    void PetscStackPushExternal(char *funct);
1121 
1122    Input Parameters:
1123 .  funct - the function name
1124 
1125    Level: developer
1126 
1127    Notes:
1128    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
1129    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1130    help debug the problem.
1131 
1132    The default stack is a global variable called `petscstack`.
1133 
1134    This is to be used when calling an external package function such as a BLAS function.
1135 
1136    This also updates the stack line number for the current stack function.
1137 
1138 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1139           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1140 M*/
1141 #define PetscStackPushExternal(funct) do {PetscStackUpdateLine; PetscStackPushNoCheck(funct,0,PETSC_TRUE);} while (0);
1142 
1143 /*MC
1144    PetscStackPopNoCheck - Pops a function name from the PETSc default stack that tracks where the running program is
1145    currently in the source code.
1146 
1147    Not Collective
1148 
1149    Synopsis:
1150    #include <petscsys.h>
1151    void PetscStackPopNoCheck(char *funct);
1152 
1153    Input Parameter:
1154 .   funct - the function name
1155 
1156    Level: developer
1157 
1158    Notes:
1159    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
1160    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1161    help debug the problem.
1162 
1163    The default stack is a global variable called petscstack.
1164 
1165    Developer Note:
1166    `PetscStackPopNoCheck()` takes a function argument while  `PetscStackPop` does not, this difference is likely just historical.
1167 
1168 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1169 M*/
1170 #define PetscStackPopNoCheck(funct)                    do {     \
1171     PetscStackSAWsTakeAccess();                                 \
1172     PetscStackPop_Private(petscstack,funct);                    \
1173     PetscStackSAWsGrantAccess();                                \
1174   } while (0)
1175 
1176 #define PetscStackClearTop                             do {             \
1177     PetscStackSAWsTakeAccess();                                         \
1178     if (petscstack.currentsize > 0 &&                                   \
1179         --petscstack.currentsize < PETSCSTACKSIZE) {                    \
1180       petscstack.function[petscstack.currentsize]     = PETSC_NULLPTR;  \
1181       petscstack.file[petscstack.currentsize]         = PETSC_NULLPTR;  \
1182       petscstack.line[petscstack.currentsize]         = 0;              \
1183       petscstack.petscroutine[petscstack.currentsize] = 0;              \
1184     }                                                                   \
1185     petscstack.hotdepth = PetscMax(petscstack.hotdepth-1,0);            \
1186     PetscStackSAWsGrantAccess();                                        \
1187   } while (0)
1188 
1189 /*MC
1190    PetscFunctionBegin - First executable line of each PETSc function,  used for error handling. Final
1191       line of PETSc functions should be PetscFunctionReturn(0);
1192 
1193    Synopsis:
1194    #include <petscsys.h>
1195    void PetscFunctionBegin;
1196 
1197    Not Collective
1198 
1199    Usage:
1200 .vb
1201      int something;
1202 
1203      PetscFunctionBegin;
1204 .ve
1205 
1206    Notes:
1207      Use PetscFunctionBeginUser for application codes.
1208 
1209      Not available in Fortran
1210 
1211    Level: developer
1212 
1213 .seealso: `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`
1214 
1215 M*/
1216 #define PetscFunctionBegin do {                               \
1217     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,1,PETSC_FALSE); \
1218     PetscRegister__FUNCT__();                                 \
1219   } while (0)
1220 
1221 /*MC
1222    PetscFunctionBeginHot - Substitute for PetscFunctionBegin to be used in functions that are called in
1223    performance-critical circumstances.  Use of this function allows for lighter profiling by default.
1224 
1225    Synopsis:
1226    #include <petscsys.h>
1227    void PetscFunctionBeginHot;
1228 
1229    Not Collective
1230 
1231    Usage:
1232 .vb
1233      int something;
1234 
1235      PetscFunctionBeginHot;
1236 .ve
1237 
1238    Notes:
1239      Not available in Fortran
1240 
1241    Level: developer
1242 
1243 .seealso: `PetscFunctionBegin`, `PetscFunctionReturn()`, `PetscStackPushNoCheck()`
1244 
1245 M*/
1246 #define PetscFunctionBeginHot do {                           \
1247     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,1,PETSC_TRUE); \
1248     PetscRegister__FUNCT__();                                \
1249   } while (0)
1250 
1251 /*MC
1252    PetscFunctionBeginUser - First executable line of user provided routines
1253 
1254    Synopsis:
1255    #include <petscsys.h>
1256    void PetscFunctionBeginUser;
1257 
1258    Not Collective
1259 
1260    Usage:
1261 .vb
1262      int something;
1263 
1264      PetscFunctionBeginUser;
1265 .ve
1266 
1267    Notes:
1268       Functions that incorporate this must call `PetscFunctionReturn()` instead of return except for main().
1269 
1270       May be used before `PetscInitialize()`
1271 
1272       Not available in Fortran
1273 
1274       This is identical to `PetscFunctionBegin` except it labels the routine as a user
1275       routine instead of as a PETSc library routine.
1276 
1277    Level: intermediate
1278 
1279 .seealso: `PetscFunctionReturn()`, `PetscFunctionBegin`, `PetscFunctionBeginHot`, `PetscStackPushNoCheck()`
1280 
1281 M*/
1282 #define PetscFunctionBeginUser do {                           \
1283     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,2,PETSC_FALSE); \
1284     PetscRegister__FUNCT__();                                 \
1285   } while (0)
1286 
1287 /*MC
1288    PetscStackPush - Pushes a new function name and line number onto the PETSc default stack that tracks where the running program is
1289    currently in the source code and verifies the memory is not corrupted.
1290 
1291    Not Collective
1292 
1293    Synopsis:
1294    #include <petscsys.h>
1295    void PetscStackPush(char *funct)
1296 
1297    Input Parameter:
1298 .  funct - the function name
1299 
1300    Level: developer
1301 
1302    Notes:
1303    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
1304    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1305    help debug the problem.
1306 
1307    The default stack is a global variable called petscstack.
1308 
1309    In general the line number is at the beginning of the function (where `PetscFunctionBegin` is called) so it is not accurate
1310 
1311 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1312           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1313 M*/
1314 #define PetscStackPush(n)       do {        \
1315     PetscStackPushNoCheck(n,0,PETSC_FALSE); \
1316     CHKMEMQ;                                \
1317   } while (0)
1318 
1319 /*MC
1320    PetscStackPop - Pops a function name from the PETSc default stack that tracks where the running program is
1321    currently in the source code and verifies the memory is not corrupted.
1322 
1323    Not Collective
1324 
1325    Synopsis:
1326    #include <petscsys.h>
1327    void PetscStackPop
1328 
1329    Level: developer
1330 
1331    Notes:
1332    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
1333    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1334    help debug the problem.
1335 
1336    The default stack is a global variable called petscstack.
1337 
1338 .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPopNoCheck()`, `PetscStackPush()`
1339 M*/
1340 #define PetscStackPop           do {       \
1341       CHKMEMQ;                                   \
1342       PetscStackPopNoCheck(PETSC_FUNCTION_NAME); \
1343     } while (0)
1344 
1345 /*MC
1346    PetscFunctionReturn - Last executable line of each PETSc function
1347         used for error handling. Replaces return()
1348 
1349    Synopsis:
1350    #include <petscsys.h>
1351    void PetscFunctionReturn(0);
1352 
1353    Not Collective
1354 
1355    Usage:
1356 .vb
1357     ....
1358      PetscFunctionReturn(0);
1359    }
1360 .ve
1361 
1362    Notes:
1363      Not available in Fortran
1364 
1365    Level: developer
1366 
1367 .seealso: `PetscFunctionBegin()`, `PetscStackPopNoCheck()`
1368 
1369 M*/
1370 #define PetscFunctionReturn(a)    do {          \
1371     PetscStackPopNoCheck(PETSC_FUNCTION_NAME);  \
1372     return a;                                   \
1373   } while (0)
1374 
1375 #define PetscFunctionReturnVoid() do {          \
1376     PetscStackPopNoCheck(PETSC_FUNCTION_NAME);  \
1377     return;                                     \
1378   } while (0)
1379 #else /* PETSC_USE_DEBUG */
1380 #define PetscStackPushNoCheck(funct,petsc_routine,hot)
1381 #define PetscStackUpdateLine
1382 #define PetscStackPushExternal(funct)
1383 #define PetscStackPopNoCheck
1384 #define PetscStackClearTop
1385 #define PetscFunctionBegin
1386 #define PetscFunctionBeginUser
1387 #define PetscFunctionBeginHot
1388 #define PetscFunctionReturn(a)    return a
1389 #define PetscFunctionReturnVoid() return
1390 #define PetscStackPop             CHKMEMQ
1391 #define PetscStackPush(f)         CHKMEMQ
1392 #endif /* PETSC_USE_DEBUG */
1393 
1394 #if defined(PETSC_CLANG_STATIC_ANALYZER)
1395 #define PetscStackCallExternalVoid(name,routine)
1396 #define PetscCallExternal(func,...)
1397 #else
1398 /*MC
1399     PetscStackCallExternalVoid - Calls an external library routine or user function after pushing the name of the routine on the stack.
1400 
1401    Input Parameters:
1402 +   name - string that gives the name of the function being called
1403 -   routine - actual call to the routine, for example, functionname(a,b)
1404 
1405    Level: developer
1406 
1407    Note:
1408    Often one should use `PetscCallExternal()` instead. This routine is intended for external library routines that DO NOT return error codes
1409 
1410    In debug mode this also checks the memory for corruption at the end of the function call.
1411 
1412    Certain external packages, such as BLAS/LAPACK may have their own macros for managing the call, error checking, etc.
1413 
1414    Developer Note:
1415    This is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc.
1416 
1417 .seealso: `PetscCall()`, `PetscStackPushNoCheck()`, `PetscStackPush()`, `PetscCallExternal()`, `PetscCallBLAS()`
1418 @*/
1419 #define PetscStackCallExternalVoid(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while (0)
1420 
1421 /*MC
1422     PetscCallExternal - Calls an external library routine that returns an error code after pushing the name of the routine on the stack.
1423 
1424    Input Parameters:
1425 +   func-  name of the routine
1426 -   args - arguments to the routine
1427 
1428    Level: developer
1429 
1430    Notes:
1431    This is intended for external package routines that return error codes. Use `PetscStackCallExternalVoid()` for those that do not.
1432 
1433    In debug mode this also checks the memory for corruption at the end of the function call.
1434 
1435    Developer Note:
1436    This is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc.
1437 
1438 .seealso: `PetscCall()`, `PetscStackPushNoCheck()`, `PetscStackPush()`, `PetscStackCallExternalVoid()`
1439 M*/
1440 #define PetscCallExternal(func,...) do {                                                  \
1441     PetscStackPush(PetscStringize(func));                                                      \
1442     PetscErrorCode __ierr = func(__VA_ARGS__);                                                 \
1443     PetscStackPop;                                                                             \
1444     PetscCheck(!__ierr,PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s(): error code %d",PetscStringize(func),__ierr); \
1445   } while (0)
1446 #endif /* PETSC_CLANG_STATIC_ANALYZER */
1447 
1448 #endif
1449