1*9a00fa46SSatish Balay /* $Id: petscerror.h,v 1.28 1998/12/04 23:31:39 bsmith Exp balay $ */ 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 106d385327SIbrahima Ba #if defined(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 743a40ed3dSBarry Smith #if defined(USE_PETSC_DEBUG) 75c22c1629SBarry Smith #define SETERRA(n,p,s) {int _ierr = PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s);\ 76*9a00fa46SSatish Balay #define SETERRQ(n,p,s) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s);} 77*9a00fa46SSatish Balay #define SETERRQ1(n,p,s,a1) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1);} 78*9a00fa46SSatish Balay #define SETERRQ2(n,p,s,a1,a2) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2);} 79*9a00fa46SSatish Balay #define SETERRQ3(n,p,s,a1,a2,a3) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2,a3);} 80*9a00fa46SSatish Balay #define SETERRQ4(n,p,s,a1,a2,a3,a4) {return PetscError(__LINE__,__FUNC__,__FILE__,__SDIR__,n,p,s,a1,a2,a3,a4);} 81*9a00fa46SSatish Balay 8254a8ef01SBarry Smith MPI_Abort(PETSC_COMM_WORLD,_ierr);} 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); 8754a8ef01SBarry Smith #else 88e3372554SBarry Smith #define SETERRQ(n,p,s) ; 89e3372554SBarry Smith #define SETERRA(n,p,s) ; 904f227f7cSBarry Smith #define CHKERRQ(n) ; 914f227f7cSBarry Smith #define CHKERRA(n) ; 924f227f7cSBarry Smith #define CHKPTRQ(p) ; 934f227f7cSBarry Smith #define CHKPTRA(p) ; 9454a8ef01SBarry Smith #endif 9554a8ef01SBarry Smith 96e3372554SBarry Smith extern int PetscTraceBackErrorHandler(int,char*,char*,char*,int,int,char*,void*); 97e3372554SBarry Smith extern int PetscStopErrorHandler(int,char*,char*,char*,int,int,char*,void*); 98e3372554SBarry Smith extern int PetscAbortErrorHandler(int,char*,char*,char*,int,int,char*,void* ); 99e3372554SBarry Smith extern int PetscAttachDebuggerErrorHandler(int,char*,char*,char*,int,int,char*,void*); 100*9a00fa46SSatish Balay extern int PetscError(int,char*,char*,char*,int,int,char*,...); 101e3372554SBarry Smith extern int PetscPushErrorHandler(int (*handler)(int,char*,char*,char*,int,int,char*,void*),void*); 102cf256101SBarry Smith extern int PetscPopErrorHandler(void); 10354a8ef01SBarry Smith 10454a8ef01SBarry Smith extern int PetscDefaultSignalHandler(int,void*); 10554a8ef01SBarry Smith extern int PetscPushSignalHandler(int (*)(int,void *),void*); 106cf256101SBarry Smith extern int PetscPopSignalHandler(void); 10754a8ef01SBarry Smith #define PETSC_FP_TRAP_OFF 0 10854a8ef01SBarry Smith #define PETSC_FP_TRAP_ON 1 10954a8ef01SBarry Smith extern int PetscSetFPTrap(int); 1100513a670SBarry Smith extern int PetscInitializeNans(Scalar*,int); 1110513a670SBarry Smith extern int PetscInitializeLargeInts(int *,int); 11254a8ef01SBarry Smith 1133a40ed3dSBarry Smith /* 1143a40ed3dSBarry Smith Allows the code to build a stack frame as it runs 1153a40ed3dSBarry Smith */ 1163a40ed3dSBarry Smith #if defined(USE_PETSC_STACK) 1173a40ed3dSBarry Smith 1183a40ed3dSBarry Smith typedef struct { 1195cd90555SBarry Smith char **function; 1205cd90555SBarry Smith char **file; 1215cd90555SBarry Smith char **directory; 1225cd90555SBarry Smith int *line; 1233a40ed3dSBarry Smith } PetscStack; 1243a40ed3dSBarry Smith 1253a40ed3dSBarry Smith extern int petscstacksize_max; 1263a40ed3dSBarry Smith extern int petscstacksize; 1273a40ed3dSBarry Smith extern PetscStack *petscstack; 1283a40ed3dSBarry Smith 1296d385327SIbrahima Ba #if !defined(HAVE_AMS) 1306d385327SIbrahima Ba 1313a40ed3dSBarry Smith #define PetscFunctionBegin \ 132beb17490SBarry Smith {\ 13306d1fe2cSBarry Smith if (petscstack && (petscstacksize < petscstacksize_max)) { \ 1345cd90555SBarry Smith petscstack->function[petscstacksize] = __FUNC__; \ 1355cd90555SBarry Smith petscstack->file[petscstacksize] = __FILE__; \ 1365cd90555SBarry Smith petscstack->directory[petscstacksize] = __SDIR__; \ 1375cd90555SBarry Smith petscstack->line[petscstacksize] = __LINE__; \ 1383a40ed3dSBarry Smith petscstacksize++; \ 1393a40ed3dSBarry Smith }} 1403a40ed3dSBarry Smith 1415cd90555SBarry Smith #define PetscStackPush(n) \ 1425cd90555SBarry Smith {if (petscstack && (petscstacksize < petscstacksize_max)) { \ 1435cd90555SBarry Smith petscstack->function[petscstacksize] = n; \ 1442e8a6d31SBarry Smith petscstack->file[petscstacksize] = "unknown"; \ 1452e8a6d31SBarry Smith petscstack->directory[petscstacksize] = "unknown"; \ 1465cd90555SBarry Smith petscstack->line[petscstacksize] = 0; \ 1475cd90555SBarry Smith petscstacksize++; \ 1485cd90555SBarry Smith }} 1493a40ed3dSBarry Smith 150d64ed03dSBarry Smith #define PetscStackPop \ 1515cd90555SBarry Smith {if (petscstack && petscstacksize > 0) { \ 1525cd90555SBarry Smith petscstacksize--; \ 1535cd90555SBarry Smith petscstack->function[petscstacksize] = 0; \ 1545cd90555SBarry Smith petscstack->file[petscstacksize] = 0; \ 1555cd90555SBarry Smith petscstack->directory[petscstacksize] = 0; \ 1565cd90555SBarry Smith petscstack->line[petscstacksize] = 0; \ 1575cd90555SBarry Smith }}; 158d64ed03dSBarry Smith 1595cd90555SBarry Smith #define PetscFunctionReturn(a) \ 160beb17490SBarry Smith {\ 16106d1fe2cSBarry Smith PetscStackPop; \ 1625cd90555SBarry Smith return(a);} 163d64ed03dSBarry Smith 164d64ed03dSBarry Smith #define PetscStackActive (petscstack != 0) 165d64ed03dSBarry Smith 1663a40ed3dSBarry Smith #else 1673a40ed3dSBarry Smith 16806d1fe2cSBarry Smith /* 16906d1fe2cSBarry Smith Duplicate Code for when the ALICE Memory Snooper (AMS) 17006d1fe2cSBarry Smith is being used. When HAVE_AMS is defined. 17106d1fe2cSBarry Smith 17206d1fe2cSBarry Smith stack_mem is the AMS memory that contains fields for the 17306d1fe2cSBarry Smith number of stack frames and names of the stack frames 17406d1fe2cSBarry Smith */ 17506d1fe2cSBarry Smith 1766d385327SIbrahima Ba extern AMS_Memory stack_mem; 17706d1fe2cSBarry Smith extern int stack_err; 1786d385327SIbrahima Ba 1796d385327SIbrahima Ba #define PetscFunctionBegin \ 180beb17490SBarry Smith {\ 18106d1fe2cSBarry Smith if (petscstack && (petscstacksize < petscstacksize_max)) { \ 18206d1fe2cSBarry Smith if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\ 1836d385327SIbrahima Ba petscstack->function[petscstacksize] = __FUNC__; \ 1846d385327SIbrahima Ba petscstack->file[petscstacksize] = __FILE__; \ 1856d385327SIbrahima Ba petscstack->directory[petscstacksize] = __SDIR__; \ 1866d385327SIbrahima Ba petscstack->line[petscstacksize] = __LINE__; \ 1876d385327SIbrahima Ba petscstacksize++; \ 18806d1fe2cSBarry Smith if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\ 1896d385327SIbrahima Ba }} 1906d385327SIbrahima Ba 1916d385327SIbrahima Ba #define PetscStackPush(n) \ 1926d385327SIbrahima Ba {if (petscstack && (petscstacksize < petscstacksize_max)) { \ 19306d1fe2cSBarry Smith if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\ 1946d385327SIbrahima Ba petscstack->function[petscstacksize] = n; \ 1952e8a6d31SBarry Smith petscstack->file[petscstacksize] = "unknown"; \ 1962e8a6d31SBarry Smith petscstack->directory[petscstacksize] = "unknown"; \ 1976d385327SIbrahima Ba petscstack->line[petscstacksize] = 0; \ 1986d385327SIbrahima Ba petscstacksize++; \ 19906d1fe2cSBarry Smith if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\ 2006d385327SIbrahima Ba }} 2016d385327SIbrahima Ba 2026d385327SIbrahima Ba #define PetscStackPop \ 2036d385327SIbrahima Ba {if (petscstack && petscstacksize > 0) { \ 20406d1fe2cSBarry Smith if (!(stack_mem < 0)) stack_err = AMS_Memory_take_access(stack_mem);\ 2056d385327SIbrahima Ba petscstacksize--; \ 2066d385327SIbrahima Ba petscstack->function[petscstacksize] = 0; \ 2076d385327SIbrahima Ba petscstack->file[petscstacksize] = 0; \ 2086d385327SIbrahima Ba petscstack->directory[petscstacksize] = 0; \ 2096d385327SIbrahima Ba petscstack->line[petscstacksize] = 0; \ 21006d1fe2cSBarry Smith if (!(stack_mem < 0)) stack_err = AMS_Memory_grant_access(stack_mem);\ 2116d385327SIbrahima Ba }}; 2126d385327SIbrahima Ba 2136d385327SIbrahima Ba #define PetscFunctionReturn(a) \ 214beb17490SBarry Smith {\ 21506d1fe2cSBarry Smith PetscStackPop; \ 2166d385327SIbrahima Ba return(a);} 2176d385327SIbrahima Ba 2186d385327SIbrahima Ba #define PetscStackActive (petscstack != 0) 2196d385327SIbrahima Ba 2206d385327SIbrahima Ba #endif 2216d385327SIbrahima Ba 2226d385327SIbrahima Ba #else 2236d385327SIbrahima Ba 2243a40ed3dSBarry Smith #define PetscFunctionBegin 2253a40ed3dSBarry Smith #define PetscFunctionReturn(a) return(a) 226d64ed03dSBarry Smith #define PetscStackPop 227d64ed03dSBarry Smith #define PetscStackPush(f) 228d64ed03dSBarry Smith #define PetscStackActive 0 2293a40ed3dSBarry Smith 2303a40ed3dSBarry Smith #endif 2313a40ed3dSBarry Smith 2323a40ed3dSBarry Smith extern int PetscStackCreate(int); 2333a40ed3dSBarry Smith extern int PetscStackView(Viewer); 234cf256101SBarry Smith extern int PetscStackDestroy(void); 235f2b01315SBarry Smith extern int PetscStackPublish(void); 236f2b01315SBarry Smith extern int PetscStackDepublish(void); 2373a40ed3dSBarry Smith 23806d1fe2cSBarry Smith /* 23906d1fe2cSBarry Smith For locking and unlocking AMS memories associated with 24006d1fe2cSBarry Smith PETSc objects 24106d1fe2cSBarry Smith */ 24206d1fe2cSBarry Smith 24306d1fe2cSBarry Smith #if defined(HAVE_AMS) 24406d1fe2cSBarry Smith #define PetscAMSTakeAccess(obj) \ 24506d1fe2cSBarry Smith ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_take_access(((PetscObject)(obj))->amem)); 24606d1fe2cSBarry Smith #define PetscAMSGrantAccess(obj) \ 24706d1fe2cSBarry Smith ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_grant_access(((PetscObject)(obj))->amem)); 24806d1fe2cSBarry Smith #else 24906d1fe2cSBarry Smith #define PetscAMSTakeAccess(obj) 25006d1fe2cSBarry Smith #define PetscAMSGrantAccess(obj) 25154a8ef01SBarry Smith #endif 25206d1fe2cSBarry Smith 25306d1fe2cSBarry Smith #endif 25406d1fe2cSBarry Smith 255