xref: /petsc/include/petscerror.h (revision f1af5d2ffeae1f5fc391a89939f4818e47770ae3)
1*f1af5d2fSBarry Smith /* $Id: petscerror.h,v 1.39 1999/10/23 00:02:04 bsmith 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
185e97870eSBarry Smith    and bmake/common 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 */
295615d1e5SSatish Balay #if !defined(__FUNC__)
3094a9d846SBarry Smith #define __FUNC__ "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 
3745d48df9SBarry Smith      In addition, each specific error in the code has an error
38126a7499SLois Curfman McInnes      message: a specific, unique error code.  (The specific error
39126a7499SLois Curfman McInnes      code is not yet in use; these will be generated automatically and
404f227f7cSBarry Smith      embed an integer into the PetscError() calls. For non-English
41329ffe3dSLois Curfman McInnes      error messages, that integer will be extracted and used to look up the
424f227f7cSBarry Smith      appropriate error message in the local language from a file.)
4345d48df9SBarry Smith 
4454a8ef01SBarry Smith */
4545d48df9SBarry Smith #define PETSC_ERR_MEM             55   /* unable to allocate requested memory */
4647794344SBarry Smith #define PETSC_ERR_SUP             56   /* no support for requested operation */
4745d48df9SBarry Smith #define PETSC_ERR_SIG             59   /* signal received */
48f1caa5a4SBarry Smith #define PETSC_ERR_FP              72   /* floating point exception */
49a8c6a408SBarry Smith #define PETSC_ERR_COR             74   /* corrupted PETSc object */
50a8c6a408SBarry Smith #define PETSC_ERR_LIB             76   /* error in library called by PETSc */
51329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB            77   /* PETSc library generated inconsistent data */
52329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC            78   /* memory corruption */
5345d48df9SBarry Smith 
5445d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ         60   /* nonconforming object sizes used in operation */
5545d48df9SBarry Smith #define PETSC_ERR_ARG_IDN         61   /* two arguments not allowed to be the same */
56a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG       62   /* wrong argument (but object probably ok) */
5745d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT     64   /* null or corrupted PETSc object as argument */
5845d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE  63   /* input argument, out of range */
594f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR      68   /* invalid pointer argument */
604f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE 69   /* two args must be same object type */
616831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM 80   /* two args must be same communicators */
62d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE  73   /* object in argument is in wrong state, e.g. unassembled mat */
63a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP      75   /* two arguments are incompatible */
644f227f7cSBarry Smith 
654f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN       65   /* unable to open file */
664f227f7cSBarry Smith #define PETSC_ERR_FILE_READ       66   /* unable to read from file */
674f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE      67   /* unable to write to file */
68a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED 79   /* unexpected data in file */
6945d48df9SBarry Smith 
70329ffe3dSLois Curfman McInnes #define PETSC_ERR_KSP_BRKDWN      70   /* break down in a Krylov method */
714f227f7cSBarry Smith 
72329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT    71   /* detected a zero pivot during LU factorization */
73329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_CH_ZRPVT    71   /* detected a zero pivot during Cholesky factorization */
7454a8ef01SBarry Smith 
75aa482453SBarry Smith #if defined(PETSC_USE_DEBUG)
76c22c1629SBarry Smith #define SETERRA(n,p,s) {int _ierr = PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s);\
77fdb4a956SSatish Balay                           MPI_Abort(PETSC_COMM_WORLD,_ierr);}
789a00fa46SSatish Balay #define SETERRQ(n,p,s)              {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s);}
799a00fa46SSatish Balay #define SETERRQ1(n,p,s,a1)          {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1);}
809a00fa46SSatish Balay #define SETERRQ2(n,p,s,a1,a2)       {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2);}
819a00fa46SSatish Balay #define SETERRQ3(n,p,s,a1,a2,a3)    {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2,a3);}
829a00fa46SSatish Balay #define SETERRQ4(n,p,s,a1,a2,a3,a4) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2,a3,a4);}
839a00fa46SSatish Balay 
84e3372554SBarry Smith #define CHKERRQ(n)     {if (n) SETERRQ(n,0,(char *)0);}
85e3372554SBarry Smith #define CHKERRA(n)     {if (n) SETERRA(n,0,(char *)0);}
86e3372554SBarry Smith #define CHKPTRQ(p)     if (!p) SETERRQ(PETSC_ERR_MEM,0,(char*)0);
87e3372554SBarry Smith #define CHKPTRA(p)     if (!p) SETERRA(PETSC_ERR_MEM,0,(char*)0);
8885614651SBarry Smith 
8985614651SBarry Smith #define CHKMEMQ {int __ierr = PetscTrValid(__LINE__,__FUNC__,__FILE__,__SDIR__); CHKERRQ(__ierr);}
9085614651SBarry Smith #define CHKMEMA {int __ierr = PetscTrValid(__LINE__,__FUNC__,__FILE__,__SDIR__); CHKERRA(__ierr);}
9185614651SBarry Smith 
92*f1af5d2fSBarry Smith #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
93*f1af5d2fSBarry Smith extern  int __gierr;
94*f1af5d2fSBarry Smith #define _   __gierr =
95*f1af5d2fSBarry Smith #define ___  CHKERRA(__gierr);
96*f1af5d2fSBarry Smith #define ____ CHKERRQ(__gierr);
97*f1af5d2fSBarry Smith #endif
98*f1af5d2fSBarry Smith 
9954a8ef01SBarry Smith #else
100e3372554SBarry Smith #define SETERRQ(n,p,s) ;
101cf949a74SBarry Smith #define SETERRQ1(n,p,s,a1) ;
102cf949a74SBarry Smith #define SETERRQ2(n,p,s,a1,a2) ;
103cf949a74SBarry Smith #define SETERRQ3(n,p,s,a1,a2,a3) ;
104cf949a74SBarry Smith #define SETERRQ4(n,p,s,a1,a2,a3,a4) ;
105e3372554SBarry Smith #define SETERRA(n,p,s) ;
10685614651SBarry Smith 
1074f227f7cSBarry Smith #define CHKERRQ(n)     ;
1084f227f7cSBarry Smith #define CHKERRA(n)     ;
1094f227f7cSBarry Smith #define CHKPTRQ(p)     ;
1104f227f7cSBarry Smith #define CHKPTRA(p)     ;
11185614651SBarry Smith 
11285614651SBarry Smith #define CHKMEMQ        ;
11385614651SBarry Smith #define CHKMEMA        ;
11485614651SBarry Smith 
115*f1af5d2fSBarry Smith #if !defined(PETSC_SKIP_UNDERSCORE_CHKERR)
116*f1af5d2fSBarry Smith #define _
117*f1af5d2fSBarry Smith #define ___
118*f1af5d2fSBarry Smith #define ____
119*f1af5d2fSBarry Smith #endif
120*f1af5d2fSBarry Smith 
12154a8ef01SBarry Smith #endif
12254a8ef01SBarry Smith 
123e3372554SBarry Smith extern int PetscTraceBackErrorHandler(int,char*,char*,char*,int,int,char*,void*);
124e3372554SBarry Smith extern int PetscStopErrorHandler(int,char*,char*,char*,int,int,char*,void*);
125e3372554SBarry Smith extern int PetscAbortErrorHandler(int,char*,char*,char*,int,int,char*,void* );
126e3372554SBarry Smith extern int PetscAttachDebuggerErrorHandler(int,char*,char*,char*,int,int,char*,void*);
1279a00fa46SSatish Balay extern int PetscError(int,char*,char*,char*,int,int,char*,...);
128e3372554SBarry Smith extern int PetscPushErrorHandler(int (*handler)(int,char*,char*,char*,int,int,char*,void*),void*);
129cf256101SBarry Smith extern int PetscPopErrorHandler(void);
13054a8ef01SBarry Smith 
13154a8ef01SBarry Smith extern int PetscDefaultSignalHandler(int,void*);
13254a8ef01SBarry Smith extern int PetscPushSignalHandler(int (*)(int,void *),void*);
133cf256101SBarry Smith extern int PetscPopSignalHandler(void);
13454a8ef01SBarry Smith #define PETSC_FP_TRAP_OFF    0
13554a8ef01SBarry Smith #define PETSC_FP_TRAP_ON     1
13654a8ef01SBarry Smith extern int PetscSetFPTrap(int);
13754a8ef01SBarry Smith 
1383a40ed3dSBarry Smith /*
1393a40ed3dSBarry Smith       Allows the code to build a stack frame as it runs
1403a40ed3dSBarry Smith */
141aa482453SBarry Smith #if defined(PETSC_USE_STACK)
1423a40ed3dSBarry Smith 
143184914b5SBarry Smith #define PETSCSTACKSIZE 15
144184914b5SBarry Smith 
1453a40ed3dSBarry Smith typedef struct  {
146184914b5SBarry Smith   char *function[PETSCSTACKSIZE];
147184914b5SBarry Smith   char *file[PETSCSTACKSIZE];
148184914b5SBarry Smith   char *directory[PETSCSTACKSIZE];
149184914b5SBarry Smith   int  line[PETSCSTACKSIZE];
150184914b5SBarry Smith   int  currentsize;
1513a40ed3dSBarry Smith } PetscStack;
1523a40ed3dSBarry Smith 
1533a40ed3dSBarry Smith extern PetscStack *petscstack;
154184914b5SBarry Smith extern int PetscStackCopy(PetscStack*,PetscStack*);
155184914b5SBarry Smith extern int PetscStackPrint(PetscStack*,FILE* fp);
156184914b5SBarry Smith 
157184914b5SBarry Smith #define PetscStackActive (petscstack != 0)
1583a40ed3dSBarry Smith 
159aa482453SBarry Smith #if !defined(PETSC_HAVE_AMS)
1606d385327SIbrahima Ba 
1613a40ed3dSBarry Smith #define PetscFunctionBegin \
162beb17490SBarry Smith   {\
163184914b5SBarry Smith    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
164184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = __FUNC__; \
165184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = __FILE__; \
166184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = __SDIR__; \
167184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = __LINE__; \
168184914b5SBarry Smith     petscstack->currentsize++; \
1693a40ed3dSBarry Smith   }}
1703a40ed3dSBarry Smith 
1715cd90555SBarry Smith #define PetscStackPush(n) \
172184914b5SBarry Smith   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
173184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = n; \
174184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = "unknown"; \
175184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = "unknown"; \
176184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
177184914b5SBarry Smith     petscstack->currentsize++; \
1785cd90555SBarry Smith   }}
1793a40ed3dSBarry Smith 
180d64ed03dSBarry Smith #define PetscStackPop \
181184914b5SBarry Smith   {if (petscstack && petscstack->currentsize > 0) {     \
182184914b5SBarry Smith     petscstack->currentsize--; \
183184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = 0; \
184184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = 0; \
185184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = 0; \
186184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
1875cd90555SBarry Smith   }};
188d64ed03dSBarry Smith 
1895cd90555SBarry Smith #define PetscFunctionReturn(a) \
190beb17490SBarry Smith   {\
19106d1fe2cSBarry Smith   PetscStackPop; \
1925cd90555SBarry Smith   return(a);}
193d64ed03dSBarry Smith 
1943a40ed3dSBarry Smith #else
1953a40ed3dSBarry Smith 
19606d1fe2cSBarry Smith /*
19706d1fe2cSBarry Smith     Duplicate Code for when the ALICE Memory Snooper (AMS)
198aa482453SBarry Smith   is being used. When PETSC_HAVE_AMS is defined.
19906d1fe2cSBarry Smith 
20006d1fe2cSBarry Smith      stack_mem is the AMS memory that contains fields for the
20106d1fe2cSBarry Smith                number of stack frames and names of the stack frames
20206d1fe2cSBarry Smith */
20306d1fe2cSBarry Smith 
2046d385327SIbrahima Ba extern AMS_Memory stack_mem;
20506d1fe2cSBarry Smith extern int        stack_err;
2066d385327SIbrahima Ba 
2076d385327SIbrahima Ba #define PetscFunctionBegin \
208beb17490SBarry Smith   {\
209184914b5SBarry Smith    if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
21006d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
211184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = __FUNC__; \
212184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = __FILE__; \
213184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = __SDIR__; \
214184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = __LINE__; \
215184914b5SBarry Smith     petscstack->currentsize++; \
21606d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
2176d385327SIbrahima Ba   }}
2186d385327SIbrahima Ba 
2196d385327SIbrahima Ba #define PetscStackPush(n) \
220184914b5SBarry Smith   {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) {    \
22106d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
222184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = n; \
223184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = "unknown"; \
224184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = "unknown"; \
225184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
226184914b5SBarry Smith     petscstack->currentsize++; \
22706d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
2286d385327SIbrahima Ba   }}
2296d385327SIbrahima Ba 
2306d385327SIbrahima Ba #define PetscStackPop \
231184914b5SBarry Smith   {if (petscstack && petscstack->currentsize > 0) {     \
23206d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\
233184914b5SBarry Smith     petscstack->currentsize--; \
234184914b5SBarry Smith     petscstack->function[petscstack->currentsize]  = 0; \
235184914b5SBarry Smith     petscstack->file[petscstack->currentsize]      = 0; \
236184914b5SBarry Smith     petscstack->directory[petscstack->currentsize] = 0; \
237184914b5SBarry Smith     petscstack->line[petscstack->currentsize]      = 0; \
23806d1fe2cSBarry Smith     if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\
2396d385327SIbrahima Ba   }};
2406d385327SIbrahima Ba 
2416d385327SIbrahima Ba #define PetscFunctionReturn(a) \
242beb17490SBarry Smith   {\
24306d1fe2cSBarry Smith   PetscStackPop; \
2446d385327SIbrahima Ba   return(a);}
2456d385327SIbrahima Ba 
2466d385327SIbrahima Ba #endif
2476d385327SIbrahima Ba 
2486d385327SIbrahima Ba #else
2496d385327SIbrahima Ba 
2503a40ed3dSBarry Smith #define PetscFunctionBegin
2513a40ed3dSBarry Smith #define PetscFunctionReturn(a)  return(a)
252d64ed03dSBarry Smith #define PetscStackPop
253d64ed03dSBarry Smith #define PetscStackPush(f)
254d64ed03dSBarry Smith #define PetscStackActive        0
2553a40ed3dSBarry Smith 
2563a40ed3dSBarry Smith #endif
2573a40ed3dSBarry Smith 
258184914b5SBarry Smith extern int PetscStackCreate(void);
2593a40ed3dSBarry Smith extern int PetscStackView(Viewer);
260cf256101SBarry Smith extern int PetscStackDestroy(void);
261f2b01315SBarry Smith extern int PetscStackPublish(void);
262f2b01315SBarry Smith extern int PetscStackDepublish(void);
2633a40ed3dSBarry Smith 
26406d1fe2cSBarry Smith /*
265b707bbf7SBarry Smith           For locking, unlocking and destroying AMS memories associated with
26606d1fe2cSBarry Smith     PETSc objects
26706d1fe2cSBarry Smith */
26806d1fe2cSBarry Smith 
269aa482453SBarry Smith #if defined(PETSC_HAVE_AMS)
2700f5bd95cSBarry Smith #define PetscObjectTakeAccess(obj)   \
271b66d27f0SBarry Smith     ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_take_access(((PetscObject)(obj))->amem))
2720f5bd95cSBarry Smith #define PetscObjectGrantAccess(obj)  \
273b66d27f0SBarry Smith     ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_grant_access(((PetscObject)(obj))->amem))
2740f5bd95cSBarry Smith #define PetscObjectDepublish(obj)  \
275b66d27f0SBarry Smith     ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_destroy(((PetscObject)(obj))->amem)); \
276b66d27f0SBarry Smith     ((PetscObject)(obj))->amem = -1;
27706d1fe2cSBarry Smith #else
2780f5bd95cSBarry Smith #define PetscObjectTakeAccess(obj)   0
2790f5bd95cSBarry Smith #define PetscObjectGrantAccess(obj)  0
2800f5bd95cSBarry Smith #define PetscObjectDepublish(obj)      0
28154a8ef01SBarry Smith #endif
28206d1fe2cSBarry Smith 
28306d1fe2cSBarry Smith #endif
28406d1fe2cSBarry Smith 
285