154a8ef01SBarry Smith /* 2f621e05eSBarry Smith Contains all error handling interfaces for PETSc. 354a8ef01SBarry Smith */ 445d48df9SBarry Smith #if !defined(__PETSCERROR_H) 545d48df9SBarry Smith #define __PETSCERROR_H 66c7e564aSBarry Smith 754a8ef01SBarry Smith /* 8329ffe3dSLois Curfman McInnes These are the generic error codes. These error codes are used 9e2d1d2b7SBarry Smith many different places in the PETSc source code. The string versions are 100e5e90baSSatish Balay at src/sys/error/err.c any changes here must also be made there 11af0996ceSBarry Smith These are also define in include/petsc/finclude/petscerror.h any CHANGES here 120f9cf654SBarry Smith must be also made there. 1345d48df9SBarry Smith 1454a8ef01SBarry Smith */ 152a6744ebSBarry Smith #define PETSC_ERR_MIN_VALUE 54 /* should always be one less then the smallest value */ 162a6744ebSBarry Smith 1745d48df9SBarry Smith #define PETSC_ERR_MEM 55 /* unable to allocate requested memory */ 1847794344SBarry Smith #define PETSC_ERR_SUP 56 /* no support for requested operation */ 19e2d1d2b7SBarry Smith #define PETSC_ERR_SUP_SYS 57 /* no support for requested operation on this computer system */ 20e2d1d2b7SBarry Smith #define PETSC_ERR_ORDER 58 /* operation done in wrong order */ 2145d48df9SBarry Smith #define PETSC_ERR_SIG 59 /* signal received */ 22f1caa5a4SBarry Smith #define PETSC_ERR_FP 72 /* floating point exception */ 23a8c6a408SBarry Smith #define PETSC_ERR_COR 74 /* corrupted PETSc object */ 24a8c6a408SBarry Smith #define PETSC_ERR_LIB 76 /* error in library called by PETSc */ 25329ffe3dSLois Curfman McInnes #define PETSC_ERR_PLIB 77 /* PETSc library generated inconsistent data */ 26329ffe3dSLois Curfman McInnes #define PETSC_ERR_MEMC 78 /* memory corruption */ 27b3cc6726SBarry Smith #define PETSC_ERR_CONV_FAILED 82 /* iterative method (KSP or SNES) failed */ 281302d50aSBarry Smith #define PETSC_ERR_USER 83 /* user has not provided needed function */ 294e2ffeddSBarry Smith #define PETSC_ERR_SYS 88 /* error in system call */ 30a8b45ee7SBarry Smith #define PETSC_ERR_POINTER 70 /* pointer does not point to valid address */ 3145d48df9SBarry Smith 3245d48df9SBarry Smith #define PETSC_ERR_ARG_SIZ 60 /* nonconforming object sizes used in operation */ 3345d48df9SBarry Smith #define PETSC_ERR_ARG_IDN 61 /* two arguments not allowed to be the same */ 34a8c6a408SBarry Smith #define PETSC_ERR_ARG_WRONG 62 /* wrong argument (but object probably ok) */ 3545d48df9SBarry Smith #define PETSC_ERR_ARG_CORRUPT 64 /* null or corrupted PETSc object as argument */ 3645d48df9SBarry Smith #define PETSC_ERR_ARG_OUTOFRANGE 63 /* input argument, out of range */ 374f227f7cSBarry Smith #define PETSC_ERR_ARG_BADPTR 68 /* invalid pointer argument */ 384f227f7cSBarry Smith #define PETSC_ERR_ARG_NOTSAMETYPE 69 /* two args must be same object type */ 396831982aSBarry Smith #define PETSC_ERR_ARG_NOTSAMECOMM 80 /* two args must be same communicators */ 40d252947aSBarry Smith #define PETSC_ERR_ARG_WRONGSTATE 73 /* object in argument is in wrong state, e.g. unassembled mat */ 418cda6cd7SBarry Smith #define PETSC_ERR_ARG_TYPENOTSET 89 /* the type of the object has not yet been set */ 42a8c6a408SBarry Smith #define PETSC_ERR_ARG_INCOMP 75 /* two arguments are incompatible */ 434482741eSBarry Smith #define PETSC_ERR_ARG_NULL 85 /* argument is null that should not be */ 44958c9bccSBarry Smith #define PETSC_ERR_ARG_UNKNOWN_TYPE 86 /* type name doesn't match any registered type */ 454f227f7cSBarry Smith 464f227f7cSBarry Smith #define PETSC_ERR_FILE_OPEN 65 /* unable to open file */ 474f227f7cSBarry Smith #define PETSC_ERR_FILE_READ 66 /* unable to read from file */ 484f227f7cSBarry Smith #define PETSC_ERR_FILE_WRITE 67 /* unable to write to file */ 49a8c6a408SBarry Smith #define PETSC_ERR_FILE_UNEXPECTED 79 /* unexpected data in file */ 5045d48df9SBarry Smith 51329ffe3dSLois Curfman McInnes #define PETSC_ERR_MAT_LU_ZRPVT 71 /* detected a zero pivot during LU factorization */ 529e3b2f23SBarry Smith #define PETSC_ERR_MAT_CH_ZRPVT 81 /* detected a zero pivot during Cholesky factorization */ 5354a8ef01SBarry Smith 5468e69593SBarry Smith #define PETSC_ERR_INT_OVERFLOW 84 553855c12bSBarry Smith 56bf3909cdSBarry Smith #define PETSC_ERR_FLOP_COUNT 90 57e113a28aSBarry Smith #define PETSC_ERR_NOT_CONVERGED 91 /* solver did not converge */ 5892e8f287SBarry Smith #define PETSC_ERR_MISSING_FACTOR 92 /* MatGetFactor() failed */ 59c5a392abSBarry Smith #define PETSC_ERR_OPT_OVERWRITE 93 /* attempted to over wrote options which should not be changed */ 602a6744ebSBarry Smith 61c5a392abSBarry Smith #define PETSC_ERR_MAX_VALUE 94 /* this is always the one more than the largest error code */ 62b9eb5ee8SHong Zhang 6359aaf355SLisandro Dalcin #define PetscStringizeArg(a) #a 6459aaf355SLisandro Dalcin #define PetscStringize(a) PetscStringizeArg(a) 65330cf3c9SBarry Smith 66e8b7e333SSatish Balay #if defined(PETSC_USE_ERRORCHECKING) 67e8b7e333SSatish Balay 6830de9b25SBarry Smith /*MC 691957e957SBarry Smith SETERRQ - Macro to be called when an error has been detected, 7030de9b25SBarry Smith 7130de9b25SBarry Smith Synopsis: 72aaa7dc30SBarry Smith #include <petscsys.h> 733af045c5SBarry Smith PetscErrorCode SETERRQ(MPI_Comm comm,PetscErrorCode ierr,char *message) 7430de9b25SBarry Smith 753af045c5SBarry Smith Collective on MPI_Comm 7630de9b25SBarry Smith 7730de9b25SBarry Smith Input Parameters: 783af045c5SBarry Smith + comm - A communicator, use PETSC_COMM_SELF unless you know all ranks of another communicator will detect the error 793af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 8030de9b25SBarry Smith - message - error message 8130de9b25SBarry Smith 8230de9b25SBarry Smith Level: beginner 8330de9b25SBarry Smith 8430de9b25SBarry Smith Notes: 8530de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 8630de9b25SBarry Smith 8730de9b25SBarry Smith See SETERRQ1(), SETERRQ2(), SETERRQ3() for versions that take arguments 8830de9b25SBarry Smith 8958ebbce7SBarry Smith In Fortran MPI_Abort() is always called 9030de9b25SBarry Smith 9130de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 9230de9b25SBarry Smith 9330de9b25SBarry Smith Concepts: error^setting condition 9430de9b25SBarry Smith 9591d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3() 9630de9b25SBarry Smith M*/ 973af045c5SBarry Smith #define SETERRQ(comm,ierr,s) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s) 9830de9b25SBarry Smith 9930de9b25SBarry Smith /*MC 10030de9b25SBarry Smith SETERRQ1 - Macro that is called when an error has been detected, 10130de9b25SBarry Smith 10230de9b25SBarry Smith Synopsis: 103aaa7dc30SBarry Smith #include <petscsys.h> 1043af045c5SBarry Smith PetscErrorCode SETERRQ1(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg) 10530de9b25SBarry Smith 1063af045c5SBarry Smith Collective on MPI_Comm 10730de9b25SBarry Smith 10830de9b25SBarry Smith Input Parameters: 109fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 1103af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 11130de9b25SBarry Smith . message - error message in the printf format 11230de9b25SBarry Smith - arg - argument (for example an integer, string or double) 11330de9b25SBarry Smith 11430de9b25SBarry Smith Level: beginner 11530de9b25SBarry Smith 11630de9b25SBarry Smith Notes: 11730de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 11830de9b25SBarry Smith 11930de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 12030de9b25SBarry Smith 12130de9b25SBarry Smith Concepts: error^setting condition 12230de9b25SBarry Smith 12391d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ(), SETERRQ2(), SETERRQ3() 12430de9b25SBarry Smith M*/ 1253af045c5SBarry Smith #define SETERRQ1(comm,ierr,s,a1) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1) 12630de9b25SBarry Smith 12730de9b25SBarry Smith /*MC 12830de9b25SBarry Smith SETERRQ2 - Macro that is called when an error has been detected, 12930de9b25SBarry Smith 13030de9b25SBarry Smith Synopsis: 131aaa7dc30SBarry Smith #include <petscsys.h> 1323af045c5SBarry Smith PetscErrorCode SETERRQ2(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2) 13330de9b25SBarry Smith 1343af045c5SBarry Smith Collective on MPI_Comm 13530de9b25SBarry Smith 13630de9b25SBarry Smith Input Parameters: 137fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 1383af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 13930de9b25SBarry Smith . message - error message in the printf format 14030de9b25SBarry Smith . arg1 - argument (for example an integer, string or double) 14130de9b25SBarry Smith - arg2 - argument (for example an integer, string or double) 14230de9b25SBarry Smith 14330de9b25SBarry Smith Level: beginner 14430de9b25SBarry Smith 14530de9b25SBarry Smith Notes: 14630de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 14730de9b25SBarry Smith 14830de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 14930de9b25SBarry Smith 15030de9b25SBarry Smith Concepts: error^setting condition 15130de9b25SBarry Smith 1526024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ3() 15330de9b25SBarry Smith M*/ 1543af045c5SBarry Smith #define SETERRQ2(comm,ierr,s,a1,a2) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2) 15530de9b25SBarry Smith 15630de9b25SBarry Smith /*MC 15730de9b25SBarry Smith SETERRQ3 - Macro that is called when an error has been detected, 15830de9b25SBarry Smith 15930de9b25SBarry Smith Synopsis: 160aaa7dc30SBarry Smith #include <petscsys.h> 1613af045c5SBarry Smith PetscErrorCode SETERRQ3(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3) 16230de9b25SBarry Smith 1633af045c5SBarry Smith Collective on MPI_Comm 16430de9b25SBarry Smith 16530de9b25SBarry Smith Input Parameters: 166fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 1673af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 16830de9b25SBarry Smith . message - error message in the printf format 16930de9b25SBarry Smith . arg1 - argument (for example an integer, string or double) 17030de9b25SBarry Smith . arg2 - argument (for example an integer, string or double) 17130de9b25SBarry Smith - arg3 - argument (for example an integer, string or double) 17230de9b25SBarry Smith 17330de9b25SBarry Smith Level: beginner 17430de9b25SBarry Smith 17530de9b25SBarry Smith Notes: 17630de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 17730de9b25SBarry Smith 178f621e05eSBarry Smith There are also versions for 4, 5, 6 and 7 arguments. 179f621e05eSBarry Smith 18030de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 18130de9b25SBarry Smith 18230de9b25SBarry Smith Concepts: error^setting condition 18330de9b25SBarry Smith 1846024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 18530de9b25SBarry Smith M*/ 1863af045c5SBarry Smith #define SETERRQ3(comm,ierr,s,a1,a2,a3) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3) 18730de9b25SBarry Smith 188fa190f98SMatthew G. Knepley /*MC 189fa190f98SMatthew G. Knepley SETERRQ4 - Macro that is called when an error has been detected, 190fa190f98SMatthew G. Knepley 191fa190f98SMatthew G. Knepley Synopsis: 192fa190f98SMatthew G. Knepley #include <petscsys.h> 1933af045c5SBarry Smith PetscErrorCode SETERRQ4(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3) 194fa190f98SMatthew G. Knepley 1953af045c5SBarry Smith Collective on MPI_Comm 196fa190f98SMatthew G. Knepley 197fa190f98SMatthew G. Knepley Input Parameters: 198fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 1993af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 200fa190f98SMatthew G. Knepley . message - error message in the printf format 201fa190f98SMatthew G. Knepley . arg1 - argument (for example an integer, string or double) 202fa190f98SMatthew G. Knepley . arg2 - argument (for example an integer, string or double) 203fa190f98SMatthew G. Knepley . arg3 - argument (for example an integer, string or double) 204fa190f98SMatthew G. Knepley - arg4 - argument (for example an integer, string or double) 205fa190f98SMatthew G. Knepley 206fa190f98SMatthew G. Knepley Level: beginner 207fa190f98SMatthew G. Knepley 208fa190f98SMatthew G. Knepley Notes: 209fa190f98SMatthew G. Knepley Once the error handler is called the calling function is then returned from with the given error code. 210fa190f98SMatthew G. Knepley 211fa190f98SMatthew G. Knepley There are also versions for 4, 5, 6 and 7 arguments. 212fa190f98SMatthew G. Knepley 213fa190f98SMatthew G. Knepley Experienced users can set the error handler with PetscPushErrorHandler(). 214fa190f98SMatthew G. Knepley 215fa190f98SMatthew G. Knepley Concepts: error^setting condition 216fa190f98SMatthew G. Knepley 217fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 218fa190f98SMatthew G. Knepley M*/ 2193af045c5SBarry Smith #define SETERRQ4(comm,ierr,s,a1,a2,a3,a4) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4) 220fa190f98SMatthew G. Knepley 221fa190f98SMatthew G. Knepley /*MC 222fa190f98SMatthew G. Knepley SETERRQ5 - Macro that is called when an error has been detected, 223fa190f98SMatthew G. Knepley 224fa190f98SMatthew G. Knepley Synopsis: 225fa190f98SMatthew G. Knepley #include <petscsys.h> 2263af045c5SBarry Smith PetscErrorCode SETERRQ5(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3) 227fa190f98SMatthew G. Knepley 2283af045c5SBarry Smith Collective on MPI_COmm 229fa190f98SMatthew G. Knepley 230fa190f98SMatthew G. Knepley Input Parameters: 231fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 2323af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 233fa190f98SMatthew G. Knepley . message - error message in the printf format 234fa190f98SMatthew G. Knepley . arg1 - argument (for example an integer, string or double) 235fa190f98SMatthew G. Knepley . arg2 - argument (for example an integer, string or double) 236fa190f98SMatthew G. Knepley . arg3 - argument (for example an integer, string or double) 237fa190f98SMatthew G. Knepley . arg4 - argument (for example an integer, string or double) 238fa190f98SMatthew G. Knepley - arg5 - argument (for example an integer, string or double) 239fa190f98SMatthew G. Knepley 240fa190f98SMatthew G. Knepley Level: beginner 241fa190f98SMatthew G. Knepley 242fa190f98SMatthew G. Knepley Notes: 243fa190f98SMatthew G. Knepley Once the error handler is called the calling function is then returned from with the given error code. 244fa190f98SMatthew G. Knepley 245fa190f98SMatthew G. Knepley There are also versions for 4, 5, 6 and 7 arguments. 246fa190f98SMatthew G. Knepley 247fa190f98SMatthew G. Knepley Experienced users can set the error handler with PetscPushErrorHandler(). 248fa190f98SMatthew G. Knepley 249fa190f98SMatthew G. Knepley Concepts: error^setting condition 250fa190f98SMatthew G. Knepley 251fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 252fa190f98SMatthew G. Knepley M*/ 2533af045c5SBarry Smith #define SETERRQ5(comm,ierr,s,a1,a2,a3,a4,a5) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5) 254fa190f98SMatthew G. Knepley 255fa190f98SMatthew G. Knepley /*MC 256fa190f98SMatthew G. Knepley SETERRQ6 - Macro that is called when an error has been detected, 257fa190f98SMatthew G. Knepley 258fa190f98SMatthew G. Knepley Synopsis: 259fa190f98SMatthew G. Knepley #include <petscsys.h> 2603af045c5SBarry Smith PetscErrorCode SETERRQ6(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3) 261fa190f98SMatthew G. Knepley 2623af045c5SBarry Smith Collective on MPI_Comm 263fa190f98SMatthew G. Knepley 264fa190f98SMatthew G. Knepley Input Parameters: 265fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 2663af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 267fa190f98SMatthew G. Knepley . message - error message in the printf format 268fa190f98SMatthew G. Knepley . arg1 - argument (for example an integer, string or double) 269fa190f98SMatthew G. Knepley . arg2 - argument (for example an integer, string or double) 270fa190f98SMatthew G. Knepley . arg3 - argument (for example an integer, string or double) 271fa190f98SMatthew G. Knepley . arg4 - argument (for example an integer, string or double) 272fa190f98SMatthew G. Knepley . arg5 - argument (for example an integer, string or double) 273fa190f98SMatthew G. Knepley - arg6 - argument (for example an integer, string or double) 274fa190f98SMatthew G. Knepley 275fa190f98SMatthew G. Knepley Level: beginner 276fa190f98SMatthew G. Knepley 277fa190f98SMatthew G. Knepley Notes: 278fa190f98SMatthew G. Knepley Once the error handler is called the calling function is then returned from with the given error code. 279fa190f98SMatthew G. Knepley 280fa190f98SMatthew G. Knepley There are also versions for 4, 5, 6 and 7 arguments. 281fa190f98SMatthew G. Knepley 282fa190f98SMatthew G. Knepley Experienced users can set the error handler with PetscPushErrorHandler(). 283fa190f98SMatthew G. Knepley 284fa190f98SMatthew G. Knepley Concepts: error^setting condition 285fa190f98SMatthew G. Knepley 286fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 287fa190f98SMatthew G. Knepley M*/ 2883af045c5SBarry Smith #define SETERRQ6(comm,ierr,s,a1,a2,a3,a4,a5,a6) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6) 289fa190f98SMatthew G. Knepley 290fa190f98SMatthew G. Knepley /*MC 291fa190f98SMatthew G. Knepley SETERRQ7 - Macro that is called when an error has been detected, 292fa190f98SMatthew G. Knepley 293fa190f98SMatthew G. Knepley Synopsis: 294fa190f98SMatthew G. Knepley #include <petscsys.h> 2953af045c5SBarry Smith PetscErrorCode SETERRQ7(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3) 296fa190f98SMatthew G. Knepley 2973af045c5SBarry Smith Collective on MPI_Comm 298fa190f98SMatthew G. Knepley 299fa190f98SMatthew G. Knepley Input Parameters: 300fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 3013af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 302fa190f98SMatthew G. Knepley . message - error message in the printf format 303fa190f98SMatthew G. Knepley . arg1 - argument (for example an integer, string or double) 304fa190f98SMatthew G. Knepley . arg2 - argument (for example an integer, string or double) 305fa190f98SMatthew G. Knepley . arg3 - argument (for example an integer, string or double) 306fa190f98SMatthew G. Knepley . arg4 - argument (for example an integer, string or double) 307fa190f98SMatthew G. Knepley . arg5 - argument (for example an integer, string or double) 308fa190f98SMatthew G. Knepley . arg6 - argument (for example an integer, string or double) 309fa190f98SMatthew G. Knepley - arg7 - argument (for example an integer, string or double) 310fa190f98SMatthew G. Knepley 311fa190f98SMatthew G. Knepley Level: beginner 312fa190f98SMatthew G. Knepley 313fa190f98SMatthew G. Knepley Notes: 314fa190f98SMatthew G. Knepley Once the error handler is called the calling function is then returned from with the given error code. 315fa190f98SMatthew G. Knepley 316fa190f98SMatthew G. Knepley There are also versions for 4, 5, 6 and 7 arguments. 317fa190f98SMatthew G. Knepley 318fa190f98SMatthew G. Knepley Experienced users can set the error handler with PetscPushErrorHandler(). 319fa190f98SMatthew G. Knepley 320fa190f98SMatthew G. Knepley Concepts: error^setting condition 321fa190f98SMatthew G. Knepley 322fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 323fa190f98SMatthew G. Knepley M*/ 3243af045c5SBarry Smith #define SETERRQ7(comm,ierr,s,a1,a2,a3,a4,a5,a6,a7) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7) 325fa190f98SMatthew G. Knepley 326fa190f98SMatthew G. Knepley /*MC 327fa190f98SMatthew G. Knepley SETERRQ8 - Macro that is called when an error has been detected, 328fa190f98SMatthew G. Knepley 329fa190f98SMatthew G. Knepley Synopsis: 330fa190f98SMatthew G. Knepley #include <petscsys.h> 3313af045c5SBarry Smith PetscErrorCode SETERRQ8(MPI_Comm comm,PetscErrorCode ierr,char *formatmessage,arg1,arg2,arg3) 332fa190f98SMatthew G. Knepley 3333af045c5SBarry Smith Collective on MPI_Comm 334fa190f98SMatthew G. Knepley 335fa190f98SMatthew G. Knepley Input Parameters: 336fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 3373af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 338fa190f98SMatthew G. Knepley . message - error message in the printf format 339fa190f98SMatthew G. Knepley . arg1 - argument (for example an integer, string or double) 340fa190f98SMatthew G. Knepley . arg2 - argument (for example an integer, string or double) 341fa190f98SMatthew G. Knepley . arg3 - argument (for example an integer, string or double) 342fa190f98SMatthew G. Knepley . arg4 - argument (for example an integer, string or double) 343fa190f98SMatthew G. Knepley . arg5 - argument (for example an integer, string or double) 344fa190f98SMatthew G. Knepley . arg6 - argument (for example an integer, string or double) 345fa190f98SMatthew G. Knepley . arg7 - argument (for example an integer, string or double) 346fa190f98SMatthew G. Knepley - arg8 - argument (for example an integer, string or double) 347fa190f98SMatthew G. Knepley 348fa190f98SMatthew G. Knepley Level: beginner 349fa190f98SMatthew G. Knepley 350fa190f98SMatthew G. Knepley Notes: 351fa190f98SMatthew G. Knepley Once the error handler is called the calling function is then returned from with the given error code. 352fa190f98SMatthew G. Knepley 353fa190f98SMatthew G. Knepley There are also versions for 4, 5, 6 and 7 arguments. 354fa190f98SMatthew G. Knepley 355fa190f98SMatthew G. Knepley Experienced users can set the error handler with PetscPushErrorHandler(). 356fa190f98SMatthew G. Knepley 357fa190f98SMatthew G. Knepley Concepts: error^setting condition 358fa190f98SMatthew G. Knepley 359fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 360fa190f98SMatthew G. Knepley M*/ 3613af045c5SBarry Smith #define SETERRQ8(comm,ierr,s,a1,a2,a3,a4,a5,a6,a7,a8) return PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s,a1,a2,a3,a4,a5,a6,a7,a8) 362fa190f98SMatthew G. Knepley 363fa190f98SMatthew G. Knepley /*MC 364fa190f98SMatthew G. Knepley SETERRABORT - Macro that can be called when an error has been detected, 365fa190f98SMatthew G. Knepley 366fa190f98SMatthew G. Knepley Synopsis: 367fa190f98SMatthew G. Knepley #include <petscsys.h> 3683af045c5SBarry Smith PetscErrorCode SETERRABORT(MPI_Comm comm,PetscErrorCode ierr,char *message) 369fa190f98SMatthew G. Knepley 3703af045c5SBarry Smith Collective on MPI_Comm 371fa190f98SMatthew G. Knepley 372fa190f98SMatthew G. Knepley Input Parameters: 373fa190f98SMatthew G. Knepley + comm - A communicator, so that the error can be collective 3743af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 375fa190f98SMatthew G. Knepley - message - error message in the printf format 376fa190f98SMatthew G. Knepley 377fa190f98SMatthew G. Knepley Level: beginner 378fa190f98SMatthew G. Knepley 379fa190f98SMatthew G. Knepley Notes: 380fa190f98SMatthew G. Knepley This function just calls MPI_Abort(). 381fa190f98SMatthew G. Knepley 382fa190f98SMatthew G. Knepley Concepts: error^setting condition 383fa190f98SMatthew G. Knepley 384fa190f98SMatthew G. Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), CHKERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2() 385fa190f98SMatthew G. Knepley M*/ 3863af045c5SBarry Smith #define SETERRABORT(comm,ierr,s) do {PetscError(comm,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_INITIAL,s);MPI_Abort(comm,ierr);} while (0) 3879a00fa46SSatish Balay 38830de9b25SBarry Smith /*MC 38930de9b25SBarry Smith CHKERRQ - Checks error code, if non-zero it calls the error handler and then returns 39030de9b25SBarry Smith 39130de9b25SBarry Smith Synopsis: 392aaa7dc30SBarry Smith #include <petscsys.h> 3933af045c5SBarry Smith PetscErrorCode CHKERRQ(PetscErrorCode ierr) 39430de9b25SBarry Smith 395eca87e8dSBarry Smith Not Collective 39630de9b25SBarry Smith 39730de9b25SBarry Smith Input Parameters: 3983af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 39930de9b25SBarry Smith 40030de9b25SBarry Smith Level: beginner 40130de9b25SBarry Smith 40230de9b25SBarry Smith Notes: 40330de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 40430de9b25SBarry Smith 40530de9b25SBarry Smith Experienced users can set the error handler with PetscPushErrorHandler(). 4065324ea47SKris Buschelman 4073af045c5SBarry Smith CHKERRQ(ierr) is fundamentally a macro replacement for 4083af045c5SBarry Smith if (ierr) return(PetscError(...,ierr,...)); 4095324ea47SKris Buschelman 4105324ea47SKris Buschelman Although typical usage resembles "void CHKERRQ(PetscErrorCode)" as described above, for certain uses it is 4115324ea47SKris Buschelman highly inappropriate to use it in this manner as it invokes return(PetscErrorCode). In particular, 4125324ea47SKris Buschelman it cannot be used in functions which return(void) or any other datatype. In these types of functions, 41358ebbce7SBarry Smith you can use CHKERRV() which returns without an error code (bad idea since the error is ignored or 4143af045c5SBarry Smith if (ierr) {PetscError(....); return(YourReturnType);} 4150298fd71SBarry Smith where you may pass back a NULL to indicate an error. You can also call CHKERRABORT(comm,n) to have 41658ebbce7SBarry Smith MPI_Abort() returned immediately. 41758ebbce7SBarry Smith 41858ebbce7SBarry Smith In Fortran MPI_Abort() is always called 41930de9b25SBarry Smith 42030de9b25SBarry Smith Concepts: error^setting condition 42130de9b25SBarry Smith 42291d3bdf4SKris Buschelman .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ2() 42330de9b25SBarry Smith M*/ 4243af045c5SBarry Smith #define CHKERRQ(ierr) do {if (PetscUnlikely(ierr)) return PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");} while (0) 42530de9b25SBarry Smith 426*f01fac0dSBarry Smith #define CHKERRV(ierr) do {if (PetscUnlikely(ierr)) {ierr = PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");return;}} while(0) 4273af045c5SBarry Smith #define CHKERRABORT(comm,ierr) do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");MPI_Abort(comm,ierr);}} while (0) 4283af045c5SBarry Smith #define CHKERRCONTINUE(ierr) do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_REPEAT," ");}} while (0) 42985614651SBarry Smith 430fd705b32SMatthew Knepley #ifdef PETSC_CLANGUAGE_CXX 431fd705b32SMatthew Knepley 432cc26af49SMatthew Knepley /*MC 433cc26af49SMatthew Knepley CHKERRXX - Checks error code, if non-zero it calls the C++ error handler which throws an exception 434cc26af49SMatthew Knepley 435cc26af49SMatthew Knepley Synopsis: 436aaa7dc30SBarry Smith #include <petscsys.h> 4373af045c5SBarry Smith void CHKERRXX(PetscErrorCode ierr) 438cc26af49SMatthew Knepley 439eca87e8dSBarry Smith Not Collective 440cc26af49SMatthew Knepley 441cc26af49SMatthew Knepley Input Parameters: 4423af045c5SBarry Smith . ierr - nonzero error code, see the list of standard error codes in include/petscerror.h 443cc26af49SMatthew Knepley 444cc26af49SMatthew Knepley Level: beginner 445cc26af49SMatthew Knepley 446cc26af49SMatthew Knepley Notes: 447cc26af49SMatthew Knepley Once the error handler throws a ??? exception. 448cc26af49SMatthew Knepley 449cc26af49SMatthew Knepley You can use CHKERRV() which returns without an error code (bad idea since the error is ignored) 450cc26af49SMatthew Knepley or CHKERRABORT(comm,n) to have MPI_Abort() returned immediately. 451cc26af49SMatthew Knepley 452cc26af49SMatthew Knepley Concepts: error^setting condition 453cc26af49SMatthew Knepley 454cc26af49SMatthew Knepley .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKERRQ(), CHKMEMQ 455cc26af49SMatthew Knepley M*/ 4563af045c5SBarry Smith #define CHKERRXX(ierr) do {if (PetscUnlikely(ierr)) {PetscError(PETSC_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,ierr,PETSC_ERROR_IN_CXX,0);}} while(0) 457fd705b32SMatthew Knepley 458fd705b32SMatthew Knepley #endif 459fd705b32SMatthew Knepley 4605be1650bSAlejandro Lamas Daviña #define CHKERRCUDA(err) do {if (PetscUnlikely(err)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUDA error %d",err);} while(0) 4615be1650bSAlejandro Lamas Daviña #define CHKERRCUBLAS(err) do {if (PetscUnlikely(err)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"CUBLAS error %d",err);} while(0) 46282f73ecaSAlejandro Lamas Daviña 46330de9b25SBarry Smith /*MC 46430de9b25SBarry Smith CHKMEMQ - Checks the memory for corruption, calls error handler if any is detected 46530de9b25SBarry Smith 46630de9b25SBarry Smith Synopsis: 467aaa7dc30SBarry Smith #include <petscsys.h> 46891d3bdf4SKris Buschelman CHKMEMQ; 46930de9b25SBarry Smith 470eca87e8dSBarry Smith Not Collective 471eca87e8dSBarry Smith 47230de9b25SBarry Smith Level: beginner 47330de9b25SBarry Smith 47430de9b25SBarry Smith Notes: 4751957e957SBarry Smith We highly recommend using valgrind http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind for finding memory problems. This is useful 4761957e957SBarry Smith on systems that do not have valgrind, but much much less useful. 4771957e957SBarry Smith 478ff002950SBarry Smith Must run with the option -malloc_debug to enable this option 47930de9b25SBarry Smith 48030de9b25SBarry Smith Once the error handler is called the calling function is then returned from with the given error code. 48130de9b25SBarry Smith 48230de9b25SBarry Smith By defaults prints location where memory that is corrupted was allocated. 48330de9b25SBarry Smith 484f621e05eSBarry Smith Use CHKMEMA for functions that return void 485f621e05eSBarry Smith 48630de9b25SBarry Smith Concepts: memory corruption 48730de9b25SBarry Smith 4886024bd2cSBarry Smith .seealso: PetscTraceBackErrorHandler(), PetscPushErrorHandler(), PetscError(), SETERRQ(), CHKMEMQ, SETERRQ1(), SETERRQ2(), SETERRQ3(), 489ff002950SBarry Smith PetscMallocValidate() 49030de9b25SBarry Smith M*/ 491efca3c55SSatish Balay #define CHKMEMQ do {PetscErrorCode _7_ierr = PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__);CHKERRQ(_7_ierr);} while(0) 49285614651SBarry Smith 493efca3c55SSatish Balay #define CHKMEMA PetscMallocValidate(__LINE__,PETSC_FUNCTION_NAME,__FILE__) 494e68848bdSBarry Smith 495f8e50935SSatish Balay #else /* PETSC_USE_ERRORCHECKING */ 496f621e05eSBarry Smith 497f621e05eSBarry Smith /* 498e2e64c6bSBarry Smith These are defined to be empty for when error checking is turned off, with ./configure --with-errorchecking=0 499f621e05eSBarry Smith */ 500f621e05eSBarry Smith 5013af045c5SBarry Smith #define SETERRQ(c,ierr,s) 5023af045c5SBarry Smith #define SETERRQ1(c,ierr,s,a1) 5033af045c5SBarry Smith #define SETERRQ2(c,ierr,s,a1,a2) 5043af045c5SBarry Smith #define SETERRQ3(c,ierr,s,a1,a2,a3) 5053af045c5SBarry Smith #define SETERRQ4(c,ierr,s,a1,a2,a3,a4) 5063af045c5SBarry Smith #define SETERRQ5(c,ierr,s,a1,a2,a3,a4,a5) 5073af045c5SBarry Smith #define SETERRQ6(c,ierr,s,a1,a2,a3,a4,a5,a6) 5083af045c5SBarry Smith #define SETERRQ7(c,ierr,s,a1,a2,a3,a4,a5,a6,a7) 5093af045c5SBarry Smith #define SETERRQ8(c,ierr,s,a1,a2,a3,a4,a5,a6,a7,a8) 5103af045c5SBarry Smith #define SETERRABORT(comm,ierr,s) 51185614651SBarry Smith 5123af045c5SBarry Smith #define CHKERRQ(ierr) ; 5133af045c5SBarry Smith #define CHKERRV(ierr) ; 5141ee4faa0SMatthew Knepley #define CHKERRABORT(comm,n) ; 5153af045c5SBarry Smith #define CHKERRCONTINUE(ierr) ; 51685614651SBarry Smith #define CHKMEMQ ; 51782f73ecaSAlejandro Lamas Daviña #define CHKERRCUDA(err) ; 51882f73ecaSAlejandro Lamas Daviña #define CHKERRCUBLAS(err) ; 51985614651SBarry Smith 5208cabf42eSMatthew G Knepley #ifdef PETSC_CLANGUAGE_CXX 5213af045c5SBarry Smith #define CHKERRXX(ierr) ; 5228cabf42eSMatthew G Knepley #endif 5238cabf42eSMatthew G Knepley 524f8e50935SSatish Balay #endif /* PETSC_USE_ERRORCHECKING */ 52554a8ef01SBarry Smith 526668f157eSBarry Smith /*E 527668f157eSBarry Smith PetscErrorType - passed to the PETSc error handling routines indicating if this is the first or a later call to the error handlers 528668f157eSBarry Smith 529668f157eSBarry Smith Level: advanced 530668f157eSBarry Smith 531d736bfebSBarry Smith PETSC_ERROR_IN_CXX indicates the error was detected in C++ and an exception should be generated 532d736bfebSBarry Smith 53361b0d812SBarry Smith Developer Notes: This is currently used to decide when to print the detailed information about the run in PetscTraceBackErrorHandler() 534668f157eSBarry Smith 535d736bfebSBarry Smith .seealso: PetscError(), SETERRXX() 536668f157eSBarry Smith E*/ 537d736bfebSBarry Smith typedef enum {PETSC_ERROR_INITIAL=0,PETSC_ERROR_REPEAT=1,PETSC_ERROR_IN_CXX = 2} PetscErrorType; 5384b209cf6SBarry Smith 539eb9e708aSLisandro Dalcin #if defined(__clang_analyzer__) 540eb9e708aSLisandro Dalcin __attribute__((analyzer_noreturn)) 541eb9e708aSLisandro Dalcin #endif 542eb9e708aSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscError(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,...); 543eb9e708aSLisandro Dalcin 544014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorPrintfInitialize(void); 545014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscErrorMessage(int,const char*[],char **); 546efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscTraceBackErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 547efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscIgnoreErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 548efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 549efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscMPIAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 550efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscAbortErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 551efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscAttachDebuggerErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 552efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscReturnErrorHandler(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*); 553efca3c55SSatish Balay PETSC_EXTERN PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm,int,const char*,const char*,PetscErrorCode,PetscErrorType,const char*,void*),void*); 554014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopErrorHandler(void); 5558d359177SBarry Smith PETSC_EXTERN PetscErrorCode PetscSignalHandlerDefault(int,void*); 556014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPushSignalHandler(PetscErrorCode (*)(int,void *),void*); 557014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscPopSignalHandler(void); 55828559dc8SJed Brown PETSC_EXTERN PetscErrorCode PetscCheckPointerSetIntensity(PetscInt); 559329f5518SBarry Smith 560639ff905SBarry Smith /*MC 561639ff905SBarry Smith PetscErrorPrintf - Prints error messages. 562639ff905SBarry Smith 563639ff905SBarry Smith Synopsis: 564aaa7dc30SBarry Smith #include <petscsys.h> 565639ff905SBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char format[],...); 566639ff905SBarry Smith 567639ff905SBarry Smith Not Collective 568639ff905SBarry Smith 569639ff905SBarry Smith Input Parameters: 570639ff905SBarry Smith . format - the usual printf() format string 571639ff905SBarry Smith 572639ff905SBarry Smith Options Database Keys: 5731957e957SBarry Smith + -error_output_stdout - cause error messages to be printed to stdout instead of the (default) stderr 574e1bc860dSBarry Smith - -error_output_none - to turn off all printing of error messages (does not change the way the error is handled.) 575639ff905SBarry Smith 576639ff905SBarry Smith Notes: Use 577639ff905SBarry Smith $ PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the 578639ff905SBarry Smith $ error is handled.) and 5791957e957SBarry Smith $ PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on or you can use your own function 580639ff905SBarry Smith 581639ff905SBarry Smith Use 582639ff905SBarry Smith PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file. 583639ff905SBarry Smith PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file. 584639ff905SBarry Smith 585639ff905SBarry Smith Use 586639ff905SBarry Smith PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print 587639ff905SBarry Smith 588639ff905SBarry Smith Level: developer 589639ff905SBarry Smith 590639ff905SBarry Smith Fortran Note: 591639ff905SBarry Smith This routine is not supported in Fortran. 592639ff905SBarry Smith 593639ff905SBarry Smith Concepts: error messages^printing 594639ff905SBarry Smith Concepts: printing^error messages 595639ff905SBarry Smith 596639ff905SBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf(), PetscPrintf(), PetscErrorHandlerPush(), PetscVFPrintf(), PetscHelpPrintf() 597639ff905SBarry Smith M*/ 598639ff905SBarry Smith PETSC_EXTERN PetscErrorCode (*PetscErrorPrintf)(const char[],...); 599639ff905SBarry Smith 600329f5518SBarry Smith typedef enum {PETSC_FP_TRAP_OFF=0,PETSC_FP_TRAP_ON=1} PetscFPTrap; 601014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscSetFPTrap(PetscFPTrap); 602014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPush(PetscFPTrap); 603014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscFPTrapPop(void); 60454a8ef01SBarry Smith 6053a40ed3dSBarry Smith /* 6063a40ed3dSBarry Smith Allows the code to build a stack frame as it runs 6073a40ed3dSBarry Smith */ 6083a40ed3dSBarry Smith 60999cd645aSJed Brown #define PETSCSTACKSIZE 64 610184914b5SBarry Smith 6113a40ed3dSBarry Smith typedef struct { 6120e33f6ddSBarry Smith const char *function[PETSCSTACKSIZE]; 6130e33f6ddSBarry Smith const char *file[PETSCSTACKSIZE]; 614184914b5SBarry Smith int line[PETSCSTACKSIZE]; 615a8d2bbe5SBarry Smith PetscBool petscroutine[PETSCSTACKSIZE]; 616184914b5SBarry Smith int currentsize; 617a2f94806SJed Brown int hotdepth; 6183a40ed3dSBarry Smith } PetscStack; 6193a40ed3dSBarry Smith 6201f46d60fSShri Abhyankar PETSC_EXTERN PetscStack *petscstack; 621184914b5SBarry Smith 6226f5c2d7aSBarry Smith PetscErrorCode PetscStackCopy(PetscStack*,PetscStack*); 6236f5c2d7aSBarry Smith PetscErrorCode PetscStackPrint(PetscStack *,FILE*); 6242d7c6352SJed Brown #if defined(PETSC_USE_DEBUG) 625dbf62e16SBarry Smith PETSC_STATIC_INLINE PetscBool PetscStackActive(void) 626dbf62e16SBarry Smith { 6275c25fcd7SBarry Smith return(petscstack ? PETSC_TRUE : PETSC_FALSE); 628dbf62e16SBarry Smith } 6293a40ed3dSBarry Smith 630441dd030SJed Brown /* Stack handling is based on the following two "NoCheck" macros. These should only be called directly by other error 631441dd030SJed Brown * handling macros. We record the line of the call, which may or may not be the location of the definition. But is at 632441dd030SJed Brown * least more useful than "unknown" because it can distinguish multiple calls from the same function. 633441dd030SJed Brown */ 634441dd030SJed Brown 635a2f94806SJed Brown #define PetscStackPushNoCheck(funct,petsc_routine,hot) \ 636441dd030SJed Brown do { \ 637e04113cfSBarry Smith PetscStackSAWsTakeAccess(); \ 6385c25fcd7SBarry Smith if (petscstack && (petscstack->currentsize < PETSCSTACKSIZE)) { \ 6395c25fcd7SBarry Smith petscstack->function[petscstack->currentsize] = funct; \ 6405c25fcd7SBarry Smith petscstack->file[petscstack->currentsize] = __FILE__; \ 6415c25fcd7SBarry Smith petscstack->line[petscstack->currentsize] = __LINE__; \ 6425c25fcd7SBarry Smith petscstack->petscroutine[petscstack->currentsize] = petsc_routine; \ 6435c25fcd7SBarry Smith petscstack->currentsize++; \ 644441dd030SJed Brown } \ 6455c25fcd7SBarry Smith if (petscstack) { \ 6465c25fcd7SBarry Smith petscstack->hotdepth += (hot || petscstack->hotdepth); \ 647a2f94806SJed Brown } \ 648e04113cfSBarry Smith PetscStackSAWsGrantAccess(); \ 649441dd030SJed Brown } while (0) 650441dd030SJed Brown 651441dd030SJed Brown #define PetscStackPopNoCheck \ 6525c25fcd7SBarry Smith do { \ 653e04113cfSBarry Smith PetscStackSAWsTakeAccess(); \ 6545c25fcd7SBarry Smith if (petscstack && petscstack->currentsize > 0) { \ 6555c25fcd7SBarry Smith petscstack->currentsize--; \ 6565c25fcd7SBarry Smith petscstack->function[petscstack->currentsize] = 0; \ 6575c25fcd7SBarry Smith petscstack->file[petscstack->currentsize] = 0; \ 6585c25fcd7SBarry Smith petscstack->line[petscstack->currentsize] = 0; \ 6595c25fcd7SBarry Smith petscstack->petscroutine[petscstack->currentsize] = PETSC_FALSE;\ 660441dd030SJed Brown } \ 6615c25fcd7SBarry Smith if (petscstack) { \ 6625c25fcd7SBarry Smith petscstack->hotdepth = PetscMax(petscstack->hotdepth-1,0); \ 663a2f94806SJed Brown } \ 664e04113cfSBarry Smith PetscStackSAWsGrantAccess(); \ 665441dd030SJed Brown } while (0) 666441dd030SJed Brown 66730de9b25SBarry Smith /*MC 6681957e957SBarry Smith PetscFunctionBegin - First executable line of each PETSc function, used for error handling. Final 6691957e957SBarry Smith line of PETSc functions should be PetscFunctionReturn(0); 67030de9b25SBarry Smith 67130de9b25SBarry Smith Synopsis: 672aaa7dc30SBarry Smith #include <petscsys.h> 67330de9b25SBarry Smith void PetscFunctionBegin; 67430de9b25SBarry Smith 675eca87e8dSBarry Smith Not Collective 676eca87e8dSBarry Smith 67730de9b25SBarry Smith Usage: 67830de9b25SBarry Smith .vb 67930de9b25SBarry Smith int something; 68030de9b25SBarry Smith 68130de9b25SBarry Smith PetscFunctionBegin; 68230de9b25SBarry Smith .ve 68330de9b25SBarry Smith 68430de9b25SBarry Smith Notes: 6851957e957SBarry Smith Use PetscFunctionBeginUser for application codes. 6861957e957SBarry Smith 68730de9b25SBarry Smith Not available in Fortran 68830de9b25SBarry Smith 68930de9b25SBarry Smith Level: developer 69030de9b25SBarry Smith 6911957e957SBarry Smith .seealso: PetscFunctionReturn(), PetscFunctionBeginHot(), PetscFunctionBeginUser() 69230de9b25SBarry Smith 69330de9b25SBarry Smith .keywords: traceback, error handling 69430de9b25SBarry Smith M*/ 695441dd030SJed Brown #define PetscFunctionBegin do { \ 696a2f94806SJed Brown PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE,PETSC_FALSE); \ 697a2f94806SJed Brown PetscRegister__FUNCT__(); \ 698a2f94806SJed Brown } while (0) 699a2f94806SJed Brown 700a2f94806SJed Brown /*MC 701a2f94806SJed Brown PetscFunctionBeginHot - Substitute for PetscFunctionBegin to be used in functions that are called in 702a2f94806SJed Brown performance-critical circumstances. Use of this function allows for lighter profiling by default. 703a2f94806SJed Brown 704a2f94806SJed Brown Synopsis: 705aaa7dc30SBarry Smith #include <petscsys.h> 706a2f94806SJed Brown void PetscFunctionBeginHot; 707a2f94806SJed Brown 708a2f94806SJed Brown Not Collective 709a2f94806SJed Brown 710a2f94806SJed Brown Usage: 711a2f94806SJed Brown .vb 712a2f94806SJed Brown int something; 713a2f94806SJed Brown 714a2f94806SJed Brown PetscFunctionBeginHot; 715a2f94806SJed Brown .ve 716a2f94806SJed Brown 717a2f94806SJed Brown Notes: 718a2f94806SJed Brown Not available in Fortran 719a2f94806SJed Brown 720a2f94806SJed Brown Level: developer 721a2f94806SJed Brown 722a2f94806SJed Brown .seealso: PetscFunctionBegin, PetscFunctionReturn() 723a2f94806SJed Brown 724a2f94806SJed Brown .keywords: traceback, error handling 725a2f94806SJed Brown M*/ 726a2f94806SJed Brown #define PetscFunctionBeginHot do { \ 727a2f94806SJed Brown PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_TRUE,PETSC_TRUE); \ 7282d53ad75SBarry Smith PetscRegister__FUNCT__(); \ 72953c77d0aSJed Brown } while (0) 73053c77d0aSJed Brown 731a8d2bbe5SBarry Smith /*MC 732a8d2bbe5SBarry Smith PetscFunctionBeginUser - First executable line of user provided PETSc routine 733a8d2bbe5SBarry Smith 734a8d2bbe5SBarry Smith Synopsis: 735aaa7dc30SBarry Smith #include <petscsys.h> 736a8d2bbe5SBarry Smith void PetscFunctionBeginUser; 737a8d2bbe5SBarry Smith 738a8d2bbe5SBarry Smith Not Collective 739a8d2bbe5SBarry Smith 740a8d2bbe5SBarry Smith Usage: 741a8d2bbe5SBarry Smith .vb 742a8d2bbe5SBarry Smith int something; 743a8d2bbe5SBarry Smith 744ac285190SBarry Smith PetscFunctionBeginUser; 745a8d2bbe5SBarry Smith .ve 746a8d2bbe5SBarry Smith 747a8d2bbe5SBarry Smith Notes: 7481957e957SBarry Smith Final line of PETSc functions should be PetscFunctionReturn(0) except for main(). 7491957e957SBarry Smith 750a8d2bbe5SBarry Smith Not available in Fortran 751a8d2bbe5SBarry Smith 752ac285190SBarry Smith This is identical to PetscFunctionBegin except it labels the routine as a user 753ac285190SBarry Smith routine instead of as a PETSc library routine. 754ac285190SBarry Smith 755a2f94806SJed Brown Level: intermediate 756a8d2bbe5SBarry Smith 757a2f94806SJed Brown .seealso: PetscFunctionReturn(), PetscFunctionBegin, PetscFunctionBeginHot 758a8d2bbe5SBarry Smith 759a8d2bbe5SBarry Smith .keywords: traceback, error handling 760a8d2bbe5SBarry Smith M*/ 761a8d2bbe5SBarry Smith #define PetscFunctionBeginUser \ 762a8d2bbe5SBarry Smith do { \ 763a2f94806SJed Brown PetscStackPushNoCheck(PETSC_FUNCTION_NAME,PETSC_FALSE,PETSC_FALSE); \ 764a8d2bbe5SBarry Smith PetscRegister__FUNCT__(); \ 765a8d2bbe5SBarry Smith } while (0) 766a8d2bbe5SBarry Smith 767a8d2bbe5SBarry Smith 7682d53ad75SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) 769af0996ceSBarry Smith #include <petsc/private/petscfptimpl.h> 7702d53ad75SBarry Smith /* 7712d53ad75SBarry Smith Registers the current function into the global function pointer to function name table 7722d53ad75SBarry Smith 7732d53ad75SBarry Smith Have to fix this to handle errors but cannot return error since used in PETSC_VIEWER_DRAW_() etc 7742d53ad75SBarry Smith */ 7752d53ad75SBarry Smith #define PetscRegister__FUNCT__() do { \ 7762d53ad75SBarry Smith static PetscBool __chked = PETSC_FALSE; \ 7772d53ad75SBarry Smith if (!__chked) {\ 778fbfcfee5SBarry Smith void *ptr; PetscDLSym(NULL,PETSC_FUNCTION_NAME,&ptr);\ 7792d53ad75SBarry Smith __chked = PETSC_TRUE;\ 7802d53ad75SBarry Smith }} while (0) 7812d53ad75SBarry Smith #else 7822d53ad75SBarry Smith #define PetscRegister__FUNCT__() 7832d53ad75SBarry Smith #endif 7842d53ad75SBarry Smith 7855cd90555SBarry Smith #define PetscStackPush(n) \ 78661d886c9SShri Abhyankar do { \ 787a2f94806SJed Brown PetscStackPushNoCheck(n,PETSC_FALSE,PETSC_FALSE); \ 78815681b3cSBarry Smith CHKMEMQ; \ 78915681b3cSBarry Smith } while (0) 7903a40ed3dSBarry Smith 791d64ed03dSBarry Smith #define PetscStackPop \ 792441dd030SJed Brown do { \ 793441dd030SJed Brown CHKMEMQ; \ 794441dd030SJed Brown PetscStackPopNoCheck; \ 79515681b3cSBarry Smith } while (0) 796d64ed03dSBarry Smith 79730de9b25SBarry Smith /*MC 79830de9b25SBarry Smith PetscFunctionReturn - Last executable line of each PETSc function 79930de9b25SBarry Smith used for error handling. Replaces return() 80030de9b25SBarry Smith 80130de9b25SBarry Smith Synopsis: 802aaa7dc30SBarry Smith #include <petscsys.h> 80330de9b25SBarry Smith void PetscFunctionReturn(0); 80430de9b25SBarry Smith 805eca87e8dSBarry Smith Not Collective 806eca87e8dSBarry Smith 80730de9b25SBarry Smith Usage: 80830de9b25SBarry Smith .vb 80930de9b25SBarry Smith .... 81030de9b25SBarry Smith PetscFunctionReturn(0); 81130de9b25SBarry Smith } 81230de9b25SBarry Smith .ve 81330de9b25SBarry Smith 81430de9b25SBarry Smith Notes: 81530de9b25SBarry Smith Not available in Fortran 81630de9b25SBarry Smith 81730de9b25SBarry Smith Level: developer 81830de9b25SBarry Smith 81930de9b25SBarry Smith .seealso: PetscFunctionBegin() 82030de9b25SBarry Smith 82130de9b25SBarry Smith .keywords: traceback, error handling 82230de9b25SBarry Smith M*/ 8235cd90555SBarry Smith #define PetscFunctionReturn(a) \ 8248246ba0dSJed Brown do { \ 825441dd030SJed Brown PetscStackPopNoCheck; \ 8268246ba0dSJed Brown return(a);} while (0) 827d64ed03dSBarry Smith 828ff94ddecSSatish Balay #define PetscFunctionReturnVoid() \ 8298246ba0dSJed Brown do { \ 830441dd030SJed Brown PetscStackPopNoCheck; \ 8318246ba0dSJed Brown return;} while (0) 83276386721SLisandro Dalcin 8336d385327SIbrahima Ba #else 8346d385327SIbrahima Ba 835c82b4e47SJed Brown PETSC_STATIC_INLINE PetscBool PetscStackActive(void) {return PETSC_FALSE;} 836a2f94806SJed Brown #define PetscStackPushNoCheck(funct,petsc_routine,hot) do {} while (0) 837441dd030SJed Brown #define PetscStackPopNoCheck do {} while (0) 8383a40ed3dSBarry Smith #define PetscFunctionBegin 8390bdf7c52SPeter Brune #define PetscFunctionBeginUser 840a2f94806SJed Brown #define PetscFunctionBeginHot 8413a40ed3dSBarry Smith #define PetscFunctionReturn(a) return(a) 8425665465eSBarry Smith #define PetscFunctionReturnVoid() return 843812af9f3SBarry Smith #define PetscStackPop CHKMEMQ 844812af9f3SBarry Smith #define PetscStackPush(f) CHKMEMQ 8453a40ed3dSBarry Smith 8463a40ed3dSBarry Smith #endif 8473a40ed3dSBarry Smith 848eb6b5d47SBarry Smith /* 849eb6b5d47SBarry Smith PetscStackCall - Calls an external library routine or user function after pushing the name of the routine on the stack. 850eb6b5d47SBarry Smith 851eb6b5d47SBarry Smith Input Parameters: 852eb6b5d47SBarry Smith + name - string that gives the name of the function being called 853fd3f9acdSBarry Smith - routine - actual call to the routine, including ierr = and CHKERRQ(ierr); 854fd3f9acdSBarry Smith 855dbf62e16SBarry Smith Note: Often one should use PetscStackCallStandard() instead. This routine is intended for external library routines that DO NOT return error codes 856eb6b5d47SBarry Smith 857eb6b5d47SBarry Smith Developer Note: this is so that when a user or external library routine results in a crash or corrupts memory, they get blamed instead of PETSc. 858eb6b5d47SBarry Smith 859fd3f9acdSBarry Smith 860fd3f9acdSBarry Smith 861eb6b5d47SBarry Smith */ 86230ecc5abSKarl Rupp #define PetscStackCall(name,routine) do { PetscStackPush(name);routine;PetscStackPop; } while(0) 863eb6b5d47SBarry Smith 864fd3f9acdSBarry Smith /* 865fd3f9acdSBarry Smith PetscStackCallStandard - Calls an external library routine after pushing the name of the routine on the stack. 866fd3f9acdSBarry Smith 867fd3f9acdSBarry Smith Input Parameters: 868fd3f9acdSBarry Smith + func- name of the routine 869fd3f9acdSBarry Smith - args - arguments to the routine surrounded by () 870fd3f9acdSBarry Smith 871dbf62e16SBarry Smith Notes: This is intended for external package routines that return error codes. Use PetscStackCall() for those that do not. 872dbf62e16SBarry Smith 873dbf62e16SBarry Smith Developer Note: this is so that when an external packge routine results in a crash or corrupts memory, they get blamed instead of PETSc. 874fd3f9acdSBarry Smith 875fd3f9acdSBarry Smith */ 876fd3f9acdSBarry Smith #define PetscStackCallStandard(func,args) do { \ 8777afcd97cSStefano Zampini PetscStackPush(#func);ierr = func args;PetscStackPop; if (ierr) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in %s(): error code %d",#func,(int)ierr); \ 878fd3f9acdSBarry Smith } while (0) 879fd3f9acdSBarry Smith 880014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackCreate(void); 881639ff905SBarry Smith PETSC_EXTERN PetscErrorCode PetscStackView(FILE*); 882014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscStackDestroy(void); 88306d1fe2cSBarry Smith 88406d1fe2cSBarry Smith #endif 885