xref: /petsc/include/petscerror.h (revision f01fac0d49b3d830bee1ca8b0283d500c0bf130e)
154a8ef01SBarry Smith /*
2f621e05eSBarry Smith     Contains all error handling interfaces for PETSc.
354a8ef01SBarry Smith */
445d48df9SBarry Smith #if !defined(__PETSCERROR_H)
545d48df9SBarry Smith #define __PETSCERROR_H
66c7e564aSBarry Smith 
754a8ef01SBarry Smith /*
8329ffe3dSLois Curfman McInnes      These are the generic error codes. These error codes are used
9e2d1d2b7SBarry Smith      many different places in the PETSc source code. The string versions are
100e5e90baSSatish Balay      at src/sys/error/err.c any changes here must also be made there
11af0996ceSBarry Smith      These are also define in include/petsc/finclude/petscerror.h any CHANGES here
120f9cf654SBarry Smith      must be also made there.
1345d48df9SBarry Smith 
1454a8ef01SBarry Smith */
152a6744ebSBarry Smith #define PETSC_ERR_MIN_VALUE        54   /* should always be one less then the smallest value */
162a6744ebSBarry Smith 
1745d48df9SBarry Smith #define PETSC_ERR_MEM              55   /* unable to allocate requested memory */
1847794344SBarry Smith #define PETSC_ERR_SUP              56   /* no support for requested operation */
19e2d1d2b7SBarry Smith #define PETSC_ERR_SUP_SYS          57   /* no support for requested operation on this computer system */
20e2d1d2b7SBarry Smith #define PETSC_ERR_ORDER            58   /* operation done in wrong order */
2145d48df9SBarry Smith #define PETSC_ERR_SIG              59   /* signal received */
22f1caa5a4SBarry Smith #define PETSC_ERR_FP               72   /* floating point exception */
23a8c6a408SBarry Smith #define PETSC_ERR_COR              74   /* corrupted PETSc object */
24a8c6a408SBarry Smith #define PETSC_ERR_LIB              76   /* error in library called by PETSc */
25329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB             77   /* PETSc library generated inconsistent data */
26329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC             78   /* memory corruption */
27b3cc6726SBarry Smith #define PETSC_ERR_CONV_FAILED      82   /* iterative method (KSP or SNES) failed */
281302d50aSBarry Smith #define PETSC_ERR_USER             83   /* user has not provided needed function */
294e2ffeddSBarry Smith #define PETSC_ERR_SYS              88   /* error in system call */
30a8b45ee7SBarry Smith #define PETSC_ERR_POINTER          70   /* pointer does not point to valid address */
3145d48df9SBarry Smith 
3245d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ          60   /* nonconforming object sizes used in operation */
3345d48df9SBarry Smith #define PETSC_ERR_ARG_IDN          61   /* two arguments not allowed to be the same */
34a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG        62   /* wrong argument (but object probably ok) */
3545d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT      64   /* null or corrupted PETSc object as argument */
3645d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE   63   /* input argument, out of range */
374f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR       68   /* invalid pointer argument */
384f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE  69   /* two args must be same object type */
396831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM  80   /* two args must be same communicators */
40d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE   73   /* object in argument is in wrong state, e.g. unassembled mat */
418cda6cd7SBarry Smith #define PETSC_ERR_ARG_TYPENOTSET   89   /* the type of the object has not yet been set */
42a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP       75   /* two arguments are incompatible */
434482741eSBarry Smith #define PETSC_ERR_ARG_NULL         85   /* argument is null that should not be */
44958c9bccSBarry Smith #define PETSC_ERR_ARG_UNKNOWN_TYPE 86   /* type name doesn't match any registered type */
454f227f7cSBarry Smith 
464f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN        65   /* unable to open file */
474f227f7cSBarry Smith #define PETSC_ERR_FILE_READ        66   /* unable to read from file */
484f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE       67   /* unable to write to file */
49a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED  79   /* unexpected data in file */
5045d48df9SBarry Smith 
51329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT     71   /* detected a zero pivot during LU factorization */
529e3b2f23SBarry Smith #define PETSC_ERR_MAT_CH_ZRPVT     81   /* detected a zero pivot during Cholesky factorization */
5354a8ef01SBarry Smith 
5468e69593SBarry Smith #define PETSC_ERR_INT_OVERFLOW     84
553855c12bSBarry Smith 
56bf3909cdSBarry Smith #define PETSC_ERR_FLOP_COUNT       90
57e113a28aSBarry Smith #define PETSC_ERR_NOT_CONVERGED    91  /* solver did not converge */
5892e8f287SBarry Smith #define PETSC_ERR_MISSING_FACTOR   92  /* MatGetFactor() failed */
59c5a392abSBarry Smith #define PETSC_ERR_OPT_OVERWRITE    93  /* attempted to over wrote options which should not be changed */
602a6744ebSBarry Smith 
61c5a392abSBarry Smith #define PETSC_ERR_MAX_VALUE        94  /* this is always the one more than the largest error code */
62b9eb5ee8SHong Zhang 
6359aaf355SLisandro Dalcin #define PetscStringizeArg(a) #a
6459aaf355SLisandro Dalcin #define PetscStringize(a) PetscStringizeArg(a)
65330cf3c9SBarry Smith 
66e8b7e333SSatish Balay #if defined(PETSC_USE_ERRORCHECKING)
67e8b7e333SSatish Balay 
6830de9b25SBarry Smith /*MC
691957e957SBarry Smith    SETERRQ - Macro to be called when an error has been detected,
7030de9b25SBarry Smith 
7130de9b25SBarry Smith    Synopsis:
72aaa7dc30SBarry Smith    #include <petscsys.h>
733af045c5SBarry Smith    PetscErrorCode SETERRQ(MPI_Comm comm,PetscErrorCode ierr,char *message)
7430de9b25SBarry Smith 
753af045c5SBarry Smith    Collective on MPI_Comm
7630de9b25SBarry Smith 
7730de9b25SBarry Smith    Input Parameters:
783af045c5SBarry Smith +  comm - A communicator, use PETSC_COMM_SELF unless you know all ranks of another communicator will detect the error
793af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
8030de9b25SBarry Smith -  message - error message
8130de9b25SBarry Smith 
8230de9b25SBarry Smith   Level: beginner
8330de9b25SBarry Smith 
8430de9b25SBarry Smith    Notes:
8530de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
8630de9b25SBarry Smith 
8730de9b25SBarry Smith     See SETERRQ1(), SETERRQ2(), SETERRQ3() for versions that take arguments
8830de9b25SBarry Smith 
8958ebbce7SBarry Smith     In Fortran MPI_Abort() is always called
9030de9b25SBarry Smith 
9130de9b25SBarry Smith     Experienced users can set the error handler with PetscPushErrorHandler().
9230de9b25SBarry Smith 
9330de9b25SBarry Smith    Concepts: error^setting condition
9430de9b25SBarry Smith 
9591d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3()
9630de9b25SBarry Smith M*/
973af045c5SBarry Smith #define SETERRQ(comm,ierr,s) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s)
9830de9b25SBarry Smith 
9930de9b25SBarry Smith /*MC
10030de9b25SBarry Smith    SETERRQ1 - Macro that is called when an error has been detected,
10130de9b25SBarry Smith 
10230de9b25SBarry Smith    Synopsis:
103aaa7dc30SBarry Smith    #include <petscsys.h>
1043af045c5SBarry Smith    PetscErrorCode SETERRQ1(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg)
10530de9b25SBarry Smith 
1063af045c5SBarry Smith    Collective on MPI_Comm
10730de9b25SBarry Smith 
10830de9b25SBarry Smith    Input Parameters:
109fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
1103af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
11130de9b25SBarry Smith .  message - error message in the printf format
11230de9b25SBarry Smith -  arg - argument (for example an integer, string or double)
11330de9b25SBarry Smith 
11430de9b25SBarry Smith   Level: beginner
11530de9b25SBarry Smith 
11630de9b25SBarry Smith    Notes:
11730de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
11830de9b25SBarry Smith 
11930de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
12030de9b25SBarry Smith 
12130de9b25SBarry Smith    Concepts: error^setting condition
12230de9b25SBarry Smith 
12391d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ(), SETERRQ2(), SETERRQ3()
12430de9b25SBarry Smith M*/
1253af045c5SBarry Smith #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1)
12630de9b25SBarry Smith 
12730de9b25SBarry Smith /*MC
12830de9b25SBarry Smith    SETERRQ2 - Macro that is called when an error has been detected,
12930de9b25SBarry Smith 
13030de9b25SBarry Smith    Synopsis:
131aaa7dc30SBarry Smith    #include <petscsys.h>
1323af045c5SBarry Smith    PetscErrorCode SETERRQ2(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2)
13330de9b25SBarry Smith 
1343af045c5SBarry Smith    Collective on MPI_Comm
13530de9b25SBarry Smith 
13630de9b25SBarry Smith    Input Parameters:
137fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
1383af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
13930de9b25SBarry Smith .  message - error message in the printf format
14030de9b25SBarry Smith .  arg1 - argument (for example an integer, string or double)
14130de9b25SBarry Smith -  arg2 - argument (for example an integer, string or double)
14230de9b25SBarry Smith 
14330de9b25SBarry Smith   Level: beginner
14430de9b25SBarry Smith 
14530de9b25SBarry Smith    Notes:
14630de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
14730de9b25SBarry Smith 
14830de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
14930de9b25SBarry Smith 
15030de9b25SBarry Smith    Concepts: error^setting condition
15130de9b25SBarry Smith 
1526024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ3()
15330de9b25SBarry Smith M*/
1543af045c5SBarry Smith #define SETERRQ2(comm,ierr,s,a1,a2) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2)
15530de9b25SBarry Smith 
15630de9b25SBarry Smith /*MC
15730de9b25SBarry Smith    SETERRQ3 - Macro that is called when an error has been detected,
15830de9b25SBarry Smith 
15930de9b25SBarry Smith    Synopsis:
160aaa7dc30SBarry Smith    #include <petscsys.h>
1613af045c5SBarry Smith    PetscErrorCode SETERRQ3(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
16230de9b25SBarry Smith 
1633af045c5SBarry Smith    Collective on MPI_Comm
16430de9b25SBarry Smith 
16530de9b25SBarry Smith    Input Parameters:
166fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
1673af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
16830de9b25SBarry Smith .  message - error message in the printf format
16930de9b25SBarry Smith .  arg1 - argument (for example an integer, string or double)
17030de9b25SBarry Smith .  arg2 - argument (for example an integer, string or double)
17130de9b25SBarry Smith -  arg3 - argument (for example an integer, string or double)
17230de9b25SBarry Smith 
17330de9b25SBarry Smith   Level: beginner
17430de9b25SBarry Smith 
17530de9b25SBarry Smith    Notes:
17630de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
17730de9b25SBarry Smith 
178f621e05eSBarry Smith     There are also versions for 4, 5, 6 and 7 arguments.
179f621e05eSBarry Smith 
18030de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
18130de9b25SBarry Smith 
18230de9b25SBarry Smith    Concepts: error^setting condition
18330de9b25SBarry Smith 
1846024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
18530de9b25SBarry Smith M*/
1863af045c5SBarry Smith #define SETERRQ3(comm,ierr,s,a1,a2,a3) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3)
18730de9b25SBarry Smith 
188fa190f98SMatthew G. Knepley /*MC
189fa190f98SMatthew G. Knepley    SETERRQ4 - Macro that is called when an error has been detected,
190fa190f98SMatthew G. Knepley 
191fa190f98SMatthew G. Knepley    Synopsis:
192fa190f98SMatthew G. Knepley    #include <petscsys.h>
1933af045c5SBarry Smith    PetscErrorCode SETERRQ4(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
194fa190f98SMatthew G. Knepley 
1953af045c5SBarry Smith    Collective on MPI_Comm
196fa190f98SMatthew G. Knepley 
197fa190f98SMatthew G. Knepley    Input Parameters:
198fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
1993af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
200fa190f98SMatthew G. Knepley .  message - error message in the printf format
201fa190f98SMatthew G. Knepley .  arg1 - argument (for example an integer, string or double)
202fa190f98SMatthew G. Knepley .  arg2 - argument (for example an integer, string or double)
203fa190f98SMatthew G. Knepley .  arg3 - argument (for example an integer, string or double)
204fa190f98SMatthew G. Knepley -  arg4 - argument (for example an integer, string or double)
205fa190f98SMatthew G. Knepley 
206fa190f98SMatthew G. Knepley   Level: beginner
207fa190f98SMatthew G. Knepley 
208fa190f98SMatthew G. Knepley    Notes:
209fa190f98SMatthew G. Knepley     Once the error handler is called the calling function is then returned from with the given error code.
210fa190f98SMatthew G. Knepley 
211fa190f98SMatthew G. Knepley     There are also versions for 4, 5, 6 and 7 arguments.
212fa190f98SMatthew G. Knepley 
213fa190f98SMatthew G. Knepley    Experienced users can set the error handler with PetscPushErrorHandler().
214fa190f98SMatthew G. Knepley 
215fa190f98SMatthew G. Knepley    Concepts: error^setting condition
216fa190f98SMatthew G. Knepley 
217fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
218fa190f98SMatthew G. Knepley M*/
2193af045c5SBarry Smith #define SETERRQ4(comm,ierr,s,a1,a2,a3,a4) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4)
220fa190f98SMatthew G. Knepley 
221fa190f98SMatthew G. Knepley /*MC
222fa190f98SMatthew G. Knepley    SETERRQ5 - Macro that is called when an error has been detected,
223fa190f98SMatthew G. Knepley 
224fa190f98SMatthew G. Knepley    Synopsis:
225fa190f98SMatthew G. Knepley    #include <petscsys.h>
2263af045c5SBarry Smith    PetscErrorCode SETERRQ5(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
227fa190f98SMatthew G. Knepley 
2283af045c5SBarry Smith    Collective on MPI_COmm
229fa190f98SMatthew G. Knepley 
230fa190f98SMatthew G. Knepley    Input Parameters:
231fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
2323af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
233fa190f98SMatthew G. Knepley .  message - error message in the printf format
234fa190f98SMatthew G. Knepley .  arg1 - argument (for example an integer, string or double)
235fa190f98SMatthew G. Knepley .  arg2 - argument (for example an integer, string or double)
236fa190f98SMatthew G. Knepley .  arg3 - argument (for example an integer, string or double)
237fa190f98SMatthew G. Knepley .  arg4 - argument (for example an integer, string or double)
238fa190f98SMatthew G. Knepley -  arg5 - argument (for example an integer, string or double)
239fa190f98SMatthew G. Knepley 
240fa190f98SMatthew G. Knepley   Level: beginner
241fa190f98SMatthew G. Knepley 
242fa190f98SMatthew G. Knepley    Notes:
243fa190f98SMatthew G. Knepley     Once the error handler is called the calling function is then returned from with the given error code.
244fa190f98SMatthew G. Knepley 
245fa190f98SMatthew G. Knepley     There are also versions for 4, 5, 6 and 7 arguments.
246fa190f98SMatthew G. Knepley 
247fa190f98SMatthew G. Knepley    Experienced users can set the error handler with PetscPushErrorHandler().
248fa190f98SMatthew G. Knepley 
249fa190f98SMatthew G. Knepley    Concepts: error^setting condition
250fa190f98SMatthew G. Knepley 
251fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
252fa190f98SMatthew G. Knepley M*/
2533af045c5SBarry Smith #define SETERRQ5(comm,ierr,s,a1,a2,a3,a4,a5) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5)
254fa190f98SMatthew G. Knepley 
255fa190f98SMatthew G. Knepley /*MC
256fa190f98SMatthew G. Knepley    SETERRQ6 - Macro that is called when an error has been detected,
257fa190f98SMatthew G. Knepley 
258fa190f98SMatthew G. Knepley    Synopsis:
259fa190f98SMatthew G. Knepley    #include <petscsys.h>
2603af045c5SBarry Smith    PetscErrorCode SETERRQ6(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
261fa190f98SMatthew G. Knepley 
2623af045c5SBarry Smith    Collective on MPI_Comm
263fa190f98SMatthew G. Knepley 
264fa190f98SMatthew G. Knepley    Input Parameters:
265fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
2663af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
267fa190f98SMatthew G. Knepley .  message - error message in the printf format
268fa190f98SMatthew G. Knepley .  arg1 - argument (for example an integer, string or double)
269fa190f98SMatthew G. Knepley .  arg2 - argument (for example an integer, string or double)
270fa190f98SMatthew G. Knepley .  arg3 - argument (for example an integer, string or double)
271fa190f98SMatthew G. Knepley .  arg4 - argument (for example an integer, string or double)
272fa190f98SMatthew G. Knepley .  arg5 - argument (for example an integer, string or double)
273fa190f98SMatthew G. Knepley -  arg6 - argument (for example an integer, string or double)
274fa190f98SMatthew G. Knepley 
275fa190f98SMatthew G. Knepley   Level: beginner
276fa190f98SMatthew G. Knepley 
277fa190f98SMatthew G. Knepley    Notes:
278fa190f98SMatthew G. Knepley     Once the error handler is called the calling function is then returned from with the given error code.
279fa190f98SMatthew G. Knepley 
280fa190f98SMatthew G. Knepley     There are also versions for 4, 5, 6 and 7 arguments.
281fa190f98SMatthew G. Knepley 
282fa190f98SMatthew G. Knepley    Experienced users can set the error handler with PetscPushErrorHandler().
283fa190f98SMatthew G. Knepley 
284fa190f98SMatthew G. Knepley    Concepts: error^setting condition
285fa190f98SMatthew G. Knepley 
286fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
287fa190f98SMatthew G. Knepley M*/
2883af045c5SBarry Smith #define SETERRQ6(comm,ierr,s,a1,a2,a3,a4,a5,a6) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6)
289fa190f98SMatthew G. Knepley 
290fa190f98SMatthew G. Knepley /*MC
291fa190f98SMatthew G. Knepley    SETERRQ7 - Macro that is called when an error has been detected,
292fa190f98SMatthew G. Knepley 
293fa190f98SMatthew G. Knepley    Synopsis:
294fa190f98SMatthew G. Knepley    #include <petscsys.h>
2953af045c5SBarry Smith    PetscErrorCode SETERRQ7(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
296fa190f98SMatthew G. Knepley 
2973af045c5SBarry Smith    Collective on MPI_Comm
298fa190f98SMatthew G. Knepley 
299fa190f98SMatthew G. Knepley    Input Parameters:
300fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
3013af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
302fa190f98SMatthew G. Knepley .  message - error message in the printf format
303fa190f98SMatthew G. Knepley .  arg1 - argument (for example an integer, string or double)
304fa190f98SMatthew G. Knepley .  arg2 - argument (for example an integer, string or double)
305fa190f98SMatthew G. Knepley .  arg3 - argument (for example an integer, string or double)
306fa190f98SMatthew G. Knepley .  arg4 - argument (for example an integer, string or double)
307fa190f98SMatthew G. Knepley .  arg5 - argument (for example an integer, string or double)
308fa190f98SMatthew G. Knepley .  arg6 - argument (for example an integer, string or double)
309fa190f98SMatthew G. Knepley -  arg7 - argument (for example an integer, string or double)
310fa190f98SMatthew G. Knepley 
311fa190f98SMatthew G. Knepley   Level: beginner
312fa190f98SMatthew G. Knepley 
313fa190f98SMatthew G. Knepley    Notes:
314fa190f98SMatthew G. Knepley     Once the error handler is called the calling function is then returned from with the given error code.
315fa190f98SMatthew G. Knepley 
316fa190f98SMatthew G. Knepley     There are also versions for 4, 5, 6 and 7 arguments.
317fa190f98SMatthew G. Knepley 
318fa190f98SMatthew G. Knepley    Experienced users can set the error handler with PetscPushErrorHandler().
319fa190f98SMatthew G. Knepley 
320fa190f98SMatthew G. Knepley    Concepts: error^setting condition
321fa190f98SMatthew G. Knepley 
322fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
323fa190f98SMatthew G. Knepley M*/
3243af045c5SBarry Smith #define SETERRQ7(comm,ierr,s,a1,a2,a3,a4,a5,a6,a7) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7)
325fa190f98SMatthew G. Knepley 
326fa190f98SMatthew G. Knepley /*MC
327fa190f98SMatthew G. Knepley    SETERRQ8 - Macro that is called when an error has been detected,
328fa190f98SMatthew G. Knepley 
329fa190f98SMatthew G. Knepley    Synopsis:
330fa190f98SMatthew G. Knepley    #include <petscsys.h>
3313af045c5SBarry Smith    PetscErrorCode SETERRQ8(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3)
332fa190f98SMatthew G. Knepley 
3333af045c5SBarry Smith    Collective on MPI_Comm
334fa190f98SMatthew G. Knepley 
335fa190f98SMatthew G. Knepley    Input Parameters:
336fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
3373af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
338fa190f98SMatthew G. Knepley .  message - error message in the printf format
339fa190f98SMatthew G. Knepley .  arg1 - argument (for example an integer, string or double)
340fa190f98SMatthew G. Knepley .  arg2 - argument (for example an integer, string or double)
341fa190f98SMatthew G. Knepley .  arg3 - argument (for example an integer, string or double)
342fa190f98SMatthew G. Knepley .  arg4 - argument (for example an integer, string or double)
343fa190f98SMatthew G. Knepley .  arg5 - argument (for example an integer, string or double)
344fa190f98SMatthew G. Knepley .  arg6 - argument (for example an integer, string or double)
345fa190f98SMatthew G. Knepley .  arg7 - argument (for example an integer, string or double)
346fa190f98SMatthew G. Knepley -  arg8 - argument (for example an integer, string or double)
347fa190f98SMatthew G. Knepley 
348fa190f98SMatthew G. Knepley   Level: beginner
349fa190f98SMatthew G. Knepley 
350fa190f98SMatthew G. Knepley    Notes:
351fa190f98SMatthew G. Knepley     Once the error handler is called the calling function is then returned from with the given error code.
352fa190f98SMatthew G. Knepley 
353fa190f98SMatthew G. Knepley     There are also versions for 4, 5, 6 and 7 arguments.
354fa190f98SMatthew G. Knepley 
355fa190f98SMatthew G. Knepley    Experienced users can set the error handler with PetscPushErrorHandler().
356fa190f98SMatthew G. Knepley 
357fa190f98SMatthew G. Knepley    Concepts: error^setting condition
358fa190f98SMatthew G. Knepley 
359fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
360fa190f98SMatthew G. Knepley M*/
3613af045c5SBarry Smith #define SETERRQ8(comm,ierr,s,a1,a2,a3,a4,a5,a6,a7,a8) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7,a8)
362fa190f98SMatthew G. Knepley 
363fa190f98SMatthew G. Knepley /*MC
364fa190f98SMatthew G. Knepley    SETERRABORT - Macro that can be called when an error has been detected,
365fa190f98SMatthew G. Knepley 
366fa190f98SMatthew G. Knepley    Synopsis:
367fa190f98SMatthew G. Knepley    #include <petscsys.h>
3683af045c5SBarry Smith    PetscErrorCode SETERRABORT(MPI_Comm comm,PetscErrorCode ierr,char *message)
369fa190f98SMatthew G. Knepley 
3703af045c5SBarry Smith    Collective on MPI_Comm
371fa190f98SMatthew G. Knepley 
372fa190f98SMatthew G. Knepley    Input Parameters:
373fa190f98SMatthew G. Knepley +  comm - A communicator, so that the error can be collective
3743af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
375fa190f98SMatthew G. Knepley -  message - error message in the printf format
376fa190f98SMatthew G. Knepley 
377fa190f98SMatthew G. Knepley   Level: beginner
378fa190f98SMatthew G. Knepley 
379fa190f98SMatthew G. Knepley    Notes:
380fa190f98SMatthew G. Knepley     This function just calls MPI_Abort().
381fa190f98SMatthew G. Knepley 
382fa190f98SMatthew G. Knepley    Concepts: error^setting condition
383fa190f98SMatthew G. Knepley 
384fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2()
385fa190f98SMatthew G. Knepley M*/
3863af045c5SBarry Smith #define SETERRABORT(comm,ierr,s) do {PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s);MPI_Abort(comm,ierr);} while (0)
3879a00fa46SSatish Balay 
38830de9b25SBarry Smith /*MC
38930de9b25SBarry Smith    CHKERRQ - Checks error code, if non-zero it calls the error handler and then returns
39030de9b25SBarry Smith 
39130de9b25SBarry Smith    Synopsis:
392aaa7dc30SBarry Smith    #include <petscsys.h>
3933af045c5SBarry Smith    PetscErrorCode CHKERRQ(PetscErrorCode ierr)
39430de9b25SBarry Smith 
395eca87e8dSBarry Smith    Not Collective
39630de9b25SBarry Smith 
39730de9b25SBarry Smith    Input Parameters:
3983af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
39930de9b25SBarry Smith 
40030de9b25SBarry Smith   Level: beginner
40130de9b25SBarry Smith 
40230de9b25SBarry Smith    Notes:
40330de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
40430de9b25SBarry Smith 
40530de9b25SBarry Smith     Experienced users can set the error handler with PetscPushErrorHandler().
4065324ea47SKris Buschelman 
4073af045c5SBarry Smith     CHKERRQ(ierr) is fundamentally a macro replacement for
4083af045c5SBarry Smith          if (ierr) return(PetscError(...,ierr,...));
4095324ea47SKris Buschelman 
4105324ea47SKris Buschelman     Although typical usage resembles "void CHKERRQ(PetscErrorCode)" as described above, for certain uses it is
4115324ea47SKris Buschelman     highly inappropriate to use it in this manner as it invokes return(PetscErrorCode). In particular,
4125324ea47SKris Buschelman     it cannot be used in functions which return(void) or any other datatype.  In these types of functions,
41358ebbce7SBarry Smith     you can use CHKERRV() which returns without an error code (bad idea since the error is ignored or
4143af045c5SBarry Smith          if (ierr) {PetscError(....); return(YourReturnType);}
4150298fd71SBarry Smith     where you may pass back a NULL to indicate an error. You can also call CHKERRABORT(comm,n) to have
41658ebbce7SBarry Smith     MPI_Abort() returned immediately.
41758ebbce7SBarry Smith 
41858ebbce7SBarry Smith     In Fortran MPI_Abort() is always called
41930de9b25SBarry Smith 
42030de9b25SBarry Smith    Concepts: error^setting condition
42130de9b25SBarry Smith 
42291d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2()
42330de9b25SBarry Smith M*/
4243af045c5SBarry Smith #define CHKERRQ(ierr)          do {if (PetscUnlikely(ierr)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");} while (0)
42530de9b25SBarry Smith 
426*f01fac0dSBarry Smith #define CHKERRV(ierr)          do {if (PetscUnlikely(ierr)) {ierr = PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");return;}} while(0)
4273af045c5SBarry Smith #define CHKERRABORT(comm,ierr) do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");MPI_Abort(comm,ierr);}} while (0)
4283af045c5SBarry Smith #define CHKERRCONTINUE(ierr)   do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");}} while (0)
42985614651SBarry Smith 
430fd705b32SMatthew Knepley #ifdef PETSC_CLANGUAGE_CXX
431fd705b32SMatthew Knepley 
432cc26af49SMatthew Knepley /*MC
433cc26af49SMatthew Knepley    CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception
434cc26af49SMatthew Knepley 
435cc26af49SMatthew Knepley    Synopsis:
436aaa7dc30SBarry Smith    #include <petscsys.h>
4373af045c5SBarry Smith    void CHKERRXX(PetscErrorCode ierr)
438cc26af49SMatthew Knepley 
439eca87e8dSBarry Smith    Not Collective
440cc26af49SMatthew Knepley 
441cc26af49SMatthew Knepley    Input Parameters:
4423af045c5SBarry Smith .  ierr - nonzero error code, see the list of standard error codes in include/petscerror.h
443cc26af49SMatthew Knepley 
444cc26af49SMatthew Knepley   Level: beginner
445cc26af49SMatthew Knepley 
446cc26af49SMatthew Knepley    Notes:
447cc26af49SMatthew Knepley     Once the error handler throws a ??? exception.
448cc26af49SMatthew Knepley 
449cc26af49SMatthew Knepley     You can use CHKERRV() which returns without an error code (bad idea since the error is ignored)
450cc26af49SMatthew Knepley     or CHKERRABORT(comm,n) to have MPI_Abort() returned immediately.
451cc26af49SMatthew Knepley 
452cc26af49SMatthew Knepley    Concepts: error^setting condition
453cc26af49SMatthew Knepley 
454cc26af49SMatthew Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKERRQ(), CHKMEMQ
455cc26af49SMatthew Knepley M*/
4563af045c5SBarry Smith #define CHKERRXX(ierr)  do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_IN_CXX,0);}} while(0)
457fd705b32SMatthew Knepley 
458fd705b32SMatthew Knepley #endif
459fd705b32SMatthew Knepley 
4605be1650bSAlejandro Lamas Daviña #define CHKERRCUDA(err)   do {if (PetscUnlikely(err)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUDA error %d",err);} while(0)
4615be1650bSAlejandro Lamas Daviña #define CHKERRCUBLAS(err) do {if (PetscUnlikely(err)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUBLAS error %d",err);} while(0)
46282f73ecaSAlejandro Lamas Daviña 
46330de9b25SBarry Smith /*MC
46430de9b25SBarry Smith    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
46530de9b25SBarry Smith 
46630de9b25SBarry Smith    Synopsis:
467aaa7dc30SBarry Smith    #include <petscsys.h>
46891d3bdf4SKris Buschelman    CHKMEMQ;
46930de9b25SBarry Smith 
470eca87e8dSBarry Smith    Not Collective
471eca87e8dSBarry Smith 
47230de9b25SBarry Smith   Level: beginner
47330de9b25SBarry Smith 
47430de9b25SBarry Smith    Notes:
4751957e957SBarry Smith     We highly recommend using valgrind http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind for finding memory problems. This is useful
4761957e957SBarry Smith     on systems that do not have valgrind, but much much less useful.
4771957e957SBarry Smith 
478ff002950SBarry Smith     Must run with the option -malloc_debug to enable this option
47930de9b25SBarry Smith 
48030de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
48130de9b25SBarry Smith 
48230de9b25SBarry Smith     By defaults prints location where memory that is corrupted was allocated.
48330de9b25SBarry Smith 
484f621e05eSBarry Smith     Use CHKMEMA for functions that return void
485f621e05eSBarry Smith 
48630de9b25SBarry Smith    Concepts: memory corruption
48730de9b25SBarry Smith 
4886024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(),
489ff002950SBarry Smith           PetscMallocValidate()
49030de9b25SBarry Smith M*/
491efca3c55SSatish Balay #define CHKMEMQ do {PetscErrorCode _7_ierr = PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__);CHKERRQ(_7_ierr);} while(0)
49285614651SBarry Smith 
493efca3c55SSatish Balay #define CHKMEMA PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__)
494e68848bdSBarry Smith 
495f8e50935SSatish Balay #else /* PETSC_USE_ERRORCHECKING */
496f621e05eSBarry Smith 
497f621e05eSBarry Smith /*
498e2e64c6bSBarry Smith     These are defined to be empty for when error checking is turned off, with ./configure --with-errorchecking=0
499f621e05eSBarry Smith */
500f621e05eSBarry Smith 
5013af045c5SBarry Smith #define SETERRQ(c,ierr,s)
5023af045c5SBarry Smith #define SETERRQ1(c,ierr,s,a1)
5033af045c5SBarry Smith #define SETERRQ2(c,ierr,s,a1,a2)
5043af045c5SBarry Smith #define SETERRQ3(c,ierr,s,a1,a2,a3)
5053af045c5SBarry Smith #define SETERRQ4(c,ierr,s,a1,a2,a3,a4)
5063af045c5SBarry Smith #define SETERRQ5(c,ierr,s,a1,a2,a3,a4,a5)
5073af045c5SBarry Smith #define SETERRQ6(c,ierr,s,a1,a2,a3,a4,a5,a6)
5083af045c5SBarry Smith #define SETERRQ7(c,ierr,s,a1,a2,a3,a4,a5,a6,a7)
5093af045c5SBarry Smith #define SETERRQ8(c,ierr,s,a1,a2,a3,a4,a5,a6,a7,a8)
5103af045c5SBarry Smith #define SETERRABORT(comm,ierr,s)
51185614651SBarry Smith 
5123af045c5SBarry Smith #define CHKERRQ(ierr)     ;
5133af045c5SBarry Smith #define CHKERRV(ierr)     ;
5141ee4faa0SMatthew Knepley #define CHKERRABORT(comm,n) ;
5153af045c5SBarry Smith #define CHKERRCONTINUE(ierr) ;
51685614651SBarry Smith #define CHKMEMQ        ;
51782f73ecaSAlejandro Lamas Daviña #define CHKERRCUDA(err) ;
51882f73ecaSAlejandro Lamas Daviña #define CHKERRCUBLAS(err) ;
51985614651SBarry Smith 
5208cabf42eSMatthew G Knepley #ifdef PETSC_CLANGUAGE_CXX
5213af045c5SBarry Smith #define CHKERRXX(ierr) ;
5228cabf42eSMatthew G Knepley #endif
5238cabf42eSMatthew G Knepley 
524f8e50935SSatish Balay #endif /* PETSC_USE_ERRORCHECKING */
52554a8ef01SBarry Smith 
526668f157eSBarry Smith /*E
527668f157eSBarry Smith   PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers
528668f157eSBarry Smith 
529668f157eSBarry Smith   Level: advanced
530668f157eSBarry Smith 
531d736bfebSBarry Smith   PETSC_ERROR_IN_CXX indicates the error was detected in C++ and an exception should be generated
532d736bfebSBarry Smith 
53361b0d812SBarry Smith   Developer Notes: This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandler()
534668f157eSBarry Smith 
535d736bfebSBarry Smith .seealso: PetscError(), SETERRXX()
536668f157eSBarry Smith E*/
537d736bfebSBarry Smith typedef enum {PETSC_ERROR_INITIAL=0,PETSC_ERROR_REPEAT=1,PETSC_ERROR_IN_CXX = 2} PetscErrorType;
5384b209cf6SBarry Smith 
539eb9e708aSLisandro Dalcin #if defined(__clang_analyzer__)
540eb9e708aSLisandro Dalcin __attribute__((analyzer_noreturn))
541eb9e708aSLisandro Dalcin #endif
542eb9e708aSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscError(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,...);
543eb9e708aSLisandro Dalcin 
544014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void);
545014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **);
546efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
547efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
548efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
549efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
550efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
551efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
552efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*);
553efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void*);
554014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void);
5558d359177SBarry Smith PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int,void*);
556014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*);
557014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void);
55828559dc8SJed Brown PETSC_EXTERN PetscErrorCode PetscCheckPointerSetIntensity(PetscInt);
559329f5518SBarry Smith 
560639ff905SBarry Smith /*MC
561639ff905SBarry Smith     PetscErrorPrintf - Prints error messages.
562639ff905SBarry Smith 
563639ff905SBarry Smith    Synopsis:
564aaa7dc30SBarry Smith     #include <petscsys.h>
565639ff905SBarry Smith      PetscErrorCode (*PetscErrorPrintf)(const char format[],...);
566639ff905SBarry Smith 
567639ff905SBarry Smith     Not Collective
568639ff905SBarry Smith 
569639ff905SBarry Smith     Input Parameters:
570639ff905SBarry Smith .   format - the usual printf() format string
571639ff905SBarry Smith 
572639ff905SBarry Smith    Options Database Keys:
5731957e957SBarry Smith +    -error_output_stdout - cause error messages to be printed to stdout instead of the  (default) stderr
574e1bc860dSBarry Smith -    -error_output_none - to turn off all printing of error messages (does not change the way the error is handled.)
575639ff905SBarry Smith 
576639ff905SBarry Smith    Notes: Use
577639ff905SBarry Smith $     PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the
578639ff905SBarry Smith $                        error is handled.) and
5791957e957SBarry Smith $     PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on or you can use your own function
580639ff905SBarry Smith 
581639ff905SBarry Smith           Use
582639ff905SBarry Smith      PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file.
583639ff905SBarry Smith      PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file.
584639ff905SBarry Smith 
585639ff905SBarry Smith           Use
586639ff905SBarry Smith       PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print
587639ff905SBarry Smith 
588639ff905SBarry Smith    Level: developer
589639ff905SBarry Smith 
590639ff905SBarry Smith     Fortran Note:
591639ff905SBarry Smith     This routine is not supported in Fortran.
592639ff905SBarry Smith 
593639ff905SBarry Smith     Concepts: error messages^printing
594639ff905SBarry Smith     Concepts: printing^error messages
595639ff905SBarry Smith 
596639ff905SBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf(), PetscPrintf(), PetscErrorHandlerPush(), PetscVFPrintf(), PetscHelpPrintf()
597639ff905SBarry Smith M*/
598639ff905SBarry Smith PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[],...);
599639ff905SBarry Smith 
600329f5518SBarry Smith typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap;
601014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap);
602014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap);
603014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void);
60454a8ef01SBarry Smith 
6053a40ed3dSBarry Smith /*
6063a40ed3dSBarry Smith       Allows the code to build a stack frame as it runs
6073a40ed3dSBarry Smith */
6083a40ed3dSBarry Smith 
60999cd645aSJed Brown #define PETSCSTACKSIZE 64
610184914b5SBarry Smith 
6113a40ed3dSBarry Smith typedef struct  {
6120e33f6ddSBarry Smith   const char      *function[PETSCSTACKSIZE];
6130e33f6ddSBarry Smith   const char      *file[PETSCSTACKSIZE];
614184914b5SBarry Smith         int       line[PETSCSTACKSIZE];
615a8d2bbe5SBarry Smith         PetscBool petscroutine[PETSCSTACKSIZE];
616184914b5SBarry Smith         int       currentsize;
617a2f94806SJed Brown         int       hotdepth;
6183a40ed3dSBarry Smith } PetscStack;
6193a40ed3dSBarry Smith 
6201f46d60fSShri Abhyankar PETSC_EXTERN PetscStack *petscstack;
621184914b5SBarry Smith 
6226f5c2d7aSBarry Smith PetscErrorCode  PetscStackCopy(PetscStack*,PetscStack*);
6236f5c2d7aSBarry Smith PetscErrorCode  PetscStackPrint(PetscStack *,FILE*);
6242d7c6352SJed Brown #if defined(PETSC_USE_DEBUG)
625dbf62e16SBarry Smith PETSC_STATIC_INLINE PetscBool PetscStackActive(void)
626dbf62e16SBarry Smith {
6275c25fcd7SBarry Smith   return(petscstack ? PETSC_TRUE : PETSC_FALSE);
628dbf62e16SBarry Smith }
6293a40ed3dSBarry Smith 
630441dd030SJed Brown /* Stack handling is based on the following two "NoCheck" macros.  These should only be called directly by other error
631441dd030SJed Brown  * handling macros.  We record the line of the call, which may or may not be the location of the definition.  But is at
632441dd030SJed Brown  * least more useful than "unknown" because it can distinguish multiple calls from the same function.
633441dd030SJed Brown  */
634441dd030SJed Brown 
635a2f94806SJed Brown #define PetscStackPushNoCheck(funct,petsc_routine,hot)                        \
636441dd030SJed Brown   do {                                                                        \
637e04113cfSBarry Smith     PetscStackSAWsTakeAccess();                                                \
6385c25fcd7SBarry Smith     if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {         \
6395c25fcd7SBarry Smith       petscstack->function[petscstack->currentsize]  = funct;               \
6405c25fcd7SBarry Smith       petscstack->file[petscstack->currentsize]      = __FILE__;            \
6415c25fcd7SBarry Smith       petscstack->line[petscstack->currentsize]      = __LINE__;            \
6425c25fcd7SBarry Smith       petscstack->petscroutine[petscstack->currentsize] = petsc_routine;    \
6435c25fcd7SBarry Smith       petscstack->currentsize++;                                             \
644441dd030SJed Brown     }                                                                         \
6455c25fcd7SBarry Smith     if (petscstack) {                                                        \
6465c25fcd7SBarry Smith       petscstack->hotdepth += (hot || petscstack->hotdepth);                \
647a2f94806SJed Brown     }                                                                         \
648e04113cfSBarry Smith     PetscStackSAWsGrantAccess();                                               \
649441dd030SJed Brown   } while (0)
650441dd030SJed Brown 
651441dd030SJed Brown #define PetscStackPopNoCheck                                            \
6525c25fcd7SBarry Smith   do {                                                                  \
653e04113cfSBarry Smith     PetscStackSAWsTakeAccess();                                          \
6545c25fcd7SBarry Smith     if (petscstack && petscstack->currentsize > 0) {                  \
6555c25fcd7SBarry Smith       petscstack->currentsize--;                                       \
6565c25fcd7SBarry Smith       petscstack->function[petscstack->currentsize]  = 0;             \
6575c25fcd7SBarry Smith       petscstack->file[petscstack->currentsize]      = 0;             \
6585c25fcd7SBarry Smith       petscstack->line[petscstack->currentsize]      = 0;             \
6595c25fcd7SBarry Smith       petscstack->petscroutine[petscstack->currentsize] = PETSC_FALSE;\
660441dd030SJed Brown     }                                                                   \
6615c25fcd7SBarry Smith     if (petscstack) {                                                  \
6625c25fcd7SBarry Smith       petscstack->hotdepth = PetscMax(petscstack->hotdepth-1,0);      \
663a2f94806SJed Brown     }                                                                   \
664e04113cfSBarry Smith     PetscStackSAWsGrantAccess();                                         \
665441dd030SJed Brown   } while (0)
666441dd030SJed Brown 
66730de9b25SBarry Smith /*MC
6681957e957SBarry Smith    PetscFunctionBegin - First executable line of each PETSc function,  used for error handling. Final
6691957e957SBarry Smith       line of PETSc functions should be PetscFunctionReturn(0);
67030de9b25SBarry Smith 
67130de9b25SBarry Smith    Synopsis:
672aaa7dc30SBarry Smith    #include <petscsys.h>
67330de9b25SBarry Smith    void PetscFunctionBegin;
67430de9b25SBarry Smith 
675eca87e8dSBarry Smith    Not Collective
676eca87e8dSBarry Smith 
67730de9b25SBarry Smith    Usage:
67830de9b25SBarry Smith .vb
67930de9b25SBarry Smith      int something;
68030de9b25SBarry Smith 
68130de9b25SBarry Smith      PetscFunctionBegin;
68230de9b25SBarry Smith .ve
68330de9b25SBarry Smith 
68430de9b25SBarry Smith    Notes:
6851957e957SBarry Smith      Use PetscFunctionBeginUser for application codes.
6861957e957SBarry Smith 
68730de9b25SBarry Smith      Not available in Fortran
68830de9b25SBarry Smith 
68930de9b25SBarry Smith    Level: developer
69030de9b25SBarry Smith 
6911957e957SBarry Smith .seealso: PetscFunctionReturn(), PetscFunctionBeginHot(), PetscFunctionBeginUser()
69230de9b25SBarry Smith 
69330de9b25SBarry Smith .keywords: traceback, error handling
69430de9b25SBarry Smith M*/
695441dd030SJed Brown #define PetscFunctionBegin do {                                        \
696a2f94806SJed Brown     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE,PETSC_FALSE); \
697a2f94806SJed Brown     PetscRegister__FUNCT__();                                          \
698a2f94806SJed Brown   } while (0)
699a2f94806SJed Brown 
700a2f94806SJed Brown /*MC
701a2f94806SJed Brown    PetscFunctionBeginHot - Substitute for PetscFunctionBegin to be used in functions that are called in
702a2f94806SJed Brown    performance-critical circumstances.  Use of this function allows for lighter profiling by default.
703a2f94806SJed Brown 
704a2f94806SJed Brown    Synopsis:
705aaa7dc30SBarry Smith    #include <petscsys.h>
706a2f94806SJed Brown    void PetscFunctionBeginHot;
707a2f94806SJed Brown 
708a2f94806SJed Brown    Not Collective
709a2f94806SJed Brown 
710a2f94806SJed Brown    Usage:
711a2f94806SJed Brown .vb
712a2f94806SJed Brown      int something;
713a2f94806SJed Brown 
714a2f94806SJed Brown      PetscFunctionBeginHot;
715a2f94806SJed Brown .ve
716a2f94806SJed Brown 
717a2f94806SJed Brown    Notes:
718a2f94806SJed Brown      Not available in Fortran
719a2f94806SJed Brown 
720a2f94806SJed Brown    Level: developer
721a2f94806SJed Brown 
722a2f94806SJed Brown .seealso: PetscFunctionBegin, PetscFunctionReturn()
723a2f94806SJed Brown 
724a2f94806SJed Brown .keywords: traceback, error handling
725a2f94806SJed Brown M*/
726a2f94806SJed Brown #define PetscFunctionBeginHot do {                                     \
727a2f94806SJed Brown     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE,PETSC_TRUE);  \
7282d53ad75SBarry Smith     PetscRegister__FUNCT__();                                          \
72953c77d0aSJed Brown   } while (0)
73053c77d0aSJed Brown 
731a8d2bbe5SBarry Smith /*MC
732a8d2bbe5SBarry Smith    PetscFunctionBeginUser - First executable line of user provided PETSc routine
733a8d2bbe5SBarry Smith 
734a8d2bbe5SBarry Smith    Synopsis:
735aaa7dc30SBarry Smith    #include <petscsys.h>
736a8d2bbe5SBarry Smith    void PetscFunctionBeginUser;
737a8d2bbe5SBarry Smith 
738a8d2bbe5SBarry Smith    Not Collective
739a8d2bbe5SBarry Smith 
740a8d2bbe5SBarry Smith    Usage:
741a8d2bbe5SBarry Smith .vb
742a8d2bbe5SBarry Smith      int something;
743a8d2bbe5SBarry Smith 
744ac285190SBarry Smith      PetscFunctionBeginUser;
745a8d2bbe5SBarry Smith .ve
746a8d2bbe5SBarry Smith 
747a8d2bbe5SBarry Smith    Notes:
7481957e957SBarry Smith       Final line of PETSc functions should be PetscFunctionReturn(0) except for main().
7491957e957SBarry Smith 
750a8d2bbe5SBarry Smith       Not available in Fortran
751a8d2bbe5SBarry Smith 
752ac285190SBarry Smith       This is identical to PetscFunctionBegin except it labels the routine as a user
753ac285190SBarry Smith       routine instead of as a PETSc library routine.
754ac285190SBarry Smith 
755a2f94806SJed Brown    Level: intermediate
756a8d2bbe5SBarry Smith 
757a2f94806SJed Brown .seealso: PetscFunctionReturn(), PetscFunctionBegin, PetscFunctionBeginHot
758a8d2bbe5SBarry Smith 
759a8d2bbe5SBarry Smith .keywords: traceback, error handling
760a8d2bbe5SBarry Smith M*/
761a8d2bbe5SBarry Smith #define PetscFunctionBeginUser                                          \
762a8d2bbe5SBarry Smith   do {                                                                  \
763a2f94806SJed Brown     PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_FALSE,PETSC_FALSE); \
764a8d2bbe5SBarry Smith     PetscRegister__FUNCT__();                                           \
765a8d2bbe5SBarry Smith   } while (0)
766a8d2bbe5SBarry Smith 
767a8d2bbe5SBarry Smith 
7682d53ad75SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS)
769af0996ceSBarry Smith #include <petsc/private/petscfptimpl.h>
7702d53ad75SBarry Smith /*
7712d53ad75SBarry Smith    Registers the current function into the global function pointer to function name table
7722d53ad75SBarry Smith 
7732d53ad75SBarry Smith    Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc
7742d53ad75SBarry Smith */
7752d53ad75SBarry Smith #define PetscRegister__FUNCT__() do { \
7762d53ad75SBarry Smith   static PetscBool __chked = PETSC_FALSE; \
7772d53ad75SBarry Smith   if (!__chked) {\
778fbfcfee5SBarry Smith   void *ptr; PetscDLSym(NULL,PETSC_FUNCTION_NAME,&ptr);\
7792d53ad75SBarry Smith   __chked = PETSC_TRUE;\
7802d53ad75SBarry Smith   }} while (0)
7812d53ad75SBarry Smith #else
7822d53ad75SBarry Smith #define PetscRegister__FUNCT__()
7832d53ad75SBarry Smith #endif
7842d53ad75SBarry Smith 
7855cd90555SBarry Smith #define PetscStackPush(n) \
78661d886c9SShri Abhyankar   do {                                                                  \
787a2f94806SJed Brown     PetscStackPushNoCheck(n,PETSC_FALSE,PETSC_FALSE);                   \
78815681b3cSBarry Smith     CHKMEMQ;                                                            \
78915681b3cSBarry Smith   } while (0)
7903a40ed3dSBarry Smith 
791d64ed03dSBarry Smith #define PetscStackPop                           \
792441dd030SJed Brown     do {                                        \
793441dd030SJed Brown       CHKMEMQ;                                  \
794441dd030SJed Brown       PetscStackPopNoCheck;                     \
79515681b3cSBarry Smith     } while (0)
796d64ed03dSBarry Smith 
79730de9b25SBarry Smith /*MC
79830de9b25SBarry Smith    PetscFunctionReturn - Last executable line of each PETSc function
79930de9b25SBarry Smith         used for error handling. Replaces return()
80030de9b25SBarry Smith 
80130de9b25SBarry Smith    Synopsis:
802aaa7dc30SBarry Smith    #include <petscsys.h>
80330de9b25SBarry Smith    void PetscFunctionReturn(0);
80430de9b25SBarry Smith 
805eca87e8dSBarry Smith    Not Collective
806eca87e8dSBarry Smith 
80730de9b25SBarry Smith    Usage:
80830de9b25SBarry Smith .vb
80930de9b25SBarry Smith     ....
81030de9b25SBarry Smith      PetscFunctionReturn(0);
81130de9b25SBarry Smith    }
81230de9b25SBarry Smith .ve
81330de9b25SBarry Smith 
81430de9b25SBarry Smith    Notes:
81530de9b25SBarry Smith      Not available in Fortran
81630de9b25SBarry Smith 
81730de9b25SBarry Smith    Level: developer
81830de9b25SBarry Smith 
81930de9b25SBarry Smith .seealso: PetscFunctionBegin()
82030de9b25SBarry Smith 
82130de9b25SBarry Smith .keywords: traceback, error handling
82230de9b25SBarry Smith M*/
8235cd90555SBarry Smith #define PetscFunctionReturn(a) \
8248246ba0dSJed Brown   do {                                                                \
825441dd030SJed Brown     PetscStackPopNoCheck;                                             \
8268246ba0dSJed Brown     return(a);} while (0)
827d64ed03dSBarry Smith 
828ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \
8298246ba0dSJed Brown   do {                                                                \
830441dd030SJed Brown     PetscStackPopNoCheck;                                             \
8318246ba0dSJed Brown     return;} while (0)
83276386721SLisandro Dalcin 
8336d385327SIbrahima Ba #else
8346d385327SIbrahima Ba 
835c82b4e47SJed Brown PETSC_STATIC_INLINE PetscBool PetscStackActive(void) {return PETSC_FALSE;}
836a2f94806SJed Brown #define PetscStackPushNoCheck(funct,petsc_routine,hot) do {} while (0)
837441dd030SJed Brown #define PetscStackPopNoCheck                           do {} while (0)
8383a40ed3dSBarry Smith #define PetscFunctionBegin
8390bdf7c52SPeter Brune #define PetscFunctionBeginUser
840a2f94806SJed Brown #define PetscFunctionBeginHot
8413a40ed3dSBarry Smith #define PetscFunctionReturn(a)    return(a)
8425665465eSBarry Smith #define PetscFunctionReturnVoid() return
843812af9f3SBarry Smith #define PetscStackPop             CHKMEMQ
844812af9f3SBarry Smith #define PetscStackPush(f)         CHKMEMQ
8453a40ed3dSBarry Smith 
8463a40ed3dSBarry Smith #endif
8473a40ed3dSBarry Smith 
848eb6b5d47SBarry Smith /*
849eb6b5d47SBarry Smith     PetscStackCall - Calls an external library routine or user function after pushing the name of the routine on the stack.
850eb6b5d47SBarry Smith 
851eb6b5d47SBarry Smith    Input Parameters:
852eb6b5d47SBarry Smith +   name - string that gives the name of the function being called
853fd3f9acdSBarry Smith -   routine - actual call to the routine, including ierr = and CHKERRQ(ierr);
854fd3f9acdSBarry Smith 
855dbf62e16SBarry Smith    Note: Often one should use PetscStackCallStandard() instead. This routine is intended for external library routines that DO NOT return error codes
856eb6b5d47SBarry Smith 
857eb6b5d47SBarry Smith    Developer Note: this is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc.
858eb6b5d47SBarry Smith 
859fd3f9acdSBarry Smith 
860fd3f9acdSBarry Smith 
861eb6b5d47SBarry Smith */
86230ecc5abSKarl Rupp #define PetscStackCall(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while(0)
863eb6b5d47SBarry Smith 
864fd3f9acdSBarry Smith /*
865fd3f9acdSBarry Smith     PetscStackCallStandard - Calls an external library routine after pushing the name of the routine on the stack.
866fd3f9acdSBarry Smith 
867fd3f9acdSBarry Smith    Input Parameters:
868fd3f9acdSBarry Smith +   func-  name of the routine
869fd3f9acdSBarry Smith -   args - arguments to the routine surrounded by ()
870fd3f9acdSBarry Smith 
871dbf62e16SBarry Smith    Notes: This is intended for external package routines that return error codes. Use PetscStackCall() for those that do not.
872dbf62e16SBarry Smith 
873dbf62e16SBarry Smith    Developer Note: this is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc.
874fd3f9acdSBarry Smith 
875fd3f9acdSBarry Smith */
876fd3f9acdSBarry Smith #define PetscStackCallStandard(func,args) do {                        \
8777afcd97cSStefano Zampini     PetscStackPush(#func);ierr = func args;PetscStackPop; if (ierr) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s(): error code %d",#func,(int)ierr); \
878fd3f9acdSBarry Smith   } while (0)
879fd3f9acdSBarry Smith 
880014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackCreate(void);
881639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscStackView(FILE*);
882014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackDestroy(void);
88306d1fe2cSBarry Smith 
88406d1fe2cSBarry Smith #endif
885