xref: /petsc/include/petscerror.h (revision 1da70330208b785a18786e73d2bf790403e16ba7)
1*1da70330SBarry Smith /* $Id: petscerror.h,v 1.55 2001/03/23 23:26:09 balay Exp bsmith $ */
254a8ef01SBarry Smith /*
34f227f7cSBarry Smith     Contains all error handling code for PETSc.
454a8ef01SBarry Smith */
545d48df9SBarry Smith #if !defined(__PETSCERROR_H)
645d48df9SBarry Smith #define __PETSCERROR_H
754a8ef01SBarry Smith 
8c22c1629SBarry Smith #include "petsc.h"
9c22c1629SBarry Smith 
10aa482453SBarry Smith #if defined(PETSC_HAVE_AMS)
116d385327SIbrahima Ba #include "ams.h"
126d385327SIbrahima Ba #endif
136d385327SIbrahima Ba 
1454a8ef01SBarry Smith /*
1554a8ef01SBarry Smith    Defines the directory where the compiled source is located; used
165e97870eSBarry Smith    in printing error messages. Each makefile has an entry
175e97870eSBarry Smith    LOCDIR	  =  thedirectory
180cd5afcaSLois Curfman McInnes    and bmake/common_variables includes in CCPPFLAGS -D__SDIR__='"${LOCDIR}"'
195e97870eSBarry Smith    which is a flag passed to the C/C++ compilers.
2054a8ef01SBarry Smith */
21c22c1629SBarry Smith #if !defined(__SDIR__)
222ee1dbe0SBarry Smith #define __SDIR__ "unknowndirectory/"
2354a8ef01SBarry Smith #endif
2454a8ef01SBarry Smith 
2554a8ef01SBarry Smith /*
264f227f7cSBarry Smith    Defines the function where the compiled source is located; used
274f227f7cSBarry Smith    in printing error messages.
284f227f7cSBarry Smith */
294a2ae208SSatish Balay #if !defined(__FUNCT__)
304a2ae208SSatish Balay #define __FUNCT__ "unknownfunction"
314f227f7cSBarry Smith #endif
324f227f7cSBarry Smith 
334f227f7cSBarry Smith /*
34329ffe3dSLois Curfman McInnes      These are the generic error codes. These error codes are used
35329ffe3dSLois Curfman McInnes      many different places in the PETSc source code.
3645d48df9SBarry Smith 
3754a8ef01SBarry Smith */
3845d48df9SBarry Smith #define PETSC_ERR_MEM             55   /* unable to allocate requested memory */
3947794344SBarry Smith #define PETSC_ERR_SUP             56   /* no support for requested operation */
4045d48df9SBarry Smith #define PETSC_ERR_SIG             59   /* signal received */
41f1caa5a4SBarry Smith #define PETSC_ERR_FP              72   /* floating point exception */
42a8c6a408SBarry Smith #define PETSC_ERR_COR             74   /* corrupted PETSc object */
43a8c6a408SBarry Smith #define PETSC_ERR_LIB             76   /* error in library called by PETSc */
44329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB            77   /* PETSc library generated inconsistent data */
45329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC            78   /* memory corruption */
4645d48df9SBarry Smith 
4745d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ         60   /* nonconforming object sizes used in operation */
4845d48df9SBarry Smith #define PETSC_ERR_ARG_IDN         61   /* two arguments not allowed to be the same */
49a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG       62   /* wrong argument (but object probably ok) */
5045d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT     64   /* null or corrupted PETSc object as argument */
5145d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE  63   /* input argument, out of range */
524f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR      68   /* invalid pointer argument */
534f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE 69   /* two args must be same object type */
546831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM 80   /* two args must be same communicators */
55d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE  73   /* object in argument is in wrong state, e.g. unassembled mat */
56a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP      75   /* two arguments are incompatible */
574f227f7cSBarry Smith 
584f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN       65   /* unable to open file */
594f227f7cSBarry Smith #define PETSC_ERR_FILE_READ       66   /* unable to read from file */
604f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE      67   /* unable to write to file */
61a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED 79   /* unexpected data in file */
6245d48df9SBarry Smith 
63329ffe3dSLois Curfman McInnes #define PETSC_ERR_KSP_BRKDWN      70   /* break down in a Krylov method */
644f227f7cSBarry Smith 
65329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT    71   /* detected a zero pivot during LU factorization */
669e3b2f23SBarry Smith #define PETSC_ERR_MAT_CH_ZRPVT    81   /* detected a zero pivot during Cholesky factorization */
6754a8ef01SBarry Smith 
68aa482453SBarry Smith #if defined(PETSC_USE_DEBUG)
694a2ae208SSatish Balay #define SETERRQ(n,s)              {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s);}
704a2ae208SSatish Balay #define SETERRQ1(n,s,a1)          {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1);}
714a2ae208SSatish Balay #define SETERRQ2(n,s,a1,a2)       {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2);}
724a2ae208SSatish Balay #define SETERRQ3(n,s,a1,a2,a3)    {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3);}
734a2ae208SSatish Balay #define SETERRQ4(n,s,a1,a2,a3,a4) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s,a1,a2,a3,a4);}
74*1da70330SBarry Smith #define SETERRABORT(n,s)          {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,1,s);MPI_Abort(n);}
759a00fa46SSatish Balay 
764a2ae208SSatish Balay #define CHKERRQ(n)        if (n) {return PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0,0);}
77*1da70330SBarry Smith #define CHKERRABORT(n)    if (n) {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0,0);MPI_Abort(n);}
78*1da70330SBarry Smith #define CHKERRCONTINUE(n) if (n) {PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,n,0,0);}
7985614651SBarry Smith 
804a2ae208SSatish Balay #define CHKMEMQ {int __ierr = PetscTrValid(__LINE__,__FUNCT__,__FILE__,__SDIR__);CHKERRQ(__ierr);}
8185614651SBarry Smith 
82f1af5d2fSBarry Smith #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
83f1af5d2fSBarry Smith extern  int __gierr;
84f1af5d2fSBarry Smith #define _   __gierr =
85ac355199SBarry Smith #define ___  CHKERRQ(__gierr);
86f1af5d2fSBarry Smith #endif
87f1af5d2fSBarry Smith 
8854a8ef01SBarry Smith #else
8990d37a7cSBarry Smith #define SETERRQ(n,s) ;
9090d37a7cSBarry Smith #define SETERRQ1(n,s,a1) ;
9190d37a7cSBarry Smith #define SETERRQ2(n,s,a1,a2) ;
9290d37a7cSBarry Smith #define SETERRQ3(n,s,a1,a2,a3) ;
9390d37a7cSBarry Smith #define SETERRQ4(n,s,a1,a2,a3,a4) ;
9485614651SBarry Smith 
954f227f7cSBarry Smith #define CHKERRQ(n)     ;
9685614651SBarry Smith 
9785614651SBarry Smith #define CHKMEMQ        ;
9885614651SBarry Smith 
99f1af5d2fSBarry Smith #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
100f1af5d2fSBarry Smith #define _
101f1af5d2fSBarry Smith #define ___
102f1af5d2fSBarry Smith #endif
103f1af5d2fSBarry Smith 
10454a8ef01SBarry Smith #endif
10554a8ef01SBarry Smith 
1064916b209SBarry Smith EXTERN int PetscErrorMessage(int,char**,char **);
107ca44d042SBarry Smith EXTERN int PetscTraceBackErrorHandler(int,char*,char*,char*,int,int,char*,void*);
108ca44d042SBarry Smith EXTERN int PetscEmacsClientErrorHandler(int,char*,char*,char*,int,int,char*,void*);
109ca44d042SBarry Smith EXTERN int PetscStopErrorHandler(int,char*,char*,char*,int,int,char*,void*);
110ca44d042SBarry Smith EXTERN int PetscAbortErrorHandler(int,char*,char*,char*,int,int,char*,void*);
111ca44d042SBarry Smith EXTERN int PetscAttachDebuggerErrorHandler(int,char*,char*,char*,int,int,char*,void*);
112ca44d042SBarry Smith EXTERN int PetscError(int,char*,char*,char*,int,int,char*,...);
113ca44d042SBarry Smith EXTERN int PetscPushErrorHandler(int (*handler)(int,char*,char*,char*,int,int,char*,void*),void*);
114ca44d042SBarry Smith EXTERN int PetscPopErrorHandler(void);
115ca44d042SBarry Smith EXTERN int PetscDefaultSignalHandler(int,void*);
116ca44d042SBarry Smith EXTERN int PetscPushSignalHandler(int (*)(int,void *),void*);
117ca44d042SBarry Smith EXTERN int PetscPopSignalHandler(void);
118329f5518SBarry Smith 
119329f5518SBarry Smith typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap;
120ca44d042SBarry Smith EXTERN int PetscSetFPTrap(PetscFPTrap);
12154a8ef01SBarry Smith 
1223a40ed3dSBarry Smith /*
1233a40ed3dSBarry Smith       Allows the code to build a stack frame as it runs
1243a40ed3dSBarry Smith */
125aa482453SBarry Smith #if defined(PETSC_USE_STACK)
1263a40ed3dSBarry Smith 
127184914b5SBarry Smith #define PETSCSTACKSIZE 15
128184914b5SBarry Smith 
1293a40ed3dSBarry Smith typedef struct  {
130184914b5SBarry Smith   char *function[PETSCSTACKSIZE];
131184914b5SBarry Smith   char *file[PETSCSTACKSIZE];
132184914b5SBarry Smith   char *directory[PETSCSTACKSIZE];
133184914b5SBarry Smith   int  line[PETSCSTACKSIZE];
134184914b5SBarry Smith   int  currentsize;
1353a40ed3dSBarry Smith } PetscStack;
1363a40ed3dSBarry Smith 
1373a40ed3dSBarry Smith extern PetscStack *petscstack;
138ca44d042SBarry Smith EXTERN int PetscStackCopy(PetscStack*,PetscStack*);
139ca44d042SBarry Smith EXTERN int PetscStackPrint(PetscStack*,FILE* fp);
140184914b5SBarry Smith 
141184914b5SBarry Smith #define PetscStackActive (petscstack != 0)
1423a40ed3dSBarry Smith 
143aa482453SBarry Smith #if !defined(PETSC_HAVE_AMS)
1446d385327SIbrahima Ba 
1453a40ed3dSBarry Smith #define PetscFunctionBegin \
146beb17490SBarry Smith   {\
147184914b5SBarry Smith    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
1484a2ae208SSatish Balay     petscstack->function[petscstack->currentsize]  = __FUNCT__; \
149184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = __FILE__; \
150184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = __SDIR__; \
151184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = __LINE__; \
152184914b5SBarry Smith     petscstack->currentsize++; \
1533a40ed3dSBarry Smith   }}
1543a40ed3dSBarry Smith 
1555cd90555SBarry Smith #define PetscStackPush(n) \
156184914b5SBarry Smith   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
157184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = n; \
158184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = "unknown"; \
159184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = "unknown"; \
160184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
161184914b5SBarry Smith     petscstack->currentsize++; \
1625cd90555SBarry Smith   }}
1633a40ed3dSBarry Smith 
164d64ed03dSBarry Smith #define PetscStackPop \
165184914b5SBarry Smith   {if (petscstack && petscstack->currentsize > 0) {     \
166184914b5SBarry Smith     petscstack->currentsize--; \
167184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = 0; \
168184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = 0; \
169184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = 0; \
170184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
1715cd90555SBarry Smith   }};
172d64ed03dSBarry Smith 
1735cd90555SBarry Smith #define PetscFunctionReturn(a) \
174beb17490SBarry Smith   {\
17506d1fe2cSBarry Smith   PetscStackPop; \
1765cd90555SBarry Smith   return(a);}
177d64ed03dSBarry Smith 
178ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \
179ff94ddecSSatish Balay   {\
180ff94ddecSSatish Balay   PetscStackPop;}
181ff94ddecSSatish Balay 
1823a40ed3dSBarry Smith #else
1833a40ed3dSBarry Smith 
18406d1fe2cSBarry Smith /*
18506d1fe2cSBarry Smith     Duplicate Code for when the ALICE Memory Snooper (AMS)
186aa482453SBarry Smith   is being used. When PETSC_HAVE_AMS is defined.
18706d1fe2cSBarry Smith 
18806d1fe2cSBarry Smith      stack_mem is the AMS memory that contains fields for the
18906d1fe2cSBarry Smith                number of stack frames and names of the stack frames
19006d1fe2cSBarry Smith */
19106d1fe2cSBarry Smith 
1926d385327SIbrahima Ba extern AMS_Memory stack_mem;
19306d1fe2cSBarry Smith extern int        stack_err;
1946d385327SIbrahima Ba 
1956d385327SIbrahima Ba #define PetscFunctionBegin \
196beb17490SBarry Smith   {\
197184914b5SBarry Smith    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
19806d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
1994a2ae208SSatish Balay     petscstack->function[petscstack->currentsize]  = __FUNCT__; \
200184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = __FILE__; \
201184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = __SDIR__; \
202184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = __LINE__; \
203184914b5SBarry Smith     petscstack->currentsize++; \
20406d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
2056d385327SIbrahima Ba   }}
2066d385327SIbrahima Ba 
2076d385327SIbrahima Ba #define PetscStackPush(n) \
208184914b5SBarry Smith   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
20906d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
210184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = n; \
211184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = "unknown"; \
212184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = "unknown"; \
213184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
214184914b5SBarry Smith     petscstack->currentsize++; \
21506d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
2166d385327SIbrahima Ba   }}
2176d385327SIbrahima Ba 
2186d385327SIbrahima Ba #define PetscStackPop \
219184914b5SBarry Smith   {if (petscstack && petscstack->currentsize > 0) {     \
22006d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
221184914b5SBarry Smith     petscstack->currentsize--; \
222184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = 0; \
223184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = 0; \
224184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = 0; \
225184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
22606d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
2276d385327SIbrahima Ba   }};
2286d385327SIbrahima Ba 
2296d385327SIbrahima Ba #define PetscFunctionReturn(a) \
230beb17490SBarry Smith   {\
23106d1fe2cSBarry Smith   PetscStackPop; \
2326d385327SIbrahima Ba   return(a);}
2336d385327SIbrahima Ba 
234ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \
235ff94ddecSSatish Balay   {\
236ff94ddecSSatish Balay   PetscStackPop;}
237ff94ddecSSatish Balay 
238ff94ddecSSatish Balay 
2396d385327SIbrahima Ba #endif
2406d385327SIbrahima Ba 
2416d385327SIbrahima Ba #else
2426d385327SIbrahima Ba 
2433a40ed3dSBarry Smith #define PetscFunctionBegin
2443a40ed3dSBarry Smith #define PetscFunctionReturn(a)  return(a)
245d88b86c3SSatish Balay #define PetscFunctionReturnVoid()
246d64ed03dSBarry Smith #define PetscStackPop
247d64ed03dSBarry Smith #define PetscStackPush(f)
248d64ed03dSBarry Smith #define PetscStackActive        0
2493a40ed3dSBarry Smith 
2503a40ed3dSBarry Smith #endif
2513a40ed3dSBarry Smith 
252ca44d042SBarry Smith EXTERN int PetscStackCreate(void);
253b0a32e0cSBarry Smith EXTERN int PetscStackView(PetscViewer);
254ca44d042SBarry Smith EXTERN int PetscStackDestroy(void);
255ca44d042SBarry Smith EXTERN int PetscStackPublish(void);
256ca44d042SBarry Smith EXTERN int PetscStackDepublish(void);
2573a40ed3dSBarry Smith 
25806d1fe2cSBarry Smith 
25906d1fe2cSBarry Smith #endif
26006d1fe2cSBarry Smith 
261329f5518SBarry Smith 
262