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