1*0f5bd95cSBarry Smith /* $Id: petscerror.h,v 1.37 1999/09/27 21:33:07 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 */ 61d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE 73 /* object in argument is in wrong state, e.g. unassembled mat */ 62a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP 75 /* two arguments are incompatible */ 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_KSP_BRKDWN 70 /* break down in a Krylov method */ 704f227f7cSBarry Smith 71329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT 71 /* detected a zero pivot during LU factorization */ 72329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_CH_ZRPVT 71 /* detected a zero pivot during Cholesky factorization */ 7354a8ef01SBarry Smith 74aa482453SBarry Smith #if defined(PETSC_USE_DEBUG) 75c22c1629SBarry Smith #define SETERRA(n,p,s) {int _ierr = PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s);\ 76fdb4a956SSatish Balay MPI_Abort(PETSC_COMM_WORLD,_ierr);} 779a00fa46SSatish Balay #define SETERRQ(n,p,s) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s);} 789a00fa46SSatish Balay #define SETERRQ1(n,p,s,a1) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1);} 799a00fa46SSatish Balay #define SETERRQ2(n,p,s,a1,a2) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2);} 809a00fa46SSatish Balay #define SETERRQ3(n,p,s,a1,a2,a3) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2,a3);} 819a00fa46SSatish Balay #define SETERRQ4(n,p,s,a1,a2,a3,a4) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2,a3,a4);} 829a00fa46SSatish Balay 83e3372554SBarry Smith #define CHKERRQ(n) {if (n) SETERRQ(n,0,(char *)0);} 84e3372554SBarry Smith #define CHKERRA(n) {if (n) SETERRA(n,0,(char *)0);} 85e3372554SBarry Smith #define CHKPTRQ(p) if (!p) SETERRQ(PETSC_ERR_MEM,0,(char*)0); 86e3372554SBarry Smith #define CHKPTRA(p) if (!p) SETERRA(PETSC_ERR_MEM,0,(char*)0); 8785614651SBarry Smith 8885614651SBarry Smith #define CHKMEMQ {int __ierr = PetscTrValid(__LINE__,__FUNC__,__FILE__,__SDIR__); CHKERRQ(__ierr);} 8985614651SBarry Smith #define CHKMEMA {int __ierr = PetscTrValid(__LINE__,__FUNC__,__FILE__,__SDIR__); CHKERRA(__ierr);} 9085614651SBarry Smith 9154a8ef01SBarry Smith #else 92e3372554SBarry Smith #define SETERRQ(n,p,s) ; 93cf949a74SBarry Smith #define SETERRQ1(n,p,s,a1) ; 94cf949a74SBarry Smith #define SETERRQ2(n,p,s,a1,a2) ; 95cf949a74SBarry Smith #define SETERRQ3(n,p,s,a1,a2,a3) ; 96cf949a74SBarry Smith #define SETERRQ4(n,p,s,a1,a2,a3,a4) ; 97e3372554SBarry Smith #define SETERRA(n,p,s) ; 9885614651SBarry Smith 994f227f7cSBarry Smith #define CHKERRQ(n) ; 1004f227f7cSBarry Smith #define CHKERRA(n) ; 1014f227f7cSBarry Smith #define CHKPTRQ(p) ; 1024f227f7cSBarry Smith #define CHKPTRA(p) ; 10385614651SBarry Smith 10485614651SBarry Smith #define CHKMEMQ ; 10585614651SBarry Smith #define CHKMEMA ; 10685614651SBarry Smith 10754a8ef01SBarry Smith #endif 10854a8ef01SBarry Smith 109e3372554SBarry Smith extern int PetscTraceBackErrorHandler(int,char*,char*,char*,int,int,char*,void*); 110e3372554SBarry Smith extern int PetscStopErrorHandler(int,char*,char*,char*,int,int,char*,void*); 111e3372554SBarry Smith extern int PetscAbortErrorHandler(int,char*,char*,char*,int,int,char*,void* ); 112e3372554SBarry Smith extern int PetscAttachDebuggerErrorHandler(int,char*,char*,char*,int,int,char*,void*); 1139a00fa46SSatish Balay extern int PetscError(int,char*,char*,char*,int,int,char*,...); 114e3372554SBarry Smith extern int PetscPushErrorHandler(int (*handler)(int,char*,char*,char*,int,int,char*,void*),void*); 115cf256101SBarry Smith extern int PetscPopErrorHandler(void); 11654a8ef01SBarry Smith 11754a8ef01SBarry Smith extern int PetscDefaultSignalHandler(int,void*); 11854a8ef01SBarry Smith extern int PetscPushSignalHandler(int (*)(int,void *),void*); 119cf256101SBarry Smith extern int PetscPopSignalHandler(void); 12054a8ef01SBarry Smith #define PETSC_FP_TRAP_OFF 0 12154a8ef01SBarry Smith #define PETSC_FP_TRAP_ON 1 12254a8ef01SBarry Smith extern int PetscSetFPTrap(int); 1230513a670SBarry Smith extern int PetscInitializeNans(Scalar*,int); 1240513a670SBarry Smith extern int PetscInitializeLargeInts(int *,int); 12554a8ef01SBarry Smith 1263a40ed3dSBarry Smith /* 1273a40ed3dSBarry Smith Allows the code to build a stack frame as it runs 1283a40ed3dSBarry Smith */ 129aa482453SBarry Smith #if defined(PETSC_USE_STACK) 1303a40ed3dSBarry Smith 131184914b5SBarry Smith #define PETSCSTACKSIZE 15 132184914b5SBarry Smith 1333a40ed3dSBarry Smith typedef struct { 134184914b5SBarry Smith char *function[PETSCSTACKSIZE]; 135184914b5SBarry Smith char *file[PETSCSTACKSIZE]; 136184914b5SBarry Smith char *directory[PETSCSTACKSIZE]; 137184914b5SBarry Smith int line[PETSCSTACKSIZE]; 138184914b5SBarry Smith int currentsize; 1393a40ed3dSBarry Smith } PetscStack; 1403a40ed3dSBarry Smith 1413a40ed3dSBarry Smith extern PetscStack *petscstack; 142184914b5SBarry Smith extern int PetscStackCopy(PetscStack*,PetscStack*); 143184914b5SBarry Smith extern int PetscStackPrint(PetscStack*,FILE* fp); 144184914b5SBarry Smith 145184914b5SBarry Smith #define PetscStackActive (petscstack != 0) 1463a40ed3dSBarry Smith 147aa482453SBarry Smith #if !defined(PETSC_HAVE_AMS) 1486d385327SIbrahima Ba 1493a40ed3dSBarry Smith #define PetscFunctionBegin \ 150beb17490SBarry Smith {\ 151184914b5SBarry Smith if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) { \ 152184914b5SBarry Smith petscstack->function[petscstack->currentsize] = __FUNC__; \ 153184914b5SBarry Smith petscstack->file[petscstack->currentsize] = __FILE__; \ 154184914b5SBarry Smith petscstack->directory[petscstack->currentsize] = __SDIR__; \ 155184914b5SBarry Smith petscstack->line[petscstack->currentsize] = __LINE__; \ 156184914b5SBarry Smith petscstack->currentsize++; \ 1573a40ed3dSBarry Smith }} 1583a40ed3dSBarry Smith 1595cd90555SBarry Smith #define PetscStackPush(n) \ 160184914b5SBarry Smith {if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) { \ 161184914b5SBarry Smith petscstack->function[petscstack->currentsize] = n; \ 162184914b5SBarry Smith petscstack->file[petscstack->currentsize] = "unknown"; \ 163184914b5SBarry Smith petscstack->directory[petscstack->currentsize] = "unknown"; \ 164184914b5SBarry Smith petscstack->line[petscstack->currentsize] = 0; \ 165184914b5SBarry Smith petscstack->currentsize++; \ 1665cd90555SBarry Smith }} 1673a40ed3dSBarry Smith 168d64ed03dSBarry Smith #define PetscStackPop \ 169184914b5SBarry Smith {if (petscstack && petscstack->currentsize > 0) { \ 170184914b5SBarry Smith petscstack->currentsize--; \ 171184914b5SBarry Smith petscstack->function[petscstack->currentsize] = 0; \ 172184914b5SBarry Smith petscstack->file[petscstack->currentsize] = 0; \ 173184914b5SBarry Smith petscstack->directory[petscstack->currentsize] = 0; \ 174184914b5SBarry Smith petscstack->line[petscstack->currentsize] = 0; \ 1755cd90555SBarry Smith }}; 176d64ed03dSBarry Smith 1775cd90555SBarry Smith #define PetscFunctionReturn(a) \ 178beb17490SBarry Smith {\ 17906d1fe2cSBarry Smith PetscStackPop; \ 1805cd90555SBarry Smith return(a);} 181d64ed03dSBarry Smith 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);\ 199184914b5SBarry Smith petscstack->function[petscstack->currentsize] = __FUNC__; \ 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 2346d385327SIbrahima Ba #endif 2356d385327SIbrahima Ba 2366d385327SIbrahima Ba #else 2376d385327SIbrahima Ba 2383a40ed3dSBarry Smith #define PetscFunctionBegin 2393a40ed3dSBarry Smith #define PetscFunctionReturn(a) return(a) 240d64ed03dSBarry Smith #define PetscStackPop 241d64ed03dSBarry Smith #define PetscStackPush(f) 242d64ed03dSBarry Smith #define PetscStackActive 0 2433a40ed3dSBarry Smith 2443a40ed3dSBarry Smith #endif 2453a40ed3dSBarry Smith 246184914b5SBarry Smith extern int PetscStackCreate(void); 2473a40ed3dSBarry Smith extern int PetscStackView(Viewer); 248cf256101SBarry Smith extern int PetscStackDestroy(void); 249f2b01315SBarry Smith extern int PetscStackPublish(void); 250f2b01315SBarry Smith extern int PetscStackDepublish(void); 2513a40ed3dSBarry Smith 25206d1fe2cSBarry Smith /* 253b707bbf7SBarry Smith For locking, unlocking and destroying AMS memories associated with 25406d1fe2cSBarry Smith PETSc objects 25506d1fe2cSBarry Smith */ 25606d1fe2cSBarry Smith 257aa482453SBarry Smith #if defined(PETSC_HAVE_AMS) 258*0f5bd95cSBarry Smith #define PetscObjectTakeAccess(obj) \ 259b66d27f0SBarry Smith ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_take_access(((PetscObject)(obj))->amem)) 260*0f5bd95cSBarry Smith #define PetscObjectGrantAccess(obj) \ 261b66d27f0SBarry Smith ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_grant_access(((PetscObject)(obj))->amem)) 262*0f5bd95cSBarry Smith #define PetscObjectDepublish(obj) \ 263b66d27f0SBarry Smith ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_destroy(((PetscObject)(obj))->amem)); \ 264b66d27f0SBarry Smith ((PetscObject)(obj))->amem = -1; 26506d1fe2cSBarry Smith #else 266*0f5bd95cSBarry Smith #define PetscObjectTakeAccess(obj) 0 267*0f5bd95cSBarry Smith #define PetscObjectGrantAccess(obj) 0 268*0f5bd95cSBarry Smith #define PetscObjectDepublish(obj) 0 26954a8ef01SBarry Smith #endif 27006d1fe2cSBarry Smith 27106d1fe2cSBarry Smith #endif 27206d1fe2cSBarry Smith 273