xref: /petsc/include/petscerror.h (revision bd2b07b136135af06fb9210476dad9bf59a36938)
154a8ef01SBarry Smith /*
2f621e05eSBarry Smith     Contains all error handling interfaces for PETSc.
354a8ef01SBarry Smith */
426bd1501SBarry Smith #if !defined(PETSCERROR_H)
526bd1501SBarry Smith #define PETSCERROR_H
66c7e564aSBarry Smith 
7e1bf4ed2SJacob Faibussowitsch #include <petscmacros.h>
8e1bf4ed2SJacob Faibussowitsch #include <petscsystypes.h>
9e1bf4ed2SJacob Faibussowitsch 
10ac09b921SBarry Smith /* SUBMANSEC = Sys */
11ac09b921SBarry Smith 
1254a8ef01SBarry Smith /*
13329ffe3dSLois Curfman McInnes      These are the generic error codes. These error codes are used
14e2d1d2b7SBarry Smith      many different places in the PETSc source code. The string versions are
150e5e90baSSatish Balay      at src/sys/error/err.c any changes here must also be made there
16e951c290SBarry Smith      These are also define in src/sys/f90-mod/petscerror.h any CHANGES here
170f9cf654SBarry Smith      must be also made there.
1845d48df9SBarry Smith 
1954a8ef01SBarry Smith */
202a6744ebSBarry Smith #define PETSC_ERR_MIN_VALUE 54 /* should always be one less then the smallest value */
212a6744ebSBarry Smith 
2245d48df9SBarry Smith #define PETSC_ERR_MEM            55 /* unable to allocate requested memory */
2347794344SBarry Smith #define PETSC_ERR_SUP            56 /* no support for requested operation */
24e2d1d2b7SBarry Smith #define PETSC_ERR_SUP_SYS        57 /* no support for requested operation on this computer system */
25e2d1d2b7SBarry Smith #define PETSC_ERR_ORDER          58 /* operation done in wrong order */
2645d48df9SBarry Smith #define PETSC_ERR_SIG            59 /* signal received */
27f1caa5a4SBarry Smith #define PETSC_ERR_FP             72 /* floating point exception */
28a8c6a408SBarry Smith #define PETSC_ERR_COR            74 /* corrupted PETSc object */
29a8c6a408SBarry Smith #define PETSC_ERR_LIB            76 /* error in library called by PETSc */
30329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB           77 /* PETSc library generated inconsistent data */
31329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC           78 /* memory corruption */
32b3cc6726SBarry Smith #define PETSC_ERR_CONV_FAILED    82 /* iterative method (KSP or SNES) failed */
331302d50aSBarry Smith #define PETSC_ERR_USER           83 /* user has not provided needed function */
344e2ffeddSBarry Smith #define PETSC_ERR_SYS            88 /* error in system call */
35a8b45ee7SBarry Smith #define PETSC_ERR_POINTER        70 /* pointer does not point to valid address */
363d96e996SBarry Smith #define PETSC_ERR_MPI_LIB_INCOMP 87 /* MPI library at runtime is not compatible with MPI user compiled with */
3745d48df9SBarry Smith 
3845d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ          60 /* nonconforming object sizes used in operation */
3945d48df9SBarry Smith #define PETSC_ERR_ARG_IDN          61 /* two arguments not allowed to be the same */
40a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG        62 /* wrong argument (but object probably ok) */
4145d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT      64 /* null or corrupted PETSc object as argument */
4245d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE   63 /* input argument, out of range */
434f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR       68 /* invalid pointer argument */
444f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE  69 /* two args must be same object type */
456831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM  80 /* two args must be same communicators */
46d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE   73 /* object in argument is in wrong state, e.g. unassembled mat */
478cda6cd7SBarry Smith #define PETSC_ERR_ARG_TYPENOTSET   89 /* the type of the object has not yet been set */
48a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP       75 /* two arguments are incompatible */
494482741eSBarry Smith #define PETSC_ERR_ARG_NULL         85 /* argument is null that should not be */
50958c9bccSBarry Smith #define PETSC_ERR_ARG_UNKNOWN_TYPE 86 /* type name doesn't match any registered type */
514f227f7cSBarry Smith 
524f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN       65 /* unable to open file */
534f227f7cSBarry Smith #define PETSC_ERR_FILE_READ       66 /* unable to read from file */
544f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE      67 /* unable to write to file */
55a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED 79 /* unexpected data in file */
5645d48df9SBarry Smith 
57329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT 71 /* detected a zero pivot during LU factorization */
589e3b2f23SBarry Smith #define PETSC_ERR_MAT_CH_ZRPVT 81 /* detected a zero pivot during Cholesky factorization */
5954a8ef01SBarry Smith 
6068e69593SBarry Smith #define PETSC_ERR_INT_OVERFLOW 84
613855c12bSBarry Smith 
62bf3909cdSBarry Smith #define PETSC_ERR_FLOP_COUNT     90
63e113a28aSBarry Smith #define PETSC_ERR_NOT_CONVERGED  91 /* solver did not converge */
6492e8f287SBarry Smith #define PETSC_ERR_MISSING_FACTOR 92 /* MatGetFactor() failed */
65691b26d3SBarry Smith #define PETSC_ERR_OPT_OVERWRITE  93 /* attempted to over write options which should not be changed */
66691b26d3SBarry Smith #define PETSC_ERR_WRONG_MPI_SIZE 94 /* example/application run with number of MPI ranks it does not support */
67691b26d3SBarry Smith #define PETSC_ERR_USER_INPUT     95 /* missing or incorrect user input */
68589f383fSBarry Smith #define PETSC_ERR_GPU_RESOURCE   96 /* unable to load a GPU resource, for example cuBLAS */
69589f383fSBarry Smith #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 */
70ffc4695bSBarry Smith #define PETSC_ERR_MPI            98 /* general MPI error */
71ffc4695bSBarry Smith #define PETSC_ERR_MAX_VALUE      99 /* this is always the one more than the largest error code */
72b9eb5ee8SHong Zhang 
7398921bdaSJacob Faibussowitsch #define SETERRQ1(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
7498921bdaSJacob Faibussowitsch #define SETERRQ2(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
7598921bdaSJacob Faibussowitsch #define SETERRQ3(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
7698921bdaSJacob Faibussowitsch #define SETERRQ4(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
7798921bdaSJacob Faibussowitsch #define SETERRQ5(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
7898921bdaSJacob Faibussowitsch #define SETERRQ6(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
7998921bdaSJacob Faibussowitsch #define SETERRQ7(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
8098921bdaSJacob Faibussowitsch #define SETERRQ8(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
8198921bdaSJacob Faibussowitsch #define SETERRQ9(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use SETERRQ() (since version 3.17)\"") SETERRQ(__VA_ARGS__)
8298921bdaSJacob Faibussowitsch 
8330de9b25SBarry Smith /*MC
841957e957SBarry Smith    SETERRQ - Macro to be called when an error has been detected,
8530de9b25SBarry Smith 
8630de9b25SBarry Smith    Synopsis:
87aaa7dc30SBarry Smith    #include <petscsys.h>
8898921bdaSJacob Faibussowitsch    PetscErrorCode SETERRQ(MPI_Comm comm,PetscErrorCode ierr,char *message,...)
8930de9b25SBarry Smith 
90d083f849SBarry Smith    Collective
9130de9b25SBarry Smith 
9230de9b25SBarry Smith    Input Parameters:
9387497f52SBarry Smith +  comm - A communicator, use `PETSC_COMM_SELF` unless you know all ranks of another communicator will detect the error
943af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
9530de9b25SBarry Smith -  message - error message
9630de9b25SBarry Smith 
9730de9b25SBarry Smith   Level: beginner
9830de9b25SBarry Smith 
9930de9b25SBarry Smith    Notes:
10087497f52SBarry Smith     This is rarely needed, one should use `PetscCheck()` and `PetscCall()` and friends to automatically handle error conditions.
10130de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
10230de9b25SBarry Smith 
10387497f52SBarry Smith     Experienced users can set the error handler with `PetscPushErrorHandler()`.
10430de9b25SBarry Smith 
1053b1008b8SBarry Smith    Fortran Notes:
1063b1008b8SBarry Smith       SETERRQ() may be called from Fortran subroutines but SETERRA() must be called from the
1073b1008b8SBarry Smith       Fortran main program.
1083b1008b8SBarry Smith 
109db781477SPatrick Sanan .seealso: `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`,
110db781477SPatrick Sanan           `PetscError()`, `PetscCall()`, `CHKMEMQ`, `CHKERRA()`, `PetscCallMPI()`
11130de9b25SBarry Smith M*/
11298921bdaSJacob Faibussowitsch #define SETERRQ(comm, ierr, ...) return PetscError(comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr, PETSC_ERROR_INITIAL, __VA_ARGS__)
113986eef2eSBarry Smith 
114ffc4695bSBarry Smith /*
115ffc4695bSBarry Smith     Returned from PETSc functions that are called from MPI, such as related to attributes
116ffc4695bSBarry Smith       Do not confuse PETSC_MPI_ERROR_CODE and PETSC_ERR_MPI, the first is registered with MPI and returned to MPI as
117888a1fb3SBarry Smith       an error code, the latter is a regular PETSc error code passed within PETSc code indicating an error was detected in an MPI call.
118ffc4695bSBarry Smith */
119ffc4695bSBarry Smith PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CLASS;
120ffc4695bSBarry Smith PETSC_EXTERN PetscMPIInt PETSC_MPI_ERROR_CODE;
121ffc4695bSBarry Smith 
122986eef2eSBarry Smith /*MC
123986eef2eSBarry Smith    SETERRMPI - Macro to be called when an error has been detected within an MPI callback function
124986eef2eSBarry Smith 
125986eef2eSBarry Smith    Synopsis:
126986eef2eSBarry Smith    #include <petscsys.h>
12798921bdaSJacob Faibussowitsch    PetscErrorCode SETERRMPI(MPI_Comm comm,PetscErrorCode ierr,char *message,...)
128986eef2eSBarry Smith 
129d083f849SBarry Smith    Collective
130986eef2eSBarry Smith 
131986eef2eSBarry Smith    Input Parameters:
13287497f52SBarry Smith +  comm - A communicator, use `PETSC_COMM_SELF` unless you know all ranks of another communicator will detect the error
133986eef2eSBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
134986eef2eSBarry Smith -  message - error message
135986eef2eSBarry Smith 
136986eef2eSBarry Smith   Level: developer
137986eef2eSBarry Smith 
138986eef2eSBarry Smith    Notes:
13987497f52SBarry Smith     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`
14087497f52SBarry Smith     which is registered with `MPI_Add_error_code()` when PETSc is initialized.
141986eef2eSBarry Smith 
142db781477SPatrick Sanan .seealso: `SETERRQ()`, `PetscCall()`, `PetscCallMPI()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
143986eef2eSBarry Smith M*/
14498921bdaSJacob Faibussowitsch #define SETERRMPI(comm, ierr, ...) return (PetscError(comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr, PETSC_ERROR_INITIAL, __VA_ARGS__), PETSC_MPI_ERROR_CODE)
145ee8199e6SMatthew G. Knepley 
146ee8199e6SMatthew G. Knepley /*MC
147f388eb8bSPatrick Sanan    SETERRA - Fortran-only macro that can be called when an error has been detected from the main program
148f388eb8bSPatrick Sanan 
149f388eb8bSPatrick Sanan    Synopsis:
150f388eb8bSPatrick Sanan    #include <petscsys.h>
151f388eb8bSPatrick Sanan    PetscErrorCode SETERRA(MPI_Comm comm,PetscErrorCode ierr,char *message)
152f388eb8bSPatrick Sanan 
153f388eb8bSPatrick Sanan    Collective
154f388eb8bSPatrick Sanan 
155f388eb8bSPatrick Sanan    Input Parameters:
156f388eb8bSPatrick Sanan +  comm - A communicator, so that the error can be collective
157f388eb8bSPatrick Sanan .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
158f388eb8bSPatrick Sanan -  message - error message in the printf format
159f388eb8bSPatrick Sanan 
160f388eb8bSPatrick Sanan   Level: beginner
161f388eb8bSPatrick Sanan 
162f388eb8bSPatrick Sanan    Notes:
16387497f52SBarry Smith     This should only be used with Fortran. With C/C++, use `SETERRQ()`.
164f388eb8bSPatrick Sanan 
165f388eb8bSPatrick Sanan    Fortran Notes:
16687497f52SBarry Smith       `SETERRQ()` may be called from Fortran subroutines but `SETERRA()` must be called from the
167f388eb8bSPatrick Sanan       Fortran main program.
168f388eb8bSPatrick Sanan 
169db781477SPatrick Sanan .seealso: `SETERRQ()`, `SETERRABORT()`, `PetscCall()`, `CHKERRA()`, `PetscCallAbort()`
170f388eb8bSPatrick Sanan M*/
171f388eb8bSPatrick Sanan 
172f388eb8bSPatrick Sanan /*MC
173fa190f98SMatthew G. Knepley    SETERRABORT - Macro that can be called when an error has been detected,
174fa190f98SMatthew G. Knepley 
175fa190f98SMatthew G. Knepley    Synopsis:
176fa190f98SMatthew G. Knepley    #include <petscsys.h>
17798921bdaSJacob Faibussowitsch    PetscErrorCode SETERRABORT(MPI_Comm comm,PetscErrorCode ierr,char *message,...)
178fa190f98SMatthew G. Knepley 
179d083f849SBarry Smith    Collective
180fa190f98SMatthew G. Knepley 
181fa190f98SMatthew G. Knepley    Input Parameters:
182fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
1833af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
184fa190f98SMatthew G. Knepley -  message - error message in the printf format
185fa190f98SMatthew G. Knepley 
186fa190f98SMatthew G. Knepley   Level: beginner
187fa190f98SMatthew G. Knepley 
188fa190f98SMatthew G. Knepley    Notes:
18987497f52SBarry Smith     This function just calls `MPI_Abort()`.
19087497f52SBarry Smith 
19187497f52SBarry Smith     This should only be called in routines that cannot return an error code, such as in C++ constructors.
192fa190f98SMatthew G. Knepley 
193db781477SPatrick Sanan .seealso: `SETERRQ()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `PetscCall()`, `CHKMEMQ`
194fa190f98SMatthew G. Knepley M*/
1959371c9d4SSatish Balay #define SETERRABORT(comm, ierr, ...) \
1969371c9d4SSatish Balay   do { \
19798921bdaSJacob Faibussowitsch     PetscError(comm, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr, PETSC_ERROR_INITIAL, __VA_ARGS__); \
19898921bdaSJacob Faibussowitsch     MPI_Abort(comm, ierr); \
19998921bdaSJacob Faibussowitsch   } while (0)
2009a00fa46SSatish Balay 
20130de9b25SBarry Smith /*MC
2022c71b3e2SJacob Faibussowitsch   PetscCheck - Check that a particular condition is true
2032c71b3e2SJacob Faibussowitsch 
2042c71b3e2SJacob Faibussowitsch   Synopsis:
2052c71b3e2SJacob Faibussowitsch   #include <petscerror.h>
2062c71b3e2SJacob Faibussowitsch   void PetscCheck(bool cond, MPI_Comm comm, PetscErrorCode ierr, const char *message, ...)
2072c71b3e2SJacob Faibussowitsch 
2082c71b3e2SJacob Faibussowitsch   Collective
2092c71b3e2SJacob Faibussowitsch 
2102c71b3e2SJacob Faibussowitsch   Input Parameters:
2112c71b3e2SJacob Faibussowitsch + cond    - The boolean condition
2122c71b3e2SJacob Faibussowitsch . comm    - The communicator on which the check can be collective on
2132c71b3e2SJacob Faibussowitsch . ierr    - A nonzero error code, see include/petscerror.h for the complete list
2142c71b3e2SJacob Faibussowitsch - message - Error message in printf format
2152c71b3e2SJacob Faibussowitsch 
2162c71b3e2SJacob Faibussowitsch   Notes:
2172c71b3e2SJacob Faibussowitsch   Enabled in both optimized and debug builds.
2182c71b3e2SJacob Faibussowitsch 
21987497f52SBarry Smith   Calls `SETERRQ()` if the assertion fails, so can only be called from functions returning a
22087497f52SBarry Smith   `PetscErrorCode` (or equivalent type after conversion).
2212c71b3e2SJacob Faibussowitsch 
2222c71b3e2SJacob Faibussowitsch   Level: beginner
2232c71b3e2SJacob Faibussowitsch 
2244be741a6SBarry Smith .seealso: `PetscAssert()`, `SETERRQ()`, `PetscError()`, `PetscCall()`, `PetscCheckAbort()`
2259566063dSJacob Faibussowitsch M*/
2269371c9d4SSatish Balay #define PetscCheck(cond, comm, ierr, ...) \
2279371c9d4SSatish Balay   do { \
2289371c9d4SSatish Balay     if (PetscUnlikely(!(cond))) SETERRQ(comm, ierr, __VA_ARGS__); \
2299371c9d4SSatish Balay   } while (0)
2302c71b3e2SJacob Faibussowitsch 
2312c71b3e2SJacob Faibussowitsch /*MC
2324be741a6SBarry Smith   PetscCheckAbort - Check that a particular condition is true, otherwise prints error and aborts
2334be741a6SBarry Smith 
2344be741a6SBarry Smith   Synopsis:
2354be741a6SBarry Smith   #include <petscerror.h>
2364be741a6SBarry Smith   void PetscCheckAbort(bool cond, MPI_Comm comm, PetscErrorCode ierr, const char *message, ...)
2374be741a6SBarry Smith 
2384be741a6SBarry Smith   Collective
2394be741a6SBarry Smith 
2404be741a6SBarry Smith   Input Parameters:
2414be741a6SBarry Smith + cond    - The boolean condition
2424be741a6SBarry Smith . comm    - The communicator on which the check can be collective on
2434be741a6SBarry Smith . ierr    - A nonzero error code, see include/petscerror.h for the complete list
2444be741a6SBarry Smith - message - Error message in printf format
2454be741a6SBarry Smith 
2464be741a6SBarry Smith   Notes:
2474be741a6SBarry Smith   Enabled in both optimized and debug builds.
2484be741a6SBarry Smith 
24987497f52SBarry Smith   Calls `SETERRABORT()` if the assertion fails, can be called from a function that does not return an
25087497f52SBarry Smith   error code, such as a C++ constructor. usually `PetscCheck()` should be used.
2514be741a6SBarry Smith 
2524be741a6SBarry Smith   Level: developer
2534be741a6SBarry Smith 
2544be741a6SBarry Smith .seealso: `PetscAssert()`, `SETERRQ()`, `PetscError()`, `PetscCall()`, `PetscCheck()`, `SETTERRABORT()`
2554be741a6SBarry Smith M*/
2569371c9d4SSatish Balay #define PetscCheckAbort(cond, comm, ierr, ...) \
2579371c9d4SSatish Balay   if (PetscUnlikely(!(cond))) SETERRABORT(comm, ierr, __VA_ARGS__)
2584be741a6SBarry Smith 
2594be741a6SBarry Smith /*MC
2609ace16cdSJacob Faibussowitsch   PetscAssert - Assert that a particular condition is true
2619ace16cdSJacob Faibussowitsch 
2629ace16cdSJacob Faibussowitsch   Synopsis:
2639ace16cdSJacob Faibussowitsch   #include <petscerror.h>
2649ace16cdSJacob Faibussowitsch   void PetscAssert(bool cond, MPI_Comm comm, PetscErrorCode ierr, const char *message, ...)
2659ace16cdSJacob Faibussowitsch 
2669ace16cdSJacob Faibussowitsch   Collective
2679ace16cdSJacob Faibussowitsch 
2689ace16cdSJacob Faibussowitsch   Input Parameters:
2699ace16cdSJacob Faibussowitsch + cond    - The boolean condition
2709ace16cdSJacob Faibussowitsch . comm    - The communicator on which the check can be collective on
2719ace16cdSJacob Faibussowitsch . ierr    - A nonzero error code, see include/petscerror.h for the complete list
2729ace16cdSJacob Faibussowitsch - message - Error message in printf format
2739ace16cdSJacob Faibussowitsch 
2749ace16cdSJacob Faibussowitsch   Notes:
2752c71b3e2SJacob Faibussowitsch   Enabled only in debug builds. Note that any arguments to this macros are still visible to the
2762c71b3e2SJacob Faibussowitsch   compiler optimized builds (so must still contain valid code) but are guaranteed to not be
2772c71b3e2SJacob Faibussowitsch   executed.
2782c71b3e2SJacob Faibussowitsch 
27987497f52SBarry Smith   See `PetscCheck()` for usage and behaviour.
28087497f52SBarry Smith 
28187497f52SBarry Smith   This is needed instead of simply using `assert()` because this correctly handles the collective nature of errors under MPI
2829ace16cdSJacob Faibussowitsch 
2839ace16cdSJacob Faibussowitsch   Level: beginner
2849ace16cdSJacob Faibussowitsch 
285db781477SPatrick Sanan .seealso: `PetscCheck()`, `SETERRQ()`, `PetscError()`
2869566063dSJacob Faibussowitsch M*/
2879371c9d4SSatish Balay #define PetscAssert(cond, comm, ierr, ...) \
2889371c9d4SSatish Balay   do { \
2899371c9d4SSatish Balay     if (PetscUnlikelyDebug(!(cond))) SETERRQ(comm, ierr, __VA_ARGS__); \
2909371c9d4SSatish Balay   } while (0)
2919ace16cdSJacob Faibussowitsch 
2929ace16cdSJacob Faibussowitsch /*MC
29349c86fc7SBarry Smith   PetscCall - Calls a PETSc function and then checks the resulting error code, if it is non-zero it calls the error
29449c86fc7SBarry Smith   handler and returns from the current function with the error code.
2959566063dSJacob Faibussowitsch 
2969566063dSJacob Faibussowitsch   Synopsis:
2979566063dSJacob Faibussowitsch   #include <petscerror.h>
29849c86fc7SBarry Smith   void PetscCall(PetscFunction(args))
2999566063dSJacob Faibussowitsch 
3009566063dSJacob Faibussowitsch   Not Collective
3019566063dSJacob Faibussowitsch 
3029566063dSJacob Faibussowitsch   Input Parameter:
30349c86fc7SBarry Smith . PetscFunction - any PETSc function that returns an error code
3049566063dSJacob Faibussowitsch 
3059566063dSJacob Faibussowitsch   Notes:
3069566063dSJacob Faibussowitsch   Once the error handler is called the calling function is then returned from with the given
30787497f52SBarry Smith   error code. Experienced users can set the error handler with `PetscPushErrorHandler()`.
3089566063dSJacob Faibussowitsch 
30987497f52SBarry Smith   `PetscCall()` cannot be used in functions returning a datatype not convertible to
31087497f52SBarry Smith   `PetscErrorCode`. For example, `PetscCall()` may not be used in functions returning void, use
31187497f52SBarry Smith   `PetscCallVoid()` in this case.
3129566063dSJacob Faibussowitsch 
3139566063dSJacob Faibussowitsch   Example Usage:
3149566063dSJacob Faibussowitsch .vb
3159566063dSJacob Faibussowitsch   PetscCall(PetscInitiailize(...)); // OK to call even when PETSc is not yet initialized!
3169566063dSJacob Faibussowitsch 
3179566063dSJacob Faibussowitsch   struct my_struct
3189566063dSJacob Faibussowitsch   {
3199566063dSJacob Faibussowitsch     void *data;
3209566063dSJacob Faibussowitsch   } my_complex_type;
3219566063dSJacob Faibussowitsch 
3229566063dSJacob Faibussowitsch   struct my_struct bar(void)
3239566063dSJacob Faibussowitsch   {
3246aad120cSJose E. Roman     PetscCall(foo(15)); // ERROR PetscErrorCode not convertible to struct my_struct!
3259566063dSJacob Faibussowitsch   }
3269566063dSJacob Faibussowitsch 
3276aad120cSJose E. Roman   PetscCall(bar()) // ERROR input not convertible to PetscErrorCode
3289566063dSJacob Faibussowitsch .ve
3299566063dSJacob Faibussowitsch 
33087497f52SBarry Smith   It is also possible to call this directly on a `PetscErrorCode` variable
33149c86fc7SBarry Smith .vb
33249c86fc7SBarry Smith   PetscCall(ierr);  // check if ierr is nonzero
33349c86fc7SBarry Smith .ve
33449c86fc7SBarry Smith 
335792fecdfSBarry Smith   Should not be used to call callback functions provided by users, `PetscCallBack()` should be used in that situation.
336ef1023bdSBarry Smith 
3376a8be23eSBarry Smith   `PetscUseTypeMethod()` or `PetscTryTypeMethod()` should be used when calling functions pointers contained in a PETSc object's `ops` array
3386a8be23eSBarry Smith 
33949c86fc7SBarry Smith   Fortran Notes:
34049c86fc7SBarry Smith     The Fortran function from which this is used must declare a variable PetscErrorCode ierr and ierr must be
34187497f52SBarry Smith     the final argument to the PETSc function being called.
34249c86fc7SBarry Smith 
34349c86fc7SBarry Smith     In the main program and in Fortran subroutines that do not have ierr as the final return parameter one
34487497f52SBarry Smith     should use `PetscCallA()`
34549c86fc7SBarry Smith 
34649c86fc7SBarry Smith   Example Fortran Usage:
34749c86fc7SBarry Smith .vb
34849c86fc7SBarry Smith   PetscErrorCode ierr
34949c86fc7SBarry Smith   Vec v
35049c86fc7SBarry Smith 
35149c86fc7SBarry Smith   ...
35249c86fc7SBarry Smith   PetscCall(VecShift(v,1.0,ierr))
35349c86fc7SBarry Smith   PetscCallA(VecShift(v,1.0,ierr))
35449c86fc7SBarry Smith .ve
35549c86fc7SBarry Smith 
3569566063dSJacob Faibussowitsch   Level: beginner
3579566063dSJacob Faibussowitsch 
35849c86fc7SBarry Smith .seealso: `SETERRQ()`, `PetscCheck()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscCallMPI()`
359792fecdfSBarry Smith           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`, `CHKERRA()`, `CHKERRMPI()`, `PetscCallBack()`
3609566063dSJacob Faibussowitsch M*/
361ef1023bdSBarry Smith 
362ef1023bdSBarry Smith /*MC
363792fecdfSBarry Smith   PetscCallBack - Calls a user provided PETSc callback function and then checks the resulting error code, if it is non-zero it calls the error
364ef1023bdSBarry Smith   handler and returns from the current function with the error code.
365ef1023bdSBarry Smith 
366ef1023bdSBarry Smith   Synopsis:
367ef1023bdSBarry Smith   #include <petscerror.h>
368792fecdfSBarry Smith   void PetscCallBack(const char *functionname,PetscFunction(args))
369ef1023bdSBarry Smith 
370ef1023bdSBarry Smith   Not Collective
371ef1023bdSBarry Smith 
372ef1023bdSBarry Smith   Input Parameters:
373ef1023bdSBarry Smith + functionname - the name of the function being called, this can be a string with spaces that describes the meaning of the callback
37487497f52SBarry Smith - PetscFunction - user provided callback function that returns an error code
375ef1023bdSBarry Smith 
376ef1023bdSBarry Smith   Notes:
377ef1023bdSBarry Smith   Once the error handler is called the calling function is then returned from with the given
37887497f52SBarry Smith   error code. Experienced users can set the error handler with `PetscPushErrorHandler()`.
379ef1023bdSBarry Smith 
38087497f52SBarry Smith   `PetscCallBack()` should only be called in PETSc when a call is being made to a user provided call-back routine.
381ef1023bdSBarry Smith 
382ef1023bdSBarry Smith   Example Usage:
383ef1023bdSBarry Smith .vb
384792fecdfSBarry Smith   PetscCallBack("XXX callback to do something",a->callback(...));
385ef1023bdSBarry Smith .ve
386ef1023bdSBarry Smith 
387ef1023bdSBarry Smith   Level: developer
388ef1023bdSBarry Smith 
38987497f52SBarry Smith .seealso: `SETERRQ()`, `PetscCheck()`, `PetscCall()`, `PetscAssert()`, `PetscTraceBackErrorHandler()`, `PetscCallMPI()`
390ef1023bdSBarry Smith           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`, `CHKERRA()`, `CHKERRMPI()`, `PetscCall()`
391ef1023bdSBarry Smith M*/
392ef1023bdSBarry Smith 
3939566063dSJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
3949566063dSJacob Faibussowitsch void PetscCall(PetscErrorCode);
395792fecdfSBarry Smith void PetscCallBack(const char *, PetscErrorCode);
3969566063dSJacob Faibussowitsch void PetscCallVoid(PetscErrorCode);
3979566063dSJacob Faibussowitsch #else
3989371c9d4SSatish Balay #define PetscCall(...) \
3999371c9d4SSatish Balay   do { \
400e33ced7fSLisandro Dalcin     PetscErrorCode ierr_q_; \
40137154d10SBarry Smith     PetscStackUpdateLine; \
402e33ced7fSLisandro Dalcin     ierr_q_ = __VA_ARGS__; \
4039566063dSJacob Faibussowitsch     if (PetscUnlikely(ierr_q_)) return PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_q_, PETSC_ERROR_REPEAT, " "); \
4049566063dSJacob Faibussowitsch   } while (0)
4059371c9d4SSatish Balay #define PetscCallBack(function, ...) \
4069371c9d4SSatish Balay   do { \
407e33ced7fSLisandro Dalcin     PetscErrorCode ierr_q_; \
408e33ced7fSLisandro Dalcin     PetscStackUpdateLine; \
409e33ced7fSLisandro Dalcin     PetscStackPushExternal(function); \
410e33ced7fSLisandro Dalcin     ierr_q_ = __VA_ARGS__; \
411ef1023bdSBarry Smith     PetscStackPop; \
412ef1023bdSBarry Smith     if (PetscUnlikely(ierr_q_)) return PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_q_, PETSC_ERROR_REPEAT, " "); \
413ef1023bdSBarry Smith   } while (0)
4149371c9d4SSatish Balay #define PetscCallVoid(...) \
4159371c9d4SSatish Balay   do { \
416e33ced7fSLisandro Dalcin     PetscErrorCode ierr_void_; \
417e33ced7fSLisandro Dalcin     PetscStackUpdateLine; \
418e33ced7fSLisandro Dalcin     ierr_void_ = __VA_ARGS__; \
4199371c9d4SSatish Balay     if (PetscUnlikely(ierr_void_)) { \
4209371c9d4SSatish Balay       (void)PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_void_, PETSC_ERROR_REPEAT, " "); \
4219371c9d4SSatish Balay       return; \
4229371c9d4SSatish Balay     } \
4239566063dSJacob Faibussowitsch   } while (0)
4249566063dSJacob Faibussowitsch #endif
4259566063dSJacob Faibussowitsch 
4269566063dSJacob Faibussowitsch /*MC
4279566063dSJacob Faibussowitsch   CHKERRQ - Checks error code returned from PETSc function
42830de9b25SBarry Smith 
42930de9b25SBarry Smith   Synopsis:
430aaa7dc30SBarry Smith   #include <petscsys.h>
4319566063dSJacob Faibussowitsch   void CHKERRQ(PetscErrorCode ierr)
4329566063dSJacob Faibussowitsch 
4339566063dSJacob Faibussowitsch   Not Collective
4349566063dSJacob Faibussowitsch 
4359566063dSJacob Faibussowitsch   Input Parameters:
4369566063dSJacob Faibussowitsch . ierr - nonzero error code
4379566063dSJacob Faibussowitsch 
4389566063dSJacob Faibussowitsch   Notes:
43987497f52SBarry Smith   Deprecated in favor of `PetscCall()`. This routine behaves identically to it.
4409566063dSJacob Faibussowitsch 
4419566063dSJacob Faibussowitsch   Level: deprecated
4429566063dSJacob Faibussowitsch 
443db781477SPatrick Sanan .seealso: `PetscCall()`
4449566063dSJacob Faibussowitsch M*/
4459566063dSJacob Faibussowitsch #define CHKERRQ(...) PetscCall(__VA_ARGS__)
4469566063dSJacob Faibussowitsch #define CHKERRV(...) PetscCallVoid(__VA_ARGS__)
4479566063dSJacob Faibussowitsch 
448db9cea48SBarry Smith PETSC_EXTERN void PetscMPIErrorString(PetscMPIInt, char *);
449db9cea48SBarry Smith 
4509566063dSJacob Faibussowitsch /*MC
4519566063dSJacob Faibussowitsch   PetscCallMPI - Checks error code returned from MPI calls, if non-zero it calls the error
4529566063dSJacob Faibussowitsch   handler and then returns
4539566063dSJacob Faibussowitsch 
4549566063dSJacob Faibussowitsch   Synopsis:
4559566063dSJacob Faibussowitsch   #include <petscerror.h>
45649c86fc7SBarry Smith   void PetscCallMPI(MPI_Function(args))
45730de9b25SBarry Smith 
458eca87e8dSBarry Smith   Not Collective
45930de9b25SBarry Smith 
46030de9b25SBarry Smith   Input Parameters:
46149c86fc7SBarry Smith . MPI_Function - an MPI function that returns an MPI error code
46230de9b25SBarry Smith 
4639566063dSJacob Faibussowitsch   Notes:
46487497f52SBarry Smith   Always returns the error code `PETSC_ERR_MPI`; the MPI error code and string are embedded in
4659566063dSJacob Faibussowitsch   the string error message. Do not use this to call any other routines (for example PETSc
4669566063dSJacob Faibussowitsch   routines), it should only be used for direct MPI calls. Due to limitations of the
4679566063dSJacob Faibussowitsch   preprocessor this can unfortunately not easily be enforced, so the user should take care to
4689566063dSJacob Faibussowitsch   check this themselves.
4699566063dSJacob Faibussowitsch 
4709566063dSJacob Faibussowitsch   Example Usage:
4719566063dSJacob Faibussowitsch .vb
4729566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(...)); // OK, calling MPI function
4739566063dSJacob Faibussowitsch 
4749566063dSJacob Faibussowitsch   PetscCallMPI(PetscFunction(...)); // ERROR, use PetscCall() instead!
4759566063dSJacob Faibussowitsch .ve
4769566063dSJacob Faibussowitsch 
47749c86fc7SBarry Smith   Fortran Notes:
47887497f52SBarry Smith     The Fortran function from which this is used must declare a variable `PetscErrorCode` ierr and ierr must be
47949c86fc7SBarry Smith     the final argument to the MPI function being called.
48049c86fc7SBarry Smith 
48149c86fc7SBarry Smith     In the main program and in Fortran subroutines that do not have ierr as the final return parameter one
48287497f52SBarry Smith     should use `PetscCallMPIA()`
48349c86fc7SBarry Smith 
48449c86fc7SBarry Smith   Fortran Usage:
48549c86fc7SBarry Smith .vb
48649c86fc7SBarry Smith   PetscErrorCode ierr or integer ierr
48749c86fc7SBarry Smith   ...
48849c86fc7SBarry Smith   PetscCallMPI(MPI_Comm_size(...,ierr))
48949c86fc7SBarry Smith   PetscCallMPIA(MPI_Comm_size(...,ierr)) ! Will abort after calling error handler
49049c86fc7SBarry Smith 
49149c86fc7SBarry Smith   PetscCallMPI(MPI_Comm_size(...,eflag)) ! ERROR, final argument must be ierr
49249c86fc7SBarry Smith .ve
49349c86fc7SBarry Smith 
49430de9b25SBarry Smith   Level: beginner
49530de9b25SBarry Smith 
496db781477SPatrick Sanan .seealso: `SETERRMPI()`, `PetscCall()`, `SETERRQ()`, `SETERRABORT()`, `PetscCallAbort()`,
497db781477SPatrick Sanan           `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
49830de9b25SBarry Smith M*/
4993fcd9f07SJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
50063a3b9bcSJacob Faibussowitsch void PetscCallMPI(PetscMPIInt);
501064a246eSJacob Faibussowitsch #else
5029371c9d4SSatish Balay #define PetscCallMPI(...) \
5039371c9d4SSatish Balay   do { \
504e33ced7fSLisandro Dalcin     PetscMPIInt _7_errorcode; \
505e33ced7fSLisandro Dalcin     char        _7_errorstring[2 * MPI_MAX_ERROR_STRING]; \
506ef1023bdSBarry Smith     PetscStackUpdateLine; \
507792fecdfSBarry Smith     PetscStackPushExternal("MPI function"); \
508e33ced7fSLisandro Dalcin     { _7_errorcode = __VA_ARGS__; } \
509ef1023bdSBarry Smith     PetscStackPop; \
5109566063dSJacob Faibussowitsch     if (PetscUnlikely(_7_errorcode)) { \
511db9cea48SBarry Smith       PetscMPIErrorString(_7_errorcode, (char *)_7_errorstring); \
512db9cea48SBarry Smith       SETERRQ(PETSC_COMM_SELF, PETSC_ERR_MPI, "MPI error %d %s", (int)_7_errorcode, _7_errorstring); \
5133fcd9f07SJacob Faibussowitsch     } \
5143fcd9f07SJacob Faibussowitsch   } while (0)
5159566063dSJacob Faibussowitsch #endif
516064a246eSJacob Faibussowitsch 
5177037b0edSPatrick Sanan /*MC
5189566063dSJacob Faibussowitsch   CHKERRMPI - Checks error code returned from MPI calls, if non-zero it calls the error
5199566063dSJacob Faibussowitsch   handler and then returns
5209566063dSJacob Faibussowitsch 
5219566063dSJacob Faibussowitsch   Synopsis:
5229566063dSJacob Faibussowitsch   #include <petscerror.h>
5239566063dSJacob Faibussowitsch   void CHKERRMPI(PetscErrorCode ierr)
5249566063dSJacob Faibussowitsch 
5259566063dSJacob Faibussowitsch   Not Collective
5269566063dSJacob Faibussowitsch 
5279566063dSJacob Faibussowitsch   Input Parameter:
5289566063dSJacob Faibussowitsch . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
5299566063dSJacob Faibussowitsch 
5309566063dSJacob Faibussowitsch   Notes:
53187497f52SBarry Smith   Deprecated in favor of `PetscCallMPI()`. This routine behaves identically to it.
5329566063dSJacob Faibussowitsch 
5339566063dSJacob Faibussowitsch   Level: deprecated
5349566063dSJacob Faibussowitsch 
535db781477SPatrick Sanan .seealso: `PetscCallMPI()`
5369566063dSJacob Faibussowitsch M*/
5379566063dSJacob Faibussowitsch #define CHKERRMPI(...) PetscCallMPI(__VA_ARGS__)
5389566063dSJacob Faibussowitsch 
5399566063dSJacob Faibussowitsch /*MC
5409566063dSJacob Faibussowitsch   PetscCallAbort - Checks error code returned from PETSc function, if non-zero it aborts immediately
5419566063dSJacob Faibussowitsch 
5429566063dSJacob Faibussowitsch   Synopsis:
5439566063dSJacob Faibussowitsch   #include <petscerror.h>
5449566063dSJacob Faibussowitsch   void PetscCallAbort(MPI_Comm comm, PetscErrorCode ierr)
5459566063dSJacob Faibussowitsch 
5469566063dSJacob Faibussowitsch   Collective on comm
5479566063dSJacob Faibussowitsch 
5489566063dSJacob Faibussowitsch   Input Parameters:
5499566063dSJacob Faibussowitsch + comm - the MPI communicator on which to abort
5509566063dSJacob Faibussowitsch - ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
5519566063dSJacob Faibussowitsch 
5529566063dSJacob Faibussowitsch   Notes:
55387497f52SBarry Smith   This macro has identical type and usage semantics to `PetscCall()` with the important caveat
5549566063dSJacob Faibussowitsch   that this macro does not return. Instead, if ierr is nonzero it calls the PETSc error handler
55587497f52SBarry Smith   and then immediately calls `MPI_Abort()`. It can therefore be used anywhere.
5569566063dSJacob Faibussowitsch 
55787497f52SBarry Smith   As per `MPI_Abort()` semantics the communicator passed must be valid, although there is currently
55887497f52SBarry Smith   no attempt made at handling any potential errors from `MPI_Abort()`. Note that while
55987497f52SBarry Smith   `MPI_Abort()` is required to terminate only those processes which reside on comm, it is often
56087497f52SBarry Smith   the case that `MPI_Abort()` terminates *all* processes.
5619566063dSJacob Faibussowitsch 
5629566063dSJacob Faibussowitsch   Example Usage:
5639566063dSJacob Faibussowitsch .vb
5649566063dSJacob Faibussowitsch   PetscErrorCode boom(void) { return PETSC_ERR_MEM; }
5659566063dSJacob Faibussowitsch 
5669566063dSJacob Faibussowitsch   void foo(void)
5679566063dSJacob Faibussowitsch   {
5689566063dSJacob Faibussowitsch     PetscCallAbort(PETSC_COMM_WORLD,boom()); // OK, does not return a type
5699566063dSJacob Faibussowitsch   }
5709566063dSJacob Faibussowitsch 
5719566063dSJacob Faibussowitsch   double bar(void)
5729566063dSJacob Faibussowitsch   {
5739566063dSJacob Faibussowitsch     PetscCallAbort(PETSC_COMM_WORLD,boom()); // OK, does not return a type
5749566063dSJacob Faibussowitsch   }
5759566063dSJacob Faibussowitsch 
5769566063dSJacob Faibussowitsch   PetscCallAbort(MPI_COMM_NULL,boom()); // ERROR, communicator should be valid
5779566063dSJacob Faibussowitsch 
5789566063dSJacob Faibussowitsch   struct baz
5799566063dSJacob Faibussowitsch   {
5809566063dSJacob Faibussowitsch     baz()
5819566063dSJacob Faibussowitsch     {
5829566063dSJacob Faibussowitsch       PetscCallAbort(PETSC_COMM_SELF,boom()); // OK
5839566063dSJacob Faibussowitsch     }
5849566063dSJacob Faibussowitsch 
5859566063dSJacob Faibussowitsch     ~baz()
5869566063dSJacob Faibussowitsch     {
5879566063dSJacob Faibussowitsch       PetscCallAbort(PETSC_COMM_SELF,boom()); // OK (in fact the only way to handle PETSc errors)
5889566063dSJacob Faibussowitsch     }
5899566063dSJacob Faibussowitsch   };
5909566063dSJacob Faibussowitsch .ve
5919566063dSJacob Faibussowitsch 
5929566063dSJacob Faibussowitsch   Level: intermediate
5939566063dSJacob Faibussowitsch 
594db781477SPatrick Sanan .seealso: `SETERRABORT()`, `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`,
595db781477SPatrick Sanan           `SETERRQ()`, `CHKMEMQ`, `PetscCallMPI()`
5969566063dSJacob Faibussowitsch M*/
5979566063dSJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
5989566063dSJacob Faibussowitsch void PetscCallAbort(MPI_Comm, PetscErrorCode);
5999566063dSJacob Faibussowitsch void PetscCallContinue(PetscErrorCode);
6009566063dSJacob Faibussowitsch #else
6019371c9d4SSatish Balay #define PetscCallAbort(comm, ...) \
6029371c9d4SSatish Balay   do { \
6039566063dSJacob Faibussowitsch     PetscErrorCode ierr_abort_ = __VA_ARGS__; \
6049566063dSJacob Faibussowitsch     if (PetscUnlikely(ierr_abort_)) { \
6059566063dSJacob Faibussowitsch       PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_abort_, PETSC_ERROR_REPEAT, " "); \
6069566063dSJacob Faibussowitsch       MPI_Abort(comm, ierr_abort_); \
6079566063dSJacob Faibussowitsch     } \
6089566063dSJacob Faibussowitsch   } while (0)
6099371c9d4SSatish Balay #define PetscCallContinue(...) \
6109371c9d4SSatish Balay   do { \
6119566063dSJacob Faibussowitsch     PetscErrorCode ierr_continue_ = __VA_ARGS__; \
6129566063dSJacob Faibussowitsch     if (PetscUnlikely(ierr_continue_)) PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_continue_, PETSC_ERROR_REPEAT, " "); \
6139566063dSJacob Faibussowitsch   } while (0)
6149566063dSJacob Faibussowitsch #endif
6159566063dSJacob Faibussowitsch 
6169566063dSJacob Faibussowitsch /*MC
6179566063dSJacob Faibussowitsch   CHKERRABORT - Checks error code returned from PETSc function. If non-zero it aborts immediately.
6189566063dSJacob Faibussowitsch 
6199566063dSJacob Faibussowitsch   Synopsis:
6209566063dSJacob Faibussowitsch   #include <petscerror.h>
6219566063dSJacob Faibussowitsch   void CHKERRABORT(MPI_Comm comm, PetscErrorCode ierr)
6229566063dSJacob Faibussowitsch 
6239566063dSJacob Faibussowitsch   Not Collective
6249566063dSJacob Faibussowitsch 
6259566063dSJacob Faibussowitsch   Input Parameters:
6269566063dSJacob Faibussowitsch + comm - the MPI communicator
6279566063dSJacob Faibussowitsch - ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
6289566063dSJacob Faibussowitsch 
6299566063dSJacob Faibussowitsch   Notes:
63087497f52SBarry Smith   Deprecated in favor of `PetscCallAbort()`. This routine behaves identically to it.
6319566063dSJacob Faibussowitsch 
6329566063dSJacob Faibussowitsch   Level: deprecated
6339566063dSJacob Faibussowitsch 
634db781477SPatrick Sanan .seealso: `PetscCallAbort()`
6359566063dSJacob Faibussowitsch M*/
6369566063dSJacob Faibussowitsch #define CHKERRABORT(comm, ...) PetscCallAbort(comm, __VA_ARGS__)
6379566063dSJacob Faibussowitsch #define CHKERRCONTINUE(...)    PetscCallContinue(__VA_ARGS__)
6389566063dSJacob Faibussowitsch 
6399566063dSJacob Faibussowitsch /*MC
64087497f52SBarry Smith    CHKERRA - Fortran-only replacement for use of `CHKERRQ()` in the main program, which aborts immediately
641f388eb8bSPatrick Sanan 
642f388eb8bSPatrick Sanan    Synopsis:
643f388eb8bSPatrick Sanan    #include <petscsys.h>
644f388eb8bSPatrick Sanan    PetscErrorCode CHKERRA(PetscErrorCode ierr)
645f388eb8bSPatrick Sanan 
646f388eb8bSPatrick Sanan    Not Collective
647f388eb8bSPatrick Sanan 
648f388eb8bSPatrick Sanan    Input Parameters:
649f388eb8bSPatrick Sanan .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
650f388eb8bSPatrick Sanan 
65187497f52SBarry Smith   Level: deprecated
652f388eb8bSPatrick Sanan 
65387497f52SBarry Smith    Note:
65487497f52SBarry Smith    This macro is rarely needed, normal usage is `PetscCallA()` in the main Fortran program.
655f388eb8bSPatrick Sanan 
65687497f52SBarry Smith .seealso: `PetscCall()`, `PetscCallA()`, `PetscCallAbort()`, `CHKERRQ()`, `SETERRA()`, `SETERRQ()`, `SETERRABORT()`
657f388eb8bSPatrick Sanan M*/
658f388eb8bSPatrick Sanan 
6591e4f893aSSatish Balay PETSC_EXTERN PetscBool petscwaitonerrorflg;
6601e4f893aSSatish Balay PETSC_EXTERN PetscBool petscindebugger;
6617c66cc67SJunchao Zhang 
6627c66cc67SJunchao Zhang /*MC
6637c66cc67SJunchao Zhang    PETSCABORT - Call MPI_Abort with an informative error code
6647c66cc67SJunchao Zhang 
6657c66cc67SJunchao Zhang    Synopsis:
6667c66cc67SJunchao Zhang    #include <petscsys.h>
6677c66cc67SJunchao Zhang    PETSCABORT(MPI_Comm comm, PetscErrorCode ierr)
6687c66cc67SJunchao Zhang 
6697c66cc67SJunchao Zhang    Collective
6707c66cc67SJunchao Zhang 
6717c66cc67SJunchao Zhang    Input Parameters:
6727c66cc67SJunchao Zhang +  comm - A communicator, so that the error can be collective
6737c66cc67SJunchao Zhang -  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
6747c66cc67SJunchao Zhang 
675bf4d2887SBarry Smith    Level: advanced
6767c66cc67SJunchao Zhang 
677bf4d2887SBarry Smith    Notes:
678bf4d2887SBarry Smith    If the option -start_in_debugger was used then this calls abort() to stop the program in the debugger.
679bf4d2887SBarry Smith 
68087497f52SBarry Smith    if `PetscCIEnabledPortableErrorOutput` is set it strives to exit cleanly without call `MPI_Abort()`
681660278c0SBarry Smith 
6827c66cc67SJunchao Zhang  M*/
6839371c9d4SSatish Balay #define PETSCABORT(comm, ...) \
6849371c9d4SSatish Balay   do { \
685baae8e41SSatish Balay     if (petscwaitonerrorflg) PetscSleep(1000); \
686bf4d2887SBarry Smith     if (petscindebugger) abort(); \
6873fcd9f07SJacob Faibussowitsch     else { \
6883fcd9f07SJacob Faibussowitsch       PetscErrorCode ierr_petsc_abort_ = __VA_ARGS__; \
689660278c0SBarry Smith       PetscMPIInt    size; \
690660278c0SBarry Smith       MPI_Comm_size(comm, &size); \
691660278c0SBarry Smith       if (PetscCIEnabledPortableErrorOutput && size == PetscGlobalSize && ierr_petsc_abort_ != PETSC_ERR_SIG) { \
6929371c9d4SSatish Balay         MPI_Finalize(); \
6939371c9d4SSatish Balay         exit(0); \
694660278c0SBarry Smith       } else if (PetscCIEnabledPortableErrorOutput && PetscGlobalSize == 1) { \
695660278c0SBarry Smith         exit(0); \
696660278c0SBarry Smith       } else { \
697660278c0SBarry Smith         MPI_Abort(comm, (PetscMPIInt)ierr_petsc_abort_); \
698660278c0SBarry Smith       } \
6993fcd9f07SJacob Faibussowitsch     } \
7007c66cc67SJunchao Zhang   } while (0)
701986eef2eSBarry Smith 
7029566063dSJacob Faibussowitsch #ifdef PETSC_CLANGUAGE_CXX
703986eef2eSBarry Smith /*MC
7049566063dSJacob Faibussowitsch   PetscCallThrow - Checks error code, if non-zero it calls the C++ error handler which throws
7059566063dSJacob Faibussowitsch   an exception
706986eef2eSBarry Smith 
707986eef2eSBarry Smith   Synopsis:
7089566063dSJacob Faibussowitsch   #include <petscerror.h>
7099566063dSJacob Faibussowitsch   void PetscCallThrow(PetscErrorCode ierr)
710986eef2eSBarry Smith 
711986eef2eSBarry Smith   Not Collective
712986eef2eSBarry Smith 
7139566063dSJacob Faibussowitsch   Input Parameter:
714986eef2eSBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
715986eef2eSBarry Smith 
716986eef2eSBarry Smith   Notes:
7179566063dSJacob Faibussowitsch   Requires PETSc to be configured with clanguage = c++. Throws a std::runtime_error() on error.
718986eef2eSBarry Smith 
71987497f52SBarry Smith   Once the error handler throws the exception you can use `PetscCallVoid()` which returns without
72087497f52SBarry Smith   an error code (bad idea since the error is ignored) or `PetscCallAbort()` to have `MPI_Abort()`
7219566063dSJacob Faibussowitsch   called immediately.
7229566063dSJacob Faibussowitsch 
7239566063dSJacob Faibussowitsch   Level: beginner
7249566063dSJacob Faibussowitsch 
725db781477SPatrick Sanan .seealso: `SETERRQ()`, `PetscCall()`, `SETERRABORT()`, `PetscCallAbort()`, `PetscTraceBackErrorHandler()`,
726db781477SPatrick Sanan           `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
727986eef2eSBarry Smith M*/
7289371c9d4SSatish Balay #define PetscCallThrow(...) \
7299371c9d4SSatish Balay   do { \
7309566063dSJacob Faibussowitsch     PetscErrorCode ierr_cxx_ = __VA_ARGS__; \
7319566063dSJacob Faibussowitsch     if (PetscUnlikely(ierr_cxx_)) PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_cxx_, PETSC_ERROR_IN_CXX, PETSC_NULLPTR); \
732ffc4695bSBarry Smith   } while (0)
73385614651SBarry Smith 
734cc26af49SMatthew Knepley /*MC
735cc26af49SMatthew Knepley   CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception
736cc26af49SMatthew Knepley 
737cc26af49SMatthew Knepley   Synopsis:
7389566063dSJacob Faibussowitsch   #include <petscerror.h>
7393af045c5SBarry Smith   void CHKERRXX(PetscErrorCode ierr)
740cc26af49SMatthew Knepley 
741eca87e8dSBarry Smith   Not Collective
742cc26af49SMatthew Knepley 
7439566063dSJacob Faibussowitsch   Input Parameter:
7443af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
745cc26af49SMatthew Knepley 
746cc26af49SMatthew Knepley   Notes:
74787497f52SBarry Smith   Deprecated in favor of `PetscCallThrow()`. This routine behaves identically to it.
748cc26af49SMatthew Knepley 
7499566063dSJacob Faibussowitsch   Level: deprecated
750cc26af49SMatthew Knepley 
751db781477SPatrick Sanan .seealso: `PetscCallThrow()`
752cc26af49SMatthew Knepley M*/
7539566063dSJacob Faibussowitsch #define CHKERRXX(...) PetscCallThrow(__VA_ARGS__)
754fd705b32SMatthew Knepley #endif
755fd705b32SMatthew Knepley 
7563f520e80SJunchao Zhang /*MC
7579566063dSJacob Faibussowitsch   PetscCallCXX - Checks C++ function calls and if they throw an exception, catch it and then
7589566063dSJacob Faibussowitsch   return a PETSc error code
7593f520e80SJunchao Zhang 
7603f520e80SJunchao Zhang   Synopsis:
7619566063dSJacob Faibussowitsch   #include <petscerror.h>
7629566063dSJacob Faibussowitsch   void PetscCallCXX(expr) noexcept;
7633f520e80SJunchao Zhang 
7643f520e80SJunchao Zhang   Not Collective
7653f520e80SJunchao Zhang 
7669566063dSJacob Faibussowitsch   Input Parameter:
7679566063dSJacob Faibussowitsch . expr - An arbitrary expression
7683f520e80SJunchao Zhang 
7693f520e80SJunchao Zhang   Notes:
7709566063dSJacob Faibussowitsch   PetscCallCXX(expr) is a macro replacement for
7719566063dSJacob Faibussowitsch .vb
7729566063dSJacob Faibussowitsch   try {
7739566063dSJacob Faibussowitsch     expr;
7749566063dSJacob Faibussowitsch   } catch (const std::exception& e) {
7759566063dSJacob Faibussowitsch     return ConvertToPetscErrorCode(e);
7769566063dSJacob Faibussowitsch   }
7779566063dSJacob Faibussowitsch .ve
7789566063dSJacob Faibussowitsch   Due to the fact that it catches any (reasonable) exception, it is essentially noexcept.
7793f520e80SJunchao Zhang 
7809566063dSJacob Faibussowitsch   Example Usage:
7819566063dSJacob Faibussowitsch .vb
7829566063dSJacob Faibussowitsch   void foo(void) { throw std::runtime_error("error"); }
7833f520e80SJunchao Zhang 
7849566063dSJacob Faibussowitsch   void bar()
7859566063dSJacob Faibussowitsch   {
786e8952933SJacob Faibussowitsch     PetscCallCXX(foo()); // ERROR bar() does not return PetscErrorCode
7879566063dSJacob Faibussowitsch   }
7889566063dSJacob Faibussowitsch 
7899566063dSJacob Faibussowitsch   PetscErrorCode baz()
7909566063dSJacob Faibussowitsch   {
7919566063dSJacob Faibussowitsch     PetscCallCXX(foo()); // OK
7929566063dSJacob Faibussowitsch 
7939566063dSJacob Faibussowitsch     PetscCallCXX(
7949566063dSJacob Faibussowitsch       bar();
795e8952933SJacob Faibussowitsch       foo(); // OK mutliple statements allowed
7969566063dSJacob Faibussowitsch     );
7979566063dSJacob Faibussowitsch   }
7989566063dSJacob Faibussowitsch 
7999566063dSJacob Faibussowitsch   struct bop
8009566063dSJacob Faibussowitsch   {
8019566063dSJacob Faibussowitsch     bop()
8029566063dSJacob Faibussowitsch     {
803e8952933SJacob Faibussowitsch       PetscCallCXX(foo()); // ERROR returns PetscErrorCode, cannot be used in constructors
8049566063dSJacob Faibussowitsch     }
8059566063dSJacob Faibussowitsch   };
8069566063dSJacob Faibussowitsch 
807e8952933SJacob Faibussowitsch   // ERROR contains do-while, cannot be used as function-try block
8089566063dSJacob Faibussowitsch   PetscErrorCode qux() PetscCallCXX(
8099566063dSJacob Faibussowitsch     bar();
8109566063dSJacob Faibussowitsch     baz();
8119566063dSJacob Faibussowitsch     foo();
8129566063dSJacob Faibussowitsch     return 0;
8139566063dSJacob Faibussowitsch   )
8149566063dSJacob Faibussowitsch .ve
8159566063dSJacob Faibussowitsch 
81649762cbcSSatish Balay   Level: beginner
81749762cbcSSatish Balay 
818db781477SPatrick Sanan .seealso: `PetscCallThrow()`, `SETERRQ()`, `PetscCall()`, `SETERRABORT()`, `PetscCallAbort()`,
819db781477SPatrick Sanan           `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `CHKMEMQ`
8203f520e80SJunchao Zhang M*/
8219371c9d4SSatish Balay #define PetscCallCXX(...) \
8229371c9d4SSatish Balay   do { \
82337154d10SBarry Smith     PetscStackUpdateLine; \
8243fcd9f07SJacob Faibussowitsch     try { \
8253fcd9f07SJacob Faibussowitsch       __VA_ARGS__; \
8269371c9d4SSatish Balay     } catch (const std::exception &e) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "%s", e.what()); } \
8273fcd9f07SJacob Faibussowitsch   } while (0)
8283f520e80SJunchao Zhang 
82930de9b25SBarry Smith /*MC
8309566063dSJacob Faibussowitsch   CHKERRCXX - Checks C++ function calls and if they throw an exception, catch it and then
8319566063dSJacob Faibussowitsch   return a PETSc error code
8329566063dSJacob Faibussowitsch 
8339566063dSJacob Faibussowitsch   Synopsis:
8349566063dSJacob Faibussowitsch   #include <petscerror.h>
8359566063dSJacob Faibussowitsch   void CHKERRCXX(func) noexcept;
8369566063dSJacob Faibussowitsch 
8379566063dSJacob Faibussowitsch   Not Collective
8389566063dSJacob Faibussowitsch 
8399566063dSJacob Faibussowitsch   Input Parameter:
8409566063dSJacob Faibussowitsch . func - C++ function calls
8419566063dSJacob Faibussowitsch 
8429566063dSJacob Faibussowitsch   Notes:
84387497f52SBarry Smith   Deprecated in favor of `PetscCallCXX()`. This routine behaves identically to it.
8449566063dSJacob Faibussowitsch 
8459566063dSJacob Faibussowitsch   Level: deprecated
8469566063dSJacob Faibussowitsch 
847db781477SPatrick Sanan .seealso: `PetscCallCXX()`
8489566063dSJacob Faibussowitsch M*/
8499566063dSJacob Faibussowitsch #define CHKERRCXX(...) PetscCallCXX(__VA_ARGS__)
8509566063dSJacob Faibussowitsch 
8519566063dSJacob Faibussowitsch /*MC
85230de9b25SBarry Smith    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
85330de9b25SBarry Smith 
85430de9b25SBarry Smith    Synopsis:
855aaa7dc30SBarry Smith    #include <petscsys.h>
85691d3bdf4SKris Buschelman    CHKMEMQ;
85730de9b25SBarry Smith 
858eca87e8dSBarry Smith    Not Collective
859eca87e8dSBarry Smith 
86030de9b25SBarry Smith   Level: beginner
86130de9b25SBarry Smith 
86230de9b25SBarry Smith    Notes:
863a17b96a8SKyle Gerard Felker     We highly recommend using Valgrind https://petsc.org/release/faq/#valgrind or for NVIDIA CUDA systems
8645ed36255SBarry Smith     https://docs.nvidia.com/cuda/cuda-memcheck/index.html for finding memory problems. The ``CHKMEMQ`` macro is useful on systems that
8655ed36255SBarry Smith     do not have valgrind, but is not as good as valgrind or cuda-memcheck.
8661957e957SBarry Smith 
86787497f52SBarry Smith     Must run with the option -malloc_debug (-malloc_test in debug mode; or if `PetscMallocSetDebug()` called) to enable this option
86830de9b25SBarry Smith 
86930de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
87030de9b25SBarry Smith 
87130de9b25SBarry Smith     By defaults prints location where memory that is corrupted was allocated.
87230de9b25SBarry Smith 
87387497f52SBarry Smith     Use `CHKMEMA` for functions that return void
874f621e05eSBarry Smith 
875db781477SPatrick Sanan .seealso: `PetscTraceBackErrorHandler()`, `PetscPushErrorHandler()`, `PetscError()`, `SETERRQ()`, `PetscMallocValidate()`
87630de9b25SBarry Smith M*/
8776d210af2SJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
878064a246eSJacob Faibussowitsch #define CHKMEMQ
879064a246eSJacob Faibussowitsch #define CHKMEMA
8806d210af2SJacob Faibussowitsch #else
8819371c9d4SSatish Balay #define CHKMEMQ \
8829371c9d4SSatish Balay   do { \
88386d09637SLisandro Dalcin     PetscErrorCode ierr_memq_ = PetscMallocValidate(__LINE__, PETSC_FUNCTION_NAME, __FILE__); \
88486d09637SLisandro Dalcin     if (PetscUnlikely(ierr_memq_)) return PetscError(PETSC_COMM_SELF, __LINE__, PETSC_FUNCTION_NAME, __FILE__, ierr_memq_, PETSC_ERROR_REPEAT, " "); \
88586d09637SLisandro Dalcin   } while (0)
8866d210af2SJacob Faibussowitsch #define CHKMEMA PetscMallocValidate(__LINE__, PETSC_FUNCTION_NAME, __FILE__)
887064a246eSJacob Faibussowitsch #endif
8889566063dSJacob Faibussowitsch 
889668f157eSBarry Smith /*E
890668f157eSBarry Smith   PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers
891668f157eSBarry Smith 
892668f157eSBarry Smith   Level: advanced
893668f157eSBarry Smith 
89487497f52SBarry Smith   `PETSC_ERROR_IN_CXX` indicates the error was detected in C++ and an exception should be generated
895d736bfebSBarry Smith 
89695452b02SPatrick Sanan   Developer Notes:
89795452b02SPatrick Sanan     This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandler()
898668f157eSBarry Smith 
89987497f52SBarry Smith .seealso: `PetscError()`, `SETERRQ()`
900668f157eSBarry Smith E*/
9019371c9d4SSatish Balay typedef enum {
9029371c9d4SSatish Balay   PETSC_ERROR_INITIAL = 0,
9039371c9d4SSatish Balay   PETSC_ERROR_REPEAT  = 1,
9049371c9d4SSatish Balay   PETSC_ERROR_IN_CXX  = 2
9059371c9d4SSatish Balay } PetscErrorType;
9064b209cf6SBarry Smith 
907eb9e708aSLisandro Dalcin #if defined(__clang_analyzer__)
908eb9e708aSLisandro Dalcin __attribute__((analyzer_noreturn))
909eb9e708aSLisandro Dalcin #endif
9109371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode
9119371c9d4SSatish Balay PetscError(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, ...) PETSC_ATTRIBUTE_COLD PETSC_ATTRIBUTE_FORMAT(7, 8);
912eb9e708aSLisandro Dalcin 
913014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void);
914014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorMessage(int, const char *[], char **);
915d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
916d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
917d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
918d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
919d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
920d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
921d8e4614bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *) PETSC_ATTRIBUTE_COLD;
922efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *), void *);
923014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void);
9248d359177SBarry Smith PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int, void *);
925014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int, void *), void *);
926014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void);
92728559dc8SJed Brown PETSC_EXTERN PetscErrorCode PetscCheckPointerSetIntensity(PetscInt);
928c2a741eeSJunchao Zhang PETSC_EXTERN void           PetscSignalSegvCheckPointerOrMpi(void);
9299371c9d4SSatish Balay PETSC_DEPRECATED_FUNCTION("Use PetscSignalSegvCheckPointerOrMpi() (since version 3.13)") static inline void PetscSignalSegvCheckPointer(void) {
9309371c9d4SSatish Balay   PetscSignalSegvCheckPointerOrMpi();
9319371c9d4SSatish Balay }
932329f5518SBarry Smith 
933639ff905SBarry Smith /*MC
934639ff905SBarry Smith     PetscErrorPrintf - Prints error messages.
935639ff905SBarry Smith 
936639ff905SBarry Smith    Synopsis:
937aaa7dc30SBarry Smith     #include <petscsys.h>
938639ff905SBarry Smith      PetscErrorCode (*PetscErrorPrintf)(const char format[],...);
939639ff905SBarry Smith 
940639ff905SBarry Smith     Not Collective
941639ff905SBarry Smith 
942f899ff85SJose E. Roman     Input Parameter:
943639ff905SBarry Smith .   format - the usual printf() format string
944639ff905SBarry Smith 
945639ff905SBarry Smith    Options Database Keys:
9461957e957SBarry Smith +    -error_output_stdout - cause error messages to be printed to stdout instead of the (default) stderr
947e1bc860dSBarry Smith -    -error_output_none - to turn off all printing of error messages (does not change the way the error is handled.)
948639ff905SBarry Smith 
94995452b02SPatrick Sanan    Notes:
95095452b02SPatrick Sanan     Use
951639ff905SBarry Smith $     PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the
952639ff905SBarry Smith $                        error is handled.) and
9531957e957SBarry Smith $     PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on or you can use your own function
954639ff905SBarry Smith 
955639ff905SBarry Smith           Use
95687497f52SBarry Smith      `PETSC_STDERR` = FILE* obtained from a file open etc. to have stderr printed to the file.
95787497f52SBarry Smith      `PETSC_STDOUT` = FILE* obtained from a file open etc. to have stdout printed to the file.
958639ff905SBarry Smith 
959639ff905SBarry Smith           Use
96087497f52SBarry Smith       `PetscPushErrorHandler()` to provide your own error handler that determines what kind of messages to print
961639ff905SBarry Smith 
962639ff905SBarry Smith    Level: developer
963639ff905SBarry Smith 
964639ff905SBarry Smith     Fortran Note:
965639ff905SBarry Smith     This routine is not supported in Fortran.
966639ff905SBarry Smith 
967db781477SPatrick Sanan .seealso: `PetscFPrintf()`, `PetscSynchronizedPrintf()`, `PetscHelpPrintf()`, `PetscPrintf()`, `PetscPushErrorHandler()`, `PetscVFPrintf()`, `PetscHelpPrintf()`
968639ff905SBarry Smith M*/
9693ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[], ...) PETSC_ATTRIBUTE_FORMAT(1, 2);
970639ff905SBarry Smith 
971cf0818bdSBarry Smith /*E
972cf0818bdSBarry Smith      PetscFPTrap - types of floating point exceptions that may be trapped
973cf0818bdSBarry Smith 
97487497f52SBarry Smith      Currently only `PETSC_FP_TRAP_OFF` and `PETSC_FP_TRAP_ON` are handled. All others are treated as `PETSC_FP_TRAP_ON`.
975cf0818bdSBarry Smith 
976cf0818bdSBarry Smith      Level: intermediate
977cf0818bdSBarry Smith 
978cf0818bdSBarry Smith .seealso: `PetscSetFPTrap()`, `PetscPushFPTrap()`
979cf0818bdSBarry Smith  E*/
9809371c9d4SSatish Balay typedef enum {
9819371c9d4SSatish Balay   PETSC_FP_TRAP_OFF      = 0,
9829371c9d4SSatish Balay   PETSC_FP_TRAP_INDIV    = 1,
9839371c9d4SSatish Balay   PETSC_FP_TRAP_FLTOPERR = 2,
9849371c9d4SSatish Balay   PETSC_FP_TRAP_FLTOVF   = 4,
9859371c9d4SSatish Balay   PETSC_FP_TRAP_FLTUND   = 8,
9869371c9d4SSatish Balay   PETSC_FP_TRAP_FLTDIV   = 16,
9879371c9d4SSatish Balay   PETSC_FP_TRAP_FLTINEX  = 32
9889371c9d4SSatish Balay } PetscFPTrap;
989*bd2b07b1SBarry Smith #define PETSC_FP_TRAP_ON (PetscFPTrap)(PETSC_FP_TRAP_INDIV | PETSC_FP_TRAP_FLTOPERR | PETSC_FP_TRAP_FLTOVF | PETSC_FP_TRAP_FLTDIV | PETSC_FP_TRAP_FLTINEX)
990014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap);
991014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap);
992014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void);
993aba4c478SBarry Smith PETSC_EXTERN PetscErrorCode PetscDetermineInitialFPTrap(void);
99454a8ef01SBarry Smith 
9953a40ed3dSBarry Smith /*
9963a40ed3dSBarry Smith       Allows the code to build a stack frame as it runs
9973a40ed3dSBarry Smith */
9983a40ed3dSBarry Smith 
99927104ee2SJacob Faibussowitsch #if defined(PETSC_USE_DEBUG)
100099cd645aSJed Brown #define PETSCSTACKSIZE 64
10013a40ed3dSBarry Smith typedef struct {
10020e33f6ddSBarry Smith   const char *function[PETSCSTACKSIZE];
10030e33f6ddSBarry Smith   const char *file[PETSCSTACKSIZE];
1004184914b5SBarry Smith   int         line[PETSCSTACKSIZE];
1005362febeeSStefano Zampini   int         petscroutine[PETSCSTACKSIZE]; /* 0 external called from petsc, 1 petsc functions, 2 petsc user functions */
1006184914b5SBarry Smith   int         currentsize;
1007a2f94806SJed Brown   int         hotdepth;
10084be741a6SBarry Smith   PetscBool   check; /* option to check for correct Push/Pop semantics, true for default petscstack but not other stacks */
10093a40ed3dSBarry Smith } PetscStack;
101027104ee2SJacob Faibussowitsch PETSC_EXTERN PetscStack petscstack;
101127104ee2SJacob Faibussowitsch #else
101227104ee2SJacob Faibussowitsch typedef struct {
101327104ee2SJacob Faibussowitsch   char Silence_empty_struct_has_size_0_in_C_size_1_in_Cpp;
101427104ee2SJacob Faibussowitsch } PetscStack;
101527104ee2SJacob Faibussowitsch #endif
10163a40ed3dSBarry Smith 
10175d12eec7SSatish Balay #if defined(PETSC_SERIALIZE_FUNCTIONS)
10185d12eec7SSatish Balay #include <petsc/private/petscfptimpl.h>
10195d12eec7SSatish Balay /*
10205d12eec7SSatish Balay    Registers the current function into the global function pointer to function name table
10215d12eec7SSatish Balay 
10225d12eec7SSatish Balay    Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc
10235d12eec7SSatish Balay */
10249371c9d4SSatish Balay #define PetscRegister__FUNCT__() \
10259371c9d4SSatish Balay   do { \
10265d12eec7SSatish Balay     static PetscBool __chked = PETSC_FALSE; \
10275d12eec7SSatish Balay     if (!__chked) { \
10289371c9d4SSatish Balay       void *ptr; \
10299371c9d4SSatish Balay       PetscDLSym(NULL, PETSC_FUNCTION_NAME, &ptr); \
10305d12eec7SSatish Balay       __chked = PETSC_TRUE; \
10319371c9d4SSatish Balay     } \
10329371c9d4SSatish Balay   } while (0)
10335d12eec7SSatish Balay #else
10345d12eec7SSatish Balay #define PetscRegister__FUNCT__()
10355d12eec7SSatish Balay #endif
10365d12eec7SSatish Balay 
10376d210af2SJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
10386d210af2SJacob Faibussowitsch #define PetscStackPushNoCheck(funct, petsc_routine, hot)
103937154d10SBarry Smith #define PetscStackUpdateLine
1040792fecdfSBarry Smith #define PetscStackPushExternal(funct)
10416d210af2SJacob Faibussowitsch #define PetscStackPopNoCheck
10426d210af2SJacob Faibussowitsch #define PetscStackClearTop
10436d210af2SJacob Faibussowitsch #define PetscFunctionBegin
10446d210af2SJacob Faibussowitsch #define PetscFunctionBeginUser
10456d210af2SJacob Faibussowitsch #define PetscFunctionBeginHot
10466d210af2SJacob Faibussowitsch #define PetscFunctionReturn(a)    return a
10476d210af2SJacob Faibussowitsch #define PetscFunctionReturnVoid() return
10486d210af2SJacob Faibussowitsch #define PetscStackPop
10496d210af2SJacob Faibussowitsch #define PetscStackPush(f)
10506d210af2SJacob Faibussowitsch #elif defined(PETSC_USE_DEBUG)
1051660278c0SBarry Smith 
10529371c9d4SSatish Balay #define PetscStackPush_Private(stack__, file__, func__, line__, petsc_routine__, hot__) \
10539371c9d4SSatish Balay   do { \
10545a96b57dSJacob Faibussowitsch     if (stack__.currentsize < PETSCSTACKSIZE) { \
10555a96b57dSJacob Faibussowitsch       stack__.function[stack__.currentsize] = func__; \
1056ef1023bdSBarry Smith       if (petsc_routine__) { \
1057ef1023bdSBarry Smith         stack__.file[stack__.currentsize] = file__; \
10585a96b57dSJacob Faibussowitsch         stack__.line[stack__.currentsize] = line__; \
1059ef1023bdSBarry Smith       } else { \
1060648bc8c4SBarry Smith         stack__.file[stack__.currentsize] = PETSC_NULLPTR; \
1061ef1023bdSBarry Smith         stack__.line[stack__.currentsize] = 0; \
1062ef1023bdSBarry Smith       } \
10635a96b57dSJacob Faibussowitsch       stack__.petscroutine[stack__.currentsize] = petsc_routine__; \
10645a96b57dSJacob Faibussowitsch     } \
10655a96b57dSJacob Faibussowitsch     ++stack__.currentsize; \
10665a96b57dSJacob Faibussowitsch     stack__.hotdepth += (hot__ || stack__.hotdepth); \
10675a96b57dSJacob Faibussowitsch   } while (0)
10685a96b57dSJacob Faibussowitsch 
10694be741a6SBarry Smith /* uses PetscCheckAbort() because may be used in a function that does not return an error code */
10709371c9d4SSatish Balay #define PetscStackPop_Private(stack__, func__) \
10719371c9d4SSatish Balay   do { \
10724be741a6SBarry Smith     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__); \
10735a96b57dSJacob Faibussowitsch     if (--stack__.currentsize < PETSCSTACKSIZE) { \
10749371c9d4SSatish Balay       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", \
10759371c9d4SSatish Balay                       stack__.function[stack__.currentsize], stack__.file[stack__.currentsize], stack__.line[stack__.currentsize], func__, __FILE__, __LINE__); \
10765a96b57dSJacob Faibussowitsch       stack__.function[stack__.currentsize]     = PETSC_NULLPTR; \
10775a96b57dSJacob Faibussowitsch       stack__.file[stack__.currentsize]         = PETSC_NULLPTR; \
10785a96b57dSJacob Faibussowitsch       stack__.line[stack__.currentsize]         = 0; \
10795a96b57dSJacob Faibussowitsch       stack__.petscroutine[stack__.currentsize] = 0; \
10805a96b57dSJacob Faibussowitsch     } \
10815a96b57dSJacob Faibussowitsch     stack__.hotdepth = PetscMax(stack__.hotdepth - 1, 0); \
10825a96b57dSJacob Faibussowitsch   } while (0)
10835a96b57dSJacob Faibussowitsch 
1084586f9135SBarry Smith /*MC
1085586f9135SBarry Smith    PetscStackPushNoCheck - Pushes a new function name and line number onto the PETSc default stack that tracks where the running program is
1086586f9135SBarry Smith    currently in the source code.
1087586f9135SBarry Smith 
1088586f9135SBarry Smith    Not Collective
1089586f9135SBarry Smith 
1090586f9135SBarry Smith    Synopsis:
1091586f9135SBarry Smith    #include <petscsys.h>
1092586f9135SBarry Smith    void PetscStackPushNoCheck(char *funct,int petsc_routine,PetscBool hot);
1093586f9135SBarry Smith 
1094586f9135SBarry Smith    Input Parameters:
1095586f9135SBarry Smith +  funct - the function name
1096586f9135SBarry Smith .  petsc_routine - 2 user function, 1 PETSc function, 0 some other function
1097586f9135SBarry Smith -  hot - indicates that the function may be called often so expensive error checking should be turned off inside the function
1098586f9135SBarry Smith 
1099586f9135SBarry Smith    Level: developer
1100586f9135SBarry Smith 
1101586f9135SBarry Smith    Notes:
1102586f9135SBarry Smith    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
110387497f52SBarry Smith    occurred, for example, when a signal is received without running in the debugger. It is recommended to use the debugger if extensive information is needed to
1104586f9135SBarry Smith    help debug the problem.
1105586f9135SBarry Smith 
1106ef1023bdSBarry Smith    This version does not check the memory corruption (an expensive operation), use `PetscStackPush()` to check the memory.
1107ef1023bdSBarry Smith 
1108792fecdfSBarry Smith    Use `PetscStackPushExternal()` for a function call that is about to be made to a non-PETSc or user function (such as BLAS etc).
1109ef1023bdSBarry Smith 
1110586f9135SBarry Smith    The default stack is a global variable called `petscstack`.
1111586f9135SBarry Smith 
1112586f9135SBarry Smith .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1113ef1023bdSBarry Smith           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPush()`, `PetscStackPop`,
1114792fecdfSBarry Smith           `PetscStackPushExternal()`
1115586f9135SBarry Smith M*/
11169371c9d4SSatish Balay #define PetscStackPushNoCheck(funct, petsc_routine, hot) \
11179371c9d4SSatish Balay   do { \
1118e04113cfSBarry Smith     PetscStackSAWsTakeAccess(); \
11195a96b57dSJacob Faibussowitsch     PetscStackPush_Private(petscstack, __FILE__, funct, __LINE__, petsc_routine, hot); \
1120e04113cfSBarry Smith     PetscStackSAWsGrantAccess(); \
1121441dd030SJed Brown   } while (0)
1122441dd030SJed Brown 
1123586f9135SBarry Smith /*MC
112487497f52SBarry Smith    PetscStackUpdateLine - in a function that has a `PetscFunctionBegin` or `PetscFunctionBeginUser` updates the stack line number to the
112537154d10SBarry Smith    current line number.
112637154d10SBarry Smith 
112737154d10SBarry Smith    Not Collective
112837154d10SBarry Smith 
112937154d10SBarry Smith    Synopsis:
113037154d10SBarry Smith    #include <petscsys.h>
113137154d10SBarry Smith    void PetscStackUpdateLine
113237154d10SBarry Smith 
113337154d10SBarry Smith    Level: developer
113437154d10SBarry Smith 
113537154d10SBarry Smith    Notes:
113687497f52SBarry Smith    Using `PetscCall()` and friends automatically handles this process
113787497f52SBarry Smith 
113837154d10SBarry Smith    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
113937154d10SBarry Smith    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
114037154d10SBarry Smith    help debug the problem.
114137154d10SBarry Smith 
114237154d10SBarry Smith    The default stack is a global variable called petscstack.
114337154d10SBarry Smith 
114437154d10SBarry Smith    This is used by `PetscCall()` and is otherwise not like to be needed
114537154d10SBarry Smith 
114637154d10SBarry Smith .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPop`, `PetscCall()`
114737154d10SBarry Smith M*/
114837154d10SBarry Smith #define PetscStackUpdateLine \
11499371c9d4SSatish Balay   if (petscstack.currentsize > 0 && petscstack.function[petscstack.currentsize - 1] == PETSC_FUNCTION_NAME) { petscstack.line[petscstack.currentsize - 1] = __LINE__; }
115037154d10SBarry Smith 
115137154d10SBarry Smith /*MC
1152792fecdfSBarry Smith    PetscStackPushExternal - Pushes a new function name onto the PETSc default stack that tracks where the running program is
1153ef1023bdSBarry Smith    currently in the source code. Does not include the filename or line number since this is called by the calling routine
1154ef1023bdSBarry Smith    for non-PETSc or user functions.
1155ef1023bdSBarry Smith 
1156ef1023bdSBarry Smith    Not Collective
1157ef1023bdSBarry Smith 
1158ef1023bdSBarry Smith    Synopsis:
1159ef1023bdSBarry Smith    #include <petscsys.h>
1160792fecdfSBarry Smith    void PetscStackPushExternal(char *funct);
1161ef1023bdSBarry Smith 
1162ef1023bdSBarry Smith    Input Parameters:
1163ef1023bdSBarry Smith .  funct - the function name
1164ef1023bdSBarry Smith 
1165ef1023bdSBarry Smith    Level: developer
1166ef1023bdSBarry Smith 
1167ef1023bdSBarry Smith    Notes:
116887497f52SBarry Smith    Using `PetscCallExternal()` and friends automatically handles this process
116987497f52SBarry Smith 
1170ef1023bdSBarry Smith    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
1171ef1023bdSBarry Smith    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1172ef1023bdSBarry Smith    help debug the problem.
1173ef1023bdSBarry Smith 
1174ef1023bdSBarry Smith    The default stack is a global variable called `petscstack`.
1175ef1023bdSBarry Smith 
1176ef1023bdSBarry Smith    This is to be used when calling an external package function such as a BLAS function.
1177ef1023bdSBarry Smith 
1178ef1023bdSBarry Smith    This also updates the stack line number for the current stack function.
1179ef1023bdSBarry Smith 
1180ef1023bdSBarry Smith .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1181ef1023bdSBarry Smith           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1182ef1023bdSBarry Smith M*/
11839371c9d4SSatish Balay #define PetscStackPushExternal(funct) \
11849371c9d4SSatish Balay   do { \
11859371c9d4SSatish Balay     PetscStackUpdateLine; \
11869371c9d4SSatish Balay     PetscStackPushNoCheck(funct, 0, PETSC_TRUE); \
11879371c9d4SSatish Balay   } while (0);
1188ef1023bdSBarry Smith 
1189ef1023bdSBarry Smith /*MC
1190586f9135SBarry Smith    PetscStackPopNoCheck - Pops a function name from the PETSc default stack that tracks where the running program is
1191586f9135SBarry Smith    currently in the source code.
1192586f9135SBarry Smith 
1193586f9135SBarry Smith    Not Collective
1194586f9135SBarry Smith 
1195586f9135SBarry Smith    Synopsis:
1196586f9135SBarry Smith    #include <petscsys.h>
1197586f9135SBarry Smith    void PetscStackPopNoCheck(char *funct);
1198586f9135SBarry Smith 
1199586f9135SBarry Smith    Input Parameter:
1200586f9135SBarry Smith .   funct - the function name
1201586f9135SBarry Smith 
1202586f9135SBarry Smith    Level: developer
1203586f9135SBarry Smith 
1204586f9135SBarry Smith    Notes:
120587497f52SBarry Smith    Using `PetscCall()`, `PetscCallExternal()`, `PetscCallBack()` and friends negates the need to call this
120687497f52SBarry Smith 
1207586f9135SBarry Smith    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
1208586f9135SBarry Smith    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1209586f9135SBarry Smith    help debug the problem.
1210586f9135SBarry Smith 
1211586f9135SBarry Smith    The default stack is a global variable called petscstack.
1212586f9135SBarry Smith 
1213586f9135SBarry Smith    Developer Note:
1214586f9135SBarry Smith    `PetscStackPopNoCheck()` takes a function argument while  `PetscStackPop` does not, this difference is likely just historical.
1215586f9135SBarry Smith 
1216586f9135SBarry Smith .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1217586f9135SBarry Smith M*/
12189371c9d4SSatish Balay #define PetscStackPopNoCheck(funct) \
12199371c9d4SSatish Balay   do { \
1220362febeeSStefano Zampini     PetscStackSAWsTakeAccess(); \
12215a96b57dSJacob Faibussowitsch     PetscStackPop_Private(petscstack, funct); \
1222362febeeSStefano Zampini     PetscStackSAWsGrantAccess(); \
1223362febeeSStefano Zampini   } while (0)
1224362febeeSStefano Zampini 
12259371c9d4SSatish Balay #define PetscStackClearTop \
12269371c9d4SSatish Balay   do { \
1227e04113cfSBarry Smith     PetscStackSAWsTakeAccess(); \
12289371c9d4SSatish Balay     if (petscstack.currentsize > 0 && --petscstack.currentsize < PETSCSTACKSIZE) { \
122927104ee2SJacob Faibussowitsch       petscstack.function[petscstack.currentsize]     = PETSC_NULLPTR; \
123027104ee2SJacob Faibussowitsch       petscstack.file[petscstack.currentsize]         = PETSC_NULLPTR; \
123127104ee2SJacob Faibussowitsch       petscstack.line[petscstack.currentsize]         = 0; \
123227104ee2SJacob Faibussowitsch       petscstack.petscroutine[petscstack.currentsize] = 0; \
1233441dd030SJed Brown     } \
123427104ee2SJacob Faibussowitsch     petscstack.hotdepth = PetscMax(petscstack.hotdepth - 1, 0); \
1235e04113cfSBarry Smith     PetscStackSAWsGrantAccess(); \
1236441dd030SJed Brown   } while (0)
1237441dd030SJed Brown 
123830de9b25SBarry Smith /*MC
12391957e957SBarry Smith    PetscFunctionBegin - First executable line of each PETSc function,  used for error handling. Final
124087497f52SBarry Smith       line of PETSc functions should be `PetscFunctionReturn`(0);
124130de9b25SBarry Smith 
124230de9b25SBarry Smith    Synopsis:
1243aaa7dc30SBarry Smith    #include <petscsys.h>
124430de9b25SBarry Smith    void PetscFunctionBegin;
124530de9b25SBarry Smith 
1246eca87e8dSBarry Smith    Not Collective
1247eca87e8dSBarry Smith 
124830de9b25SBarry Smith    Usage:
124930de9b25SBarry Smith .vb
125030de9b25SBarry Smith      int something;
125130de9b25SBarry Smith 
125230de9b25SBarry Smith      PetscFunctionBegin;
125330de9b25SBarry Smith .ve
125430de9b25SBarry Smith 
125530de9b25SBarry Smith    Notes:
125687497f52SBarry Smith      Use `PetscFunctionBeginUser` for application codes.
12571957e957SBarry Smith 
125830de9b25SBarry Smith      Not available in Fortran
125930de9b25SBarry Smith 
126030de9b25SBarry Smith    Level: developer
126130de9b25SBarry Smith 
1262586f9135SBarry Smith .seealso: `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`
126330de9b25SBarry Smith 
126430de9b25SBarry Smith M*/
12659371c9d4SSatish Balay #define PetscFunctionBegin \
12669371c9d4SSatish Balay   do { \
1267362febeeSStefano Zampini     PetscStackPushNoCheck(PETSC_FUNCTION_NAME, 1, PETSC_FALSE); \
1268a2f94806SJed Brown     PetscRegister__FUNCT__(); \
1269a2f94806SJed Brown   } while (0)
1270a2f94806SJed Brown 
1271a2f94806SJed Brown /*MC
127287497f52SBarry Smith    PetscFunctionBeginHot - Substitute for `PetscFunctionBegin` to be used in functions that are called in
1273a2f94806SJed Brown    performance-critical circumstances.  Use of this function allows for lighter profiling by default.
1274a2f94806SJed Brown 
1275a2f94806SJed Brown    Synopsis:
1276aaa7dc30SBarry Smith    #include <petscsys.h>
1277a2f94806SJed Brown    void PetscFunctionBeginHot;
1278a2f94806SJed Brown 
1279a2f94806SJed Brown    Not Collective
1280a2f94806SJed Brown 
1281a2f94806SJed Brown    Usage:
1282a2f94806SJed Brown .vb
1283a2f94806SJed Brown      int something;
1284a2f94806SJed Brown 
1285a2f94806SJed Brown      PetscFunctionBeginHot;
1286a2f94806SJed Brown .ve
1287a2f94806SJed Brown 
1288a2f94806SJed Brown    Notes:
1289a2f94806SJed Brown      Not available in Fortran
1290a2f94806SJed Brown 
1291a2f94806SJed Brown    Level: developer
1292a2f94806SJed Brown 
1293586f9135SBarry Smith .seealso: `PetscFunctionBegin`, `PetscFunctionReturn()`, `PetscStackPushNoCheck()`
1294a2f94806SJed Brown 
1295a2f94806SJed Brown M*/
12969371c9d4SSatish Balay #define PetscFunctionBeginHot \
12979371c9d4SSatish Balay   do { \
1298362febeeSStefano Zampini     PetscStackPushNoCheck(PETSC_FUNCTION_NAME, 1, PETSC_TRUE); \
12992d53ad75SBarry Smith     PetscRegister__FUNCT__(); \
130053c77d0aSJed Brown   } while (0)
130153c77d0aSJed Brown 
1302a8d2bbe5SBarry Smith /*MC
1303530d85c1SBarry Smith    PetscFunctionBeginUser - First executable line of user provided routines
1304a8d2bbe5SBarry Smith 
1305a8d2bbe5SBarry Smith    Synopsis:
1306aaa7dc30SBarry Smith    #include <petscsys.h>
1307a8d2bbe5SBarry Smith    void PetscFunctionBeginUser;
1308a8d2bbe5SBarry Smith 
1309a8d2bbe5SBarry Smith    Not Collective
1310a8d2bbe5SBarry Smith 
1311a8d2bbe5SBarry Smith    Usage:
1312a8d2bbe5SBarry Smith .vb
1313a8d2bbe5SBarry Smith      int something;
1314a8d2bbe5SBarry Smith 
1315ac285190SBarry Smith      PetscFunctionBeginUser;
1316a8d2bbe5SBarry Smith .ve
1317a8d2bbe5SBarry Smith 
1318a8d2bbe5SBarry Smith    Notes:
1319530d85c1SBarry Smith       Functions that incorporate this must call `PetscFunctionReturn()` instead of return except for main().
1320530d85c1SBarry Smith 
1321530d85c1SBarry Smith       May be used before `PetscInitialize()`
13221957e957SBarry Smith 
1323a8d2bbe5SBarry Smith       Not available in Fortran
1324a8d2bbe5SBarry Smith 
1325530d85c1SBarry Smith       This is identical to `PetscFunctionBegin` except it labels the routine as a user
1326ac285190SBarry Smith       routine instead of as a PETSc library routine.
1327ac285190SBarry Smith 
1328a2f94806SJed Brown    Level: intermediate
1329a8d2bbe5SBarry Smith 
1330586f9135SBarry Smith .seealso: `PetscFunctionReturn()`, `PetscFunctionBegin`, `PetscFunctionBeginHot`, `PetscStackPushNoCheck()`
1331a8d2bbe5SBarry Smith 
1332a8d2bbe5SBarry Smith M*/
13339371c9d4SSatish Balay #define PetscFunctionBeginUser \
13349371c9d4SSatish Balay   do { \
1335362febeeSStefano Zampini     PetscStackPushNoCheck(PETSC_FUNCTION_NAME, 2, PETSC_FALSE); \
1336a8d2bbe5SBarry Smith     PetscRegister__FUNCT__(); \
1337a8d2bbe5SBarry Smith   } while (0)
1338a8d2bbe5SBarry Smith 
1339586f9135SBarry Smith /*MC
1340586f9135SBarry Smith    PetscStackPush - Pushes a new function name and line number onto the PETSc default stack that tracks where the running program is
1341586f9135SBarry Smith    currently in the source code and verifies the memory is not corrupted.
1342586f9135SBarry Smith 
1343586f9135SBarry Smith    Not Collective
1344586f9135SBarry Smith 
1345586f9135SBarry Smith    Synopsis:
1346586f9135SBarry Smith    #include <petscsys.h>
1347586f9135SBarry Smith    void PetscStackPush(char *funct)
1348586f9135SBarry Smith 
1349586f9135SBarry Smith    Input Parameter:
1350586f9135SBarry Smith .  funct - the function name
1351586f9135SBarry Smith 
1352586f9135SBarry Smith    Level: developer
1353586f9135SBarry Smith 
1354586f9135SBarry Smith    Notes:
1355586f9135SBarry Smith    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
1356586f9135SBarry Smith    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1357586f9135SBarry Smith    help debug the problem.
1358586f9135SBarry Smith 
1359586f9135SBarry Smith    The default stack is a global variable called petscstack.
1360586f9135SBarry Smith 
1361586f9135SBarry Smith .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPopNoCheck()`, `PetscCall()`, `PetscFunctionBegin()`,
1362586f9135SBarry Smith           `PetscFunctionReturn()`, `PetscFunctionBeginHot()`, `PetscFunctionBeginUser()`, `PetscStackPushNoCheck()`, `PetscStackPop`
1363586f9135SBarry Smith M*/
13649371c9d4SSatish Balay #define PetscStackPush(n) \
13659371c9d4SSatish Balay   do { \
1366362febeeSStefano Zampini     PetscStackPushNoCheck(n, 0, PETSC_FALSE); \
136715681b3cSBarry Smith     CHKMEMQ; \
136815681b3cSBarry Smith   } while (0)
13693a40ed3dSBarry Smith 
1370586f9135SBarry Smith /*MC
1371586f9135SBarry Smith    PetscStackPop - Pops a function name from the PETSc default stack that tracks where the running program is
1372586f9135SBarry Smith    currently in the source code and verifies the memory is not corrupted.
1373586f9135SBarry Smith 
1374586f9135SBarry Smith    Not Collective
1375586f9135SBarry Smith 
1376586f9135SBarry Smith    Synopsis:
1377586f9135SBarry Smith    #include <petscsys.h>
1378586f9135SBarry Smith    void PetscStackPop
1379586f9135SBarry Smith 
1380586f9135SBarry Smith    Level: developer
1381586f9135SBarry Smith 
1382586f9135SBarry Smith    Notes:
1383586f9135SBarry Smith    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
1384586f9135SBarry Smith    occurred, for example, when a signal is received. It is recommended to use the debugger if extensive information is needed to
1385586f9135SBarry Smith    help debug the problem.
1386586f9135SBarry Smith 
1387586f9135SBarry Smith    The default stack is a global variable called petscstack.
1388586f9135SBarry Smith 
1389586f9135SBarry Smith .seealso: `PetscAttachDebugger()`, `PetscStackCopy()`, `PetscStackView()`, `PetscStackPushNoCheck()`, `PetscStackPopNoCheck()`, `PetscStackPush()`
1390586f9135SBarry Smith M*/
13919371c9d4SSatish Balay #define PetscStackPop \
13929371c9d4SSatish Balay   do { \
1393441dd030SJed Brown     CHKMEMQ; \
1394362febeeSStefano Zampini     PetscStackPopNoCheck(PETSC_FUNCTION_NAME); \
139515681b3cSBarry Smith   } while (0)
1396d64ed03dSBarry Smith 
139730de9b25SBarry Smith /*MC
139830de9b25SBarry Smith    PetscFunctionReturn - Last executable line of each PETSc function
139987497f52SBarry Smith         used for error handling. Replaces `return()`
140030de9b25SBarry Smith 
140130de9b25SBarry Smith    Synopsis:
1402aaa7dc30SBarry Smith    #include <petscsys.h>
140330de9b25SBarry Smith    void PetscFunctionReturn(0);
140430de9b25SBarry Smith 
1405eca87e8dSBarry Smith    Not Collective
1406eca87e8dSBarry Smith 
140730de9b25SBarry Smith    Usage:
140830de9b25SBarry Smith .vb
140930de9b25SBarry Smith     ....
141030de9b25SBarry Smith      PetscFunctionReturn(0);
141130de9b25SBarry Smith    }
141230de9b25SBarry Smith .ve
141330de9b25SBarry Smith 
141487497f52SBarry Smith    Note:
141530de9b25SBarry Smith      Not available in Fortran
141630de9b25SBarry Smith 
141730de9b25SBarry Smith    Level: developer
141830de9b25SBarry Smith 
1419586f9135SBarry Smith .seealso: `PetscFunctionBegin()`, `PetscStackPopNoCheck()`
142030de9b25SBarry Smith 
142130de9b25SBarry Smith M*/
14229371c9d4SSatish Balay #define PetscFunctionReturn(a) \
14239371c9d4SSatish Balay   do { \
1424362febeeSStefano Zampini     PetscStackPopNoCheck(PETSC_FUNCTION_NAME); \
142527104ee2SJacob Faibussowitsch     return a; \
142627104ee2SJacob Faibussowitsch   } while (0)
1427d64ed03dSBarry Smith 
14289371c9d4SSatish Balay #define PetscFunctionReturnVoid() \
14299371c9d4SSatish Balay   do { \
1430362febeeSStefano Zampini     PetscStackPopNoCheck(PETSC_FUNCTION_NAME); \
143127104ee2SJacob Faibussowitsch     return; \
143227104ee2SJacob Faibussowitsch   } while (0)
143327104ee2SJacob Faibussowitsch #else /* PETSC_USE_DEBUG */
143427104ee2SJacob Faibussowitsch #define PetscStackPushNoCheck(funct, petsc_routine, hot)
143537154d10SBarry Smith #define PetscStackUpdateLine
1436792fecdfSBarry Smith #define PetscStackPushExternal(funct)
143727104ee2SJacob Faibussowitsch #define PetscStackPopNoCheck
143827104ee2SJacob Faibussowitsch #define PetscStackClearTop
14393a40ed3dSBarry Smith #define PetscFunctionBegin
14400bdf7c52SPeter Brune #define PetscFunctionBeginUser
1441a2f94806SJed Brown #define PetscFunctionBeginHot
144227104ee2SJacob Faibussowitsch #define PetscFunctionReturn(a)    return a
14435665465eSBarry Smith #define PetscFunctionReturnVoid() return
1444812af9f3SBarry Smith #define PetscStackPop             CHKMEMQ
1445812af9f3SBarry Smith #define PetscStackPush(f)         CHKMEMQ
144627104ee2SJacob Faibussowitsch #endif /* PETSC_USE_DEBUG */
14473a40ed3dSBarry Smith 
14486d210af2SJacob Faibussowitsch #if defined(PETSC_CLANG_STATIC_ANALYZER)
1449e77caa6dSBarry Smith #define PetscStackCallExternalVoid(name, routine)
1450792fecdfSBarry Smith #define PetscCallExternal(func, ...)
14516d210af2SJacob Faibussowitsch #else
1452586f9135SBarry Smith /*MC
1453e77caa6dSBarry Smith     PetscStackCallExternalVoid - Calls an external library routine or user function after pushing the name of the routine on the stack.
1454eb6b5d47SBarry Smith 
1455eb6b5d47SBarry Smith    Input Parameters:
1456eb6b5d47SBarry Smith +   name - string that gives the name of the function being called
1457586f9135SBarry Smith -   routine - actual call to the routine, for example, functionname(a,b)
1458fd3f9acdSBarry Smith 
1459586f9135SBarry Smith    Level: developer
1460eb6b5d47SBarry Smith 
1461586f9135SBarry Smith    Note:
1462792fecdfSBarry Smith    Often one should use `PetscCallExternal()` instead. This routine is intended for external library routines that DO NOT return error codes
1463eb6b5d47SBarry Smith 
1464586f9135SBarry Smith    In debug mode this also checks the memory for corruption at the end of the function call.
1465586f9135SBarry Smith 
1466586f9135SBarry Smith    Certain external packages, such as BLAS/LAPACK may have their own macros for managing the call, error checking, etc.
1467586f9135SBarry Smith 
1468586f9135SBarry Smith    Developer Note:
1469586f9135SBarry Smith    This is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc.
1470586f9135SBarry Smith 
1471792fecdfSBarry Smith .seealso: `PetscCall()`, `PetscStackPushNoCheck()`, `PetscStackPush()`, `PetscCallExternal()`, `PetscCallBLAS()`
1472586f9135SBarry Smith @*/
14739371c9d4SSatish Balay #define PetscStackCallExternalVoid(name, routine) \
14749371c9d4SSatish Balay   do { \
14759371c9d4SSatish Balay     PetscStackPush(name); \
14769371c9d4SSatish Balay     routine; \
14779371c9d4SSatish Balay     PetscStackPop; \
14789371c9d4SSatish Balay   } while (0)
1479eb6b5d47SBarry Smith 
1480586f9135SBarry Smith /*MC
1481792fecdfSBarry Smith     PetscCallExternal - Calls an external library routine that returns an error code after pushing the name of the routine on the stack.
1482fd3f9acdSBarry Smith 
1483fd3f9acdSBarry Smith    Input Parameters:
1484fd3f9acdSBarry Smith +   func-  name of the routine
1485586f9135SBarry Smith -   args - arguments to the routine
1486586f9135SBarry Smith 
1487586f9135SBarry Smith    Level: developer
1488fd3f9acdSBarry Smith 
148995452b02SPatrick Sanan    Notes:
1490e77caa6dSBarry Smith    This is intended for external package routines that return error codes. Use `PetscStackCallExternalVoid()` for those that do not.
1491dbf62e16SBarry Smith 
1492586f9135SBarry Smith    In debug mode this also checks the memory for corruption at the end of the function call.
1493fd3f9acdSBarry Smith 
149487497f52SBarry Smith    Assumes the error return code of the function is an integer and that a value of 0 indicates success
149587497f52SBarry Smith 
1496586f9135SBarry Smith    Developer Note:
1497586f9135SBarry Smith    This is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc.
1498586f9135SBarry Smith 
1499e77caa6dSBarry Smith .seealso: `PetscCall()`, `PetscStackPushNoCheck()`, `PetscStackPush()`, `PetscStackCallExternalVoid()`
1500586f9135SBarry Smith M*/
15019371c9d4SSatish Balay #define PetscCallExternal(func, ...) \
15029371c9d4SSatish Balay   do { \
1503a74df02fSJacob Faibussowitsch     PetscStackPush(PetscStringize(func)); \
1504a74df02fSJacob Faibussowitsch     PetscErrorCode __ierr = func(__VA_ARGS__); \
15051d4906efSStefano Zampini     PetscStackPop; \
150632771afcSJacob Faibussowitsch     PetscCheck(!__ierr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Error in %s(): error code %d", PetscStringize(func), __ierr); \
1507fd3f9acdSBarry Smith   } while (0)
15086d210af2SJacob Faibussowitsch #endif /* PETSC_CLANG_STATIC_ANALYZER */
150906d1fe2cSBarry Smith 
151006d1fe2cSBarry Smith #endif
1511