xref: /petsc/include/petscerror.h (revision 6849ba73f22fecb8f92ef896a42e4e8bd4cd6965)
154a8ef01SBarry Smith /*
24f227f7cSBarry Smith     Contains all error handling code for PETSc.
354a8ef01SBarry Smith */
445d48df9SBarry Smith #if !defined(__PETSCERROR_H)
545d48df9SBarry Smith #define __PETSCERROR_H
6c22c1629SBarry Smith #include "petsc.h"
7e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
8c22c1629SBarry Smith 
9aa482453SBarry Smith #if defined(PETSC_HAVE_AMS)
106d385327SIbrahima Ba #include "ams.h"
116d385327SIbrahima Ba #endif
126d385327SIbrahima Ba 
1354a8ef01SBarry Smith /*
1454a8ef01SBarry Smith    Defines the directory where the compiled source is located; used
155e97870eSBarry Smith    in printing error messages. Each makefile has an entry
165e97870eSBarry Smith    LOCDIR	  =  thedirectory
170cd5afcaSLois Curfman McInnes    and bmake/common_variables includes in CCPPFLAGS -D__SDIR__='"${LOCDIR}"'
185e97870eSBarry Smith    which is a flag passed to the C/C++ compilers.
1954a8ef01SBarry Smith */
20c22c1629SBarry Smith #if !defined(__SDIR__)
212ee1dbe0SBarry Smith #define __SDIR__ "unknowndirectory/"
2254a8ef01SBarry Smith #endif
2354a8ef01SBarry Smith 
2454a8ef01SBarry Smith /*
254f227f7cSBarry Smith    Defines the function where the compiled source is located; used
264f227f7cSBarry Smith    in printing error messages.
274f227f7cSBarry Smith */
284a2ae208SSatish Balay #if !defined(__FUNCT__)
29da9b6338SBarry Smith #define __FUNCT__ "User provided function"
304f227f7cSBarry Smith #endif
314f227f7cSBarry Smith 
324f227f7cSBarry Smith /*
33329ffe3dSLois Curfman McInnes      These are the generic error codes. These error codes are used
34e2d1d2b7SBarry Smith      many different places in the PETSc source code. The string versions are
35e2d1d2b7SBarry Smith      at src/sys/src/error/err.c any changes here must also be made there
3645d48df9SBarry Smith 
3754a8ef01SBarry Smith */
3845d48df9SBarry Smith #define PETSC_ERR_MEM              55   /* unable to allocate requested memory */
39106f7b34SBarry Smith #define PETSC_ERR_MEM_MALLOC_0     85   /* cannot malloc zero size */
4047794344SBarry Smith #define PETSC_ERR_SUP              56   /* no support for requested operation */
41e2d1d2b7SBarry Smith #define PETSC_ERR_SUP_SYS          57   /* no support for requested operation on this computer system */
42e2d1d2b7SBarry Smith #define PETSC_ERR_ORDER            58   /* operation done in wrong order */
4345d48df9SBarry Smith #define PETSC_ERR_SIG              59   /* signal received */
44f1caa5a4SBarry Smith #define PETSC_ERR_FP               72   /* floating point exception */
45a8c6a408SBarry Smith #define PETSC_ERR_COR              74   /* corrupted PETSc object */
46a8c6a408SBarry Smith #define PETSC_ERR_LIB              76   /* error in library called by PETSc */
47329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB             77   /* PETSc library generated inconsistent data */
48329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC             78   /* memory corruption */
49b3cc6726SBarry Smith #define PETSC_ERR_CONV_FAILED      82   /* iterative method (KSP or SNES) failed */
5045d48df9SBarry Smith 
5145d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ          60   /* nonconforming object sizes used in operation */
5245d48df9SBarry Smith #define PETSC_ERR_ARG_IDN          61   /* two arguments not allowed to be the same */
53a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG        62   /* wrong argument (but object probably ok) */
5445d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT      64   /* null or corrupted PETSc object as argument */
5545d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE   63   /* input argument, out of range */
564f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR       68   /* invalid pointer argument */
574f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE  69   /* two args must be same object type */
586831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM  80   /* two args must be same communicators */
59d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE   73   /* object in argument is in wrong state, e.g. unassembled mat */
60a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP       75   /* two arguments are incompatible */
614482741eSBarry Smith #define PETSC_ERR_ARG_NULL         85   /* argument is null that should not be */
62958c9bccSBarry Smith #define PETSC_ERR_ARG_UNKNOWN_TYPE 86  /* type name doesn't match any registered type */
634f227f7cSBarry Smith 
644f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN        65   /* unable to open file */
654f227f7cSBarry Smith #define PETSC_ERR_FILE_READ        66   /* unable to read from file */
664f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE       67   /* unable to write to file */
67a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED  79   /* unexpected data in file */
6845d48df9SBarry Smith 
69329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT     71   /* detected a zero pivot during LU factorization */
709e3b2f23SBarry Smith #define PETSC_ERR_MAT_CH_ZRPVT     81   /* detected a zero pivot during Cholesky factorization */
7154a8ef01SBarry Smith 
72aa482453SBarry Smith #if defined(PETSC_USE_DEBUG)
7330de9b25SBarry Smith 
7430de9b25SBarry Smith /*MC
7530de9b25SBarry Smith    SETERRQ - Macro that is called when an error has been detected,
7630de9b25SBarry Smith 
7730de9b25SBarry Smith    Not Collective
7830de9b25SBarry Smith 
7930de9b25SBarry Smith    Synopsis:
8030de9b25SBarry Smith    void SETERRQ(int errorcode,char *message)
8130de9b25SBarry Smith 
8230de9b25SBarry Smith 
8330de9b25SBarry Smith    Input Parameters:
8430de9b25SBarry Smith +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
8530de9b25SBarry Smith -  message - error message
8630de9b25SBarry Smith 
8730de9b25SBarry Smith   Level: beginner
8830de9b25SBarry Smith 
8930de9b25SBarry Smith    Notes:
9030de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
9130de9b25SBarry Smith 
9230de9b25SBarry Smith     See SETERRQ1(), SETERRQ2(), SETERRQ3() for versions that take arguments
9330de9b25SBarry Smith 
9430de9b25SBarry Smith 
9530de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
9630de9b25SBarry Smith 
9730de9b25SBarry Smith    Concepts: error^setting condition
9830de9b25SBarry Smith 
9991d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3()
10030de9b25SBarry Smith M*/
1014a2ae208SSatish Balay #define SETERRQ(n,s)              {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s);}
10230de9b25SBarry Smith 
10330de9b25SBarry Smith /*MC
10430de9b25SBarry Smith    SETERRQ1 - Macro that is called when an error has been detected,
10530de9b25SBarry Smith 
10630de9b25SBarry Smith    Not Collective
10730de9b25SBarry Smith 
10830de9b25SBarry Smith    Synopsis:
10930de9b25SBarry Smith    void SETERRQ1(int errorcode,char *formatmessage,arg)
11030de9b25SBarry Smith 
11130de9b25SBarry Smith 
11230de9b25SBarry Smith    Input Parameters:
11330de9b25SBarry Smith +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
11430de9b25SBarry Smith .  message - error message in the printf format
11530de9b25SBarry Smith -  arg - argument (for example an integer, string or double)
11630de9b25SBarry Smith 
11730de9b25SBarry Smith   Level: beginner
11830de9b25SBarry Smith 
11930de9b25SBarry Smith    Notes:
12030de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
12130de9b25SBarry Smith 
12230de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
12330de9b25SBarry Smith 
12430de9b25SBarry Smith    Concepts: error^setting condition
12530de9b25SBarry Smith 
12691d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ(), SETERRQ2(), SETERRQ3()
12730de9b25SBarry Smith M*/
1284a2ae208SSatish Balay #define SETERRQ1(n,s,a1)          {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1);}
12930de9b25SBarry Smith 
13030de9b25SBarry Smith /*MC
13130de9b25SBarry Smith    SETERRQ2 - Macro that is called when an error has been detected,
13230de9b25SBarry Smith 
13330de9b25SBarry Smith    Not Collective
13430de9b25SBarry Smith 
13530de9b25SBarry Smith    Synopsis:
13630de9b25SBarry Smith    void SETERRQ2(int errorcode,char *formatmessage,arg1,arg2)
13730de9b25SBarry Smith 
13830de9b25SBarry Smith 
13930de9b25SBarry Smith    Input Parameters:
14030de9b25SBarry Smith +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
14130de9b25SBarry Smith .  message - error message in the printf format
14230de9b25SBarry Smith .  arg1 - argument (for example an integer, string or double)
14330de9b25SBarry Smith -  arg2 - argument (for example an integer, string or double)
14430de9b25SBarry Smith 
14530de9b25SBarry Smith   Level: beginner
14630de9b25SBarry Smith 
14730de9b25SBarry Smith    Notes:
14830de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
14930de9b25SBarry Smith 
15030de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
15130de9b25SBarry Smith 
15230de9b25SBarry Smith    Concepts: error^setting condition
15330de9b25SBarry Smith 
15491d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3()
15530de9b25SBarry Smith M*/
1564a2ae208SSatish Balay #define SETERRQ2(n,s,a1,a2)       {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2);}
15730de9b25SBarry Smith 
15830de9b25SBarry Smith /*MC
15930de9b25SBarry Smith    SETERRQ3 - Macro that is called when an error has been detected,
16030de9b25SBarry Smith 
16130de9b25SBarry Smith    Not Collective
16230de9b25SBarry Smith 
16330de9b25SBarry Smith    Synopsis:
16430de9b25SBarry Smith    void SETERRQ3(int errorcode,char *formatmessage,arg1,arg2,arg3)
16530de9b25SBarry Smith 
16630de9b25SBarry Smith 
16730de9b25SBarry Smith    Input Parameters:
16830de9b25SBarry Smith +  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
16930de9b25SBarry Smith .  message - error message in the printf format
17030de9b25SBarry Smith .  arg1 - argument (for example an integer, string or double)
17130de9b25SBarry Smith .  arg2 - argument (for example an integer, string or double)
17230de9b25SBarry Smith -  arg3 - argument (for example an integer, string or double)
17330de9b25SBarry Smith 
17430de9b25SBarry Smith   Level: beginner
17530de9b25SBarry Smith 
17630de9b25SBarry Smith    Notes:
17730de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
17830de9b25SBarry Smith 
17930de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
18030de9b25SBarry Smith 
18130de9b25SBarry Smith    Concepts: error^setting condition
18230de9b25SBarry Smith 
18391d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2()
18430de9b25SBarry Smith M*/
1854a2ae208SSatish Balay #define SETERRQ3(n,s,a1,a2,a3)    {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3);}
18630de9b25SBarry Smith 
1874a2ae208SSatish Balay #define SETERRQ4(n,s,a1,a2,a3,a4) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4);}
188a30c184eSMatthew Knepley #define SETERRQ5(n,s,a1,a2,a3,a4,a5)       {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4,a5);}
189a30c184eSMatthew Knepley #define SETERRQ6(n,s,a1,a2,a3,a4,a5,a6)    {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4,a5,a6);}
190a30c184eSMatthew Knepley #define SETERRQ7(n,s,a1,a2,a3,a4,a5,a6,a7) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4,a5,a6,a7);}
191e855a17bSBarry Smith #define SETERRABORT(comm,n,s)     {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s);MPI_Abort(comm,n);}
1929a00fa46SSatish Balay 
19330de9b25SBarry Smith /*MC
19430de9b25SBarry Smith    CHKERRQ - Checks error code, if non-zero it calls the error handler and then returns
19530de9b25SBarry Smith 
19630de9b25SBarry Smith    Not Collective
19730de9b25SBarry Smith 
19830de9b25SBarry Smith    Synopsis:
19930de9b25SBarry Smith    void CHKERRQ(int errorcode)
20030de9b25SBarry Smith 
20130de9b25SBarry Smith 
20230de9b25SBarry Smith    Input Parameters:
20330de9b25SBarry Smith .  errorcode - nonzero error code, see the list of standard error codes in include/petscerror.h
20430de9b25SBarry Smith 
20530de9b25SBarry Smith   Level: beginner
20630de9b25SBarry Smith 
20730de9b25SBarry Smith    Notes:
20830de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
20930de9b25SBarry Smith 
21030de9b25SBarry Smith    Experienced users can set the error handler with PetscPushErrorHandler().
21130de9b25SBarry Smith 
21230de9b25SBarry Smith    Concepts: error^setting condition
21330de9b25SBarry Smith 
21491d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2()
21530de9b25SBarry Smith M*/
216c3be3f59SMatthew Knepley #define CHKERRQ(n)             if (n) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0," ");}
21730de9b25SBarry Smith 
21894a56cdfSMatthew Knepley #define CHKERRABORT(comm,n)    if (n) {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0," ");MPI_Abort(comm,n);}
21994a56cdfSMatthew Knepley #define CHKERRCONTINUE(n)      if (n) {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0," ");}
22085614651SBarry Smith 
22130de9b25SBarry Smith /*MC
22230de9b25SBarry Smith    CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected
22330de9b25SBarry Smith 
22430de9b25SBarry Smith    Not Collective
22530de9b25SBarry Smith 
22630de9b25SBarry Smith    Synopsis:
22791d3bdf4SKris Buschelman    CHKMEMQ;
22830de9b25SBarry Smith 
22930de9b25SBarry Smith   Level: beginner
23030de9b25SBarry Smith 
23130de9b25SBarry Smith    Notes:
23230de9b25SBarry Smith     Must run with the option -trdebug to enable this option
23330de9b25SBarry Smith 
23430de9b25SBarry Smith     Once the error handler is called the calling function is then returned from with the given error code.
23530de9b25SBarry Smith 
23630de9b25SBarry Smith     By defaults prints location where memory that is corrupted was allocated.
23730de9b25SBarry Smith 
23830de9b25SBarry Smith    Concepts: memory corruption
23930de9b25SBarry Smith 
24091d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2(),
24130de9b25SBarry Smith           PetscTrValid()
24230de9b25SBarry Smith M*/
243ef66eb69SBarry Smith #define CHKMEMQ {int _7_ierr = PetscTrValid(__LINE__,__FUNCT__,__FILE__,__SDIR__);CHKERRQ(_7_ierr);}
24485614651SBarry Smith 
245f1af5d2fSBarry Smith #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
246*6849ba73SBarry Smith extern  PetscErrorCode __gierr;
247f1af5d2fSBarry Smith #define _   __gierr =
248ac355199SBarry Smith #define ___  CHKERRQ(__gierr);
249f1af5d2fSBarry Smith #endif
250f1af5d2fSBarry Smith 
25154a8ef01SBarry Smith #else
25290d37a7cSBarry Smith #define SETERRQ(n,s) ;
25390d37a7cSBarry Smith #define SETERRQ1(n,s,a1) ;
25490d37a7cSBarry Smith #define SETERRQ2(n,s,a1,a2) ;
25590d37a7cSBarry Smith #define SETERRQ3(n,s,a1,a2,a3) ;
25690d37a7cSBarry Smith #define SETERRQ4(n,s,a1,a2,a3,a4) ;
2571ee4faa0SMatthew Knepley #define SETERRABORT(comm,n,s) ;
25885614651SBarry Smith 
2594f227f7cSBarry Smith #define CHKERRQ(n)     ;
2601ee4faa0SMatthew Knepley #define CHKERRABORT(comm,n) ;
2611ee4faa0SMatthew Knepley #define CHKERRCONTINUE(n) ;
26285614651SBarry Smith 
26385614651SBarry Smith #define CHKMEMQ        ;
26485614651SBarry Smith 
265f1af5d2fSBarry Smith #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
266f1af5d2fSBarry Smith #define _
267f1af5d2fSBarry Smith #define ___
268f1af5d2fSBarry Smith #endif
269f1af5d2fSBarry Smith 
27054a8ef01SBarry Smith #endif
27154a8ef01SBarry Smith 
272dfbe8321SBarry Smith EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **);
273dfbe8321SBarry Smith EXTERN PetscErrorCode PetscTraceBackErrorHandler(int,const char*,const char*,const char*,int,int,const char*,void*);
274dfbe8321SBarry Smith EXTERN PetscErrorCode PetscIgnoreErrorHandler(int,const char*,const char*,const char*,int,int,const char*,void*);
275dfbe8321SBarry Smith EXTERN PetscErrorCode PetscEmacsClientErrorHandler(int,const char*,const char*,const char*,int,int,const char*,void*);
276dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStopErrorHandler(int,const char*,const char*,const char*,int,int,const char*,void*);
277dfbe8321SBarry Smith EXTERN PetscErrorCode PetscAbortErrorHandler(int,const char*,const char*,const char*,int,int,const char*,void*);
278dfbe8321SBarry Smith EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(int,const char*,const char*,const char*,int,int,const char*,void*);
279dfbe8321SBarry Smith EXTERN PetscErrorCode PetscError(int,const char*,const char*,const char*,int,int,const char*,...) PETSC_PRINTF_FORMAT_CHECK(7,8);
280*6849ba73SBarry Smith EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(int,const char*,const char*,const char*,int,int,const char*,void*),void*);
281dfbe8321SBarry Smith EXTERN PetscErrorCode PetscPopErrorHandler(void);
282dfbe8321SBarry Smith EXTERN PetscErrorCode PetscDefaultSignalHandler(int,void*);
283*6849ba73SBarry Smith EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*);
284dfbe8321SBarry Smith EXTERN PetscErrorCode PetscPopSignalHandler(void);
285329f5518SBarry Smith 
286329f5518SBarry Smith typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap;
287dfbe8321SBarry Smith EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap);
28854a8ef01SBarry Smith 
2893a40ed3dSBarry Smith /*
2903a40ed3dSBarry Smith       Allows the code to build a stack frame as it runs
2913a40ed3dSBarry Smith */
292aa482453SBarry Smith #if defined(PETSC_USE_STACK)
2933a40ed3dSBarry Smith 
294184914b5SBarry Smith #define PETSCSTACKSIZE 15
295184914b5SBarry Smith 
2963a40ed3dSBarry Smith typedef struct  {
2970e33f6ddSBarry Smith   const char *function[PETSCSTACKSIZE];
2980e33f6ddSBarry Smith   const char *file[PETSCSTACKSIZE];
2990e33f6ddSBarry Smith   const char *directory[PETSCSTACKSIZE];
300184914b5SBarry Smith         int  line[PETSCSTACKSIZE];
301184914b5SBarry Smith         int currentsize;
3023a40ed3dSBarry Smith } PetscStack;
3033a40ed3dSBarry Smith 
3043a40ed3dSBarry Smith extern PetscStack *petscstack;
305dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackCopy(PetscStack*,PetscStack*);
306dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackPrint(PetscStack*,FILE* fp);
307184914b5SBarry Smith 
308184914b5SBarry Smith #define PetscStackActive (petscstack != 0)
3093a40ed3dSBarry Smith 
310aa482453SBarry Smith #if !defined(PETSC_HAVE_AMS)
3116d385327SIbrahima Ba 
31230de9b25SBarry Smith /*MC
31330de9b25SBarry Smith    PetscFunctionBegin - First executable line of each PETSc function
31430de9b25SBarry Smith         used for error handling.
31530de9b25SBarry Smith 
31630de9b25SBarry Smith    Synopsis:
31730de9b25SBarry Smith    void PetscFunctionBegin;
31830de9b25SBarry Smith 
31930de9b25SBarry Smith    Usage:
32030de9b25SBarry Smith .vb
32130de9b25SBarry Smith      int something;
32230de9b25SBarry Smith 
32330de9b25SBarry Smith      PetscFunctionBegin;
32430de9b25SBarry Smith .ve
32530de9b25SBarry Smith 
32630de9b25SBarry Smith    Notes:
32730de9b25SBarry Smith      Not available in Fortran
32830de9b25SBarry Smith 
32930de9b25SBarry Smith    Level: developer
33030de9b25SBarry Smith 
33130de9b25SBarry Smith .seealso: PetscFunctionReturn()
33230de9b25SBarry Smith 
33330de9b25SBarry Smith .keywords: traceback, error handling
33430de9b25SBarry Smith M*/
3353a40ed3dSBarry Smith #define PetscFunctionBegin \
336beb17490SBarry Smith   {\
337184914b5SBarry Smith    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
3384a2ae208SSatish Balay     petscstack->function[petscstack->currentsize]  = __FUNCT__; \
339184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = __FILE__; \
340184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = __SDIR__; \
341184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = __LINE__; \
342184914b5SBarry Smith     petscstack->currentsize++; \
3433a40ed3dSBarry Smith   }}
3443a40ed3dSBarry Smith 
3455cd90555SBarry Smith #define PetscStackPush(n) \
346184914b5SBarry Smith   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
347184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = n; \
348184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = "unknown"; \
349184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = "unknown"; \
350184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
351184914b5SBarry Smith     petscstack->currentsize++; \
3525cd90555SBarry Smith   }}
3533a40ed3dSBarry Smith 
354d64ed03dSBarry Smith #define PetscStackPop \
355184914b5SBarry Smith   {if (petscstack && petscstack->currentsize > 0) {     \
356184914b5SBarry Smith     petscstack->currentsize--; \
357184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = 0; \
358184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = 0; \
359184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = 0; \
360184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
3615cd90555SBarry Smith   }};
362d64ed03dSBarry Smith 
36330de9b25SBarry Smith /*MC
36430de9b25SBarry Smith    PetscFunctionReturn - Last executable line of each PETSc function
36530de9b25SBarry Smith         used for error handling. Replaces return()
36630de9b25SBarry Smith 
36730de9b25SBarry Smith    Synopsis:
36830de9b25SBarry Smith    void PetscFunctionReturn(0);
36930de9b25SBarry Smith 
37030de9b25SBarry Smith    Usage:
37130de9b25SBarry Smith .vb
37230de9b25SBarry Smith     ....
37330de9b25SBarry Smith      PetscFunctionReturn(0);
37430de9b25SBarry Smith    }
37530de9b25SBarry Smith .ve
37630de9b25SBarry Smith 
37730de9b25SBarry Smith    Notes:
37830de9b25SBarry Smith      Not available in Fortran
37930de9b25SBarry Smith 
38030de9b25SBarry Smith    Level: developer
38130de9b25SBarry Smith 
38230de9b25SBarry Smith .seealso: PetscFunctionBegin()
38330de9b25SBarry Smith 
38430de9b25SBarry Smith .keywords: traceback, error handling
38530de9b25SBarry Smith M*/
3865cd90555SBarry Smith #define PetscFunctionReturn(a) \
387beb17490SBarry Smith   {\
38806d1fe2cSBarry Smith   PetscStackPop; \
3895cd90555SBarry Smith   return(a);}
390d64ed03dSBarry Smith 
391ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \
392ff94ddecSSatish Balay   {\
3931fceb228SKris Buschelman   PetscStackPop; \
3941fceb228SKris Buschelman   return;}
395ff94ddecSSatish Balay 
3963a40ed3dSBarry Smith #else
3973a40ed3dSBarry Smith 
39806d1fe2cSBarry Smith /*
39906d1fe2cSBarry Smith     Duplicate Code for when the ALICE Memory Snooper (AMS)
400aa482453SBarry Smith   is being used. When PETSC_HAVE_AMS is defined.
40106d1fe2cSBarry Smith 
40206d1fe2cSBarry Smith      stack_mem is the AMS memory that contains fields for the
40306d1fe2cSBarry Smith                number of stack frames and names of the stack frames
40406d1fe2cSBarry Smith */
40506d1fe2cSBarry Smith 
4066d385327SIbrahima Ba extern AMS_Memory stack_mem;
40706d1fe2cSBarry Smith extern int        stack_err;
4086d385327SIbrahima Ba 
4096d385327SIbrahima Ba #define PetscFunctionBegin \
410beb17490SBarry Smith   {\
411184914b5SBarry Smith    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
41206d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
4134a2ae208SSatish Balay     petscstack->function[petscstack->currentsize]  = __FUNCT__; \
414184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = __FILE__; \
415184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = __SDIR__; \
416184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = __LINE__; \
417184914b5SBarry Smith     petscstack->currentsize++; \
41806d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
4196d385327SIbrahima Ba   }}
4206d385327SIbrahima Ba 
4216d385327SIbrahima Ba #define PetscStackPush(n) \
422184914b5SBarry Smith   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
42306d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
424184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = n; \
425184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = "unknown"; \
426184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = "unknown"; \
427184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
428184914b5SBarry Smith     petscstack->currentsize++; \
42906d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
4306d385327SIbrahima Ba   }}
4316d385327SIbrahima Ba 
4326d385327SIbrahima Ba #define PetscStackPop \
433184914b5SBarry Smith   {if (petscstack && petscstack->currentsize > 0) {     \
43406d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
435184914b5SBarry Smith     petscstack->currentsize--; \
436184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = 0; \
437184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = 0; \
438184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = 0; \
439184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
44006d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
4416d385327SIbrahima Ba   }};
4426d385327SIbrahima Ba 
4436d385327SIbrahima Ba #define PetscFunctionReturn(a) \
444beb17490SBarry Smith   {\
44506d1fe2cSBarry Smith   PetscStackPop; \
4466d385327SIbrahima Ba   return(a);}
4476d385327SIbrahima Ba 
448ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \
449ff94ddecSSatish Balay   {\
4501fceb228SKris Buschelman   PetscStackPop; \
4511fceb228SKris Buschelman   return;}
452ff94ddecSSatish Balay 
453ff94ddecSSatish Balay 
4546d385327SIbrahima Ba #endif
4556d385327SIbrahima Ba 
4566d385327SIbrahima Ba #else
4576d385327SIbrahima Ba 
4583a40ed3dSBarry Smith #define PetscFunctionBegin
4593a40ed3dSBarry Smith #define PetscFunctionReturn(a)  return(a)
4601fceb228SKris Buschelman #define PetscFunctionReturnVoid() return()
461d64ed03dSBarry Smith #define PetscStackPop
462d64ed03dSBarry Smith #define PetscStackPush(f)
463d64ed03dSBarry Smith #define PetscStackActive        0
4643a40ed3dSBarry Smith 
4653a40ed3dSBarry Smith #endif
4663a40ed3dSBarry Smith 
467dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackCreate(void);
468dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackView(PetscViewer);
469dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackDestroy(void);
470dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackPublish(void);
471dfbe8321SBarry Smith EXTERN PetscErrorCode PetscStackDepublish(void);
4723a40ed3dSBarry Smith 
47306d1fe2cSBarry Smith 
474e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
47506d1fe2cSBarry Smith #endif
476