17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Code that allows one to set the error handlers 4e5c89e4eSSatish Balay */ 5af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 6665c2dedSJed Brown #include <petscviewer.h> 7e5c89e4eSSatish Balay 8e5c89e4eSSatish Balay typedef struct _EH *EH; 9e5c89e4eSSatish Balay struct _EH { 10efca3c55SSatish Balay PetscErrorCode (*handler)(MPI_Comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *); 11e5c89e4eSSatish Balay void *ctx; 12e5c89e4eSSatish Balay EH previous; 13e5c89e4eSSatish Balay }; 14e5c89e4eSSatish Balay 1502c9f0b5SLisandro Dalcin static EH eh = NULL; 16e5c89e4eSSatish Balay 17e5c89e4eSSatish Balay /*@C 18e5c89e4eSSatish Balay PetscEmacsClientErrorHandler - Error handler that uses the emacsclient program to 19a5b23f4aSJose E. Roman load the file where the error occurred. Then calls the "previous" error handler. 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay Not Collective 22e5c89e4eSSatish Balay 23e5c89e4eSSatish Balay Input Parameters: 24a5b23f4aSJose E. Roman + comm - communicator over which error occurred 25e32f2f54SBarry Smith . line - the line number of the error (indicated by __LINE__) 26e5c89e4eSSatish Balay . file - the file in which the error was detected (indicated by __FILE__) 27e5c89e4eSSatish Balay . mess - an error text string, usually just printed to the screen 28e5c89e4eSSatish Balay . n - the generic error number 29e5c89e4eSSatish Balay . p - specific error number 30e5c89e4eSSatish Balay - ctx - error handler context 31e5c89e4eSSatish Balay 32e5c89e4eSSatish Balay Options Database Key: 3310699b91SBarry Smith . -on_error_emacs <machinename> - will contact machinename to open the Emacs client there 34e5c89e4eSSatish Balay 35e5c89e4eSSatish Balay Level: developer 36e5c89e4eSSatish Balay 37811af0c4SBarry Smith Note: 38e5c89e4eSSatish Balay You must put (server-start) in your .emacs file for the emacsclient software to work 39e5c89e4eSSatish Balay 40cc12936aSPatrick Sanan Developer Note: 41811af0c4SBarry Smith Since this is an error handler it cannot call `PetscCall()`; thus we just return if an error is detected. 42811af0c4SBarry Smith But some of the functions it calls do perform error checking that may not be appropriate in a error handler call. 433bf036e2SBarry Smith 44db781477SPatrick Sanan .seealso: `PetscError()`, `PetscPushErrorHandler()`, `PetscPopErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, 45db781477SPatrick Sanan `PetscAbortErrorHandler()`, `PetscMPIAbortErrorHandler()`, `PetscTraceBackErrorHandler()`, `PetscReturnErrorHandler()` 46e5c89e4eSSatish Balay @*/ 47*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscEmacsClientErrorHandler(MPI_Comm comm, int line, const char *fun, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, void *ctx) 48*d71ae5a4SJacob Faibussowitsch { 49e5c89e4eSSatish Balay PetscErrorCode ierr; 50e5c89e4eSSatish Balay char command[PETSC_MAX_PATH_LEN]; 51e5c89e4eSSatish Balay const char *pdir; 52e5c89e4eSSatish Balay FILE *fp; 53e5c89e4eSSatish Balay 549371c9d4SSatish Balay ierr = PetscGetPetscDir(&pdir); 5511cc89d2SBarry Smith if (ierr) return ierr; 56efca3c55SSatish Balay sprintf(command, "cd %s; emacsclient --no-wait +%d %s\n", pdir, line, file); 57e5c89e4eSSatish Balay #if defined(PETSC_HAVE_POPEN) 589371c9d4SSatish Balay ierr = PetscPOpen(MPI_COMM_WORLD, (char *)ctx, command, "r", &fp); 5911cc89d2SBarry Smith if (ierr) return ierr; 609371c9d4SSatish Balay ierr = PetscPClose(MPI_COMM_WORLD, fp); 6111cc89d2SBarry Smith if (ierr) return ierr; 62e5c89e4eSSatish Balay #else 63e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "Cannot run external programs on this machine"); 64e5c89e4eSSatish Balay #endif 659371c9d4SSatish Balay ierr = PetscPopErrorHandler(); 6611cc89d2SBarry Smith if (ierr) return ierr; /* remove this handler from the stack of handlers */ 673bf036e2SBarry Smith if (!eh) { 689371c9d4SSatish Balay ierr = PetscTraceBackErrorHandler(comm, line, fun, file, n, p, mess, NULL); 6911cc89d2SBarry Smith if (ierr) return ierr; 703bf036e2SBarry Smith } else { 719371c9d4SSatish Balay ierr = (*eh->handler)(comm, line, fun, file, n, p, mess, eh->ctx); 7211cc89d2SBarry Smith if (ierr) return ierr; 733bf036e2SBarry Smith } 7411cc89d2SBarry Smith return 0; 75e5c89e4eSSatish Balay } 76e5c89e4eSSatish Balay 77e5c89e4eSSatish Balay /*@C 78e5c89e4eSSatish Balay PetscPushErrorHandler - Sets a routine to be called on detection of errors. 79e5c89e4eSSatish Balay 80e5c89e4eSSatish Balay Not Collective 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay Input Parameters: 83e5c89e4eSSatish Balay + handler - error handler routine 84e5c89e4eSSatish Balay - ctx - optional handler context that contains information needed by the handler (for 85e5c89e4eSSatish Balay example file pointers for error messages etc.) 86e5c89e4eSSatish Balay 87e5c89e4eSSatish Balay Calling sequence of handler: 88efca3c55SSatish Balay $ int handler(MPI_Comm comm,int line,char *func,char *file,PetscErrorCode n,int p,char *mess,void *ctx); 89e5c89e4eSSatish Balay 90a5b23f4aSJose E. Roman + comm - communicator over which error occurred 91e5c89e4eSSatish Balay . line - the line number of the error (indicated by __LINE__) 92e5c89e4eSSatish Balay . file - the file in which the error was detected (indicated by __FILE__) 93e5c89e4eSSatish Balay . n - the generic error number (see list defined in include/petscerror.h) 94668f157eSBarry Smith . p - PETSC_ERROR_INITIAL if error just detected, otherwise PETSC_ERROR_REPEAT 95e5c89e4eSSatish Balay . mess - an error text string, usually just printed to the screen 96e5c89e4eSSatish Balay - ctx - the error handler context 97e5c89e4eSSatish Balay 98e5c89e4eSSatish Balay Options Database Keys: 9910699b91SBarry Smith + -on_error_attach_debugger <noxterm,gdb or dbx> - starts up the debugger if an error occurs 10010699b91SBarry Smith - -on_error_abort - aborts the program if an error occurs 101e5c89e4eSSatish Balay 102e5c89e4eSSatish Balay Level: intermediate 103e5c89e4eSSatish Balay 104811af0c4SBarry Smith Note: 105811af0c4SBarry Smith The currently available PETSc error handlers include `PetscTraceBackErrorHandler()`, 106811af0c4SBarry Smith `PetscAttachDebuggerErrorHandler()`, `PetscAbortErrorHandler()`, and `PetscMPIAbortErrorHandler()`, `PetscReturnErrorHandler()`. 107e93bc3c1Svictor 108811af0c4SBarry Smith Fortran Note: 10995452b02SPatrick Sanan You can only push one error handler from Fortran before poping it. 1107850c7c0SBarry Smith 111db781477SPatrick Sanan .seealso: `PetscPopErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, `PetscAbortErrorHandler()`, `PetscTraceBackErrorHandler()`, `PetscPushSignalHandler()` 112e5c89e4eSSatish Balay @*/ 113*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPushErrorHandler(PetscErrorCode (*handler)(MPI_Comm comm, int, const char *, const char *, PetscErrorCode, PetscErrorType, const char *, void *), void *ctx) 114*d71ae5a4SJacob Faibussowitsch { 115e5c89e4eSSatish Balay EH neweh; 116e5c89e4eSSatish Balay 117e5c89e4eSSatish Balay PetscFunctionBegin; 1189566063dSJacob Faibussowitsch PetscCall(PetscNew(&neweh)); 119a297a907SKarl Rupp if (eh) neweh->previous = eh; 12002c9f0b5SLisandro Dalcin else neweh->previous = NULL; 121e5c89e4eSSatish Balay neweh->handler = handler; 122e5c89e4eSSatish Balay neweh->ctx = ctx; 123e5c89e4eSSatish Balay eh = neweh; 124e5c89e4eSSatish Balay PetscFunctionReturn(0); 125e5c89e4eSSatish Balay } 126e5c89e4eSSatish Balay 127e30d2299SSatish Balay /*@ 128e5c89e4eSSatish Balay PetscPopErrorHandler - Removes the latest error handler that was 129811af0c4SBarry Smith pushed with `PetscPushErrorHandler()`. 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay Not Collective 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay Level: intermediate 134e5c89e4eSSatish Balay 135db781477SPatrick Sanan .seealso: `PetscPushErrorHandler()` 136e5c89e4eSSatish Balay @*/ 137*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPopErrorHandler(void) 138*d71ae5a4SJacob Faibussowitsch { 139e5c89e4eSSatish Balay EH tmp; 140e5c89e4eSSatish Balay 141e5c89e4eSSatish Balay PetscFunctionBegin; 142e5c89e4eSSatish Balay if (!eh) PetscFunctionReturn(0); 143e5c89e4eSSatish Balay tmp = eh; 144e5c89e4eSSatish Balay eh = eh->previous; 1459566063dSJacob Faibussowitsch PetscCall(PetscFree(tmp)); 146e5c89e4eSSatish Balay PetscFunctionReturn(0); 147e5c89e4eSSatish Balay } 148e5c89e4eSSatish Balay 149e93bc3c1Svictor /*@C 15045b666d6SBarry Smith PetscReturnErrorHandler - Error handler that causes a return without printing an error message. 151e93bc3c1Svictor 152e93bc3c1Svictor Not Collective 153e93bc3c1Svictor 154e93bc3c1Svictor Input Parameters: 155e32f2f54SBarry Smith + comm - communicator over which error occurred 156e32f2f54SBarry Smith . line - the line number of the error (indicated by __LINE__) 157e93bc3c1Svictor . file - the file in which the error was detected (indicated by __FILE__) 158e93bc3c1Svictor . mess - an error text string, usually just printed to the screen 159e93bc3c1Svictor . n - the generic error number 160e93bc3c1Svictor . p - specific error number 161e93bc3c1Svictor - ctx - error handler context 162e93bc3c1Svictor 163e93bc3c1Svictor Level: developer 164e93bc3c1Svictor 165e93bc3c1Svictor Notes: 166e93bc3c1Svictor Most users need not directly employ this routine and the other error 167811af0c4SBarry Smith handlers, but can instead use the simplified interface `SETERRQ()`, which has 168e93bc3c1Svictor the calling sequence 169e32f2f54SBarry Smith $ SETERRQ(comm,number,mess) 170e93bc3c1Svictor 171811af0c4SBarry Smith `PetscIgnoreErrorHandler()` does the same thing as this function, but is deprecated, you should use this function. 172e93bc3c1Svictor 173811af0c4SBarry Smith Use `PetscPushErrorHandler()` to set the desired error handler. 174e93bc3c1Svictor 175db781477SPatrick Sanan .seealso: `PetscPushErrorHandler()`, `PetscPopErrorHandler()`, `PetscError()`, `PetscAbortErrorHandler()`, `PetscMPIAbortErrorHandler()`, `PetscTraceBackErrorHandler()`, 176db781477SPatrick Sanan `PetscAttachDebuggerErrorHandler()`, `PetscEmacsClientErrorHandler()` 177e93bc3c1Svictor @*/ 178*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscReturnErrorHandler(MPI_Comm comm, int line, const char *fun, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, void *ctx) 179*d71ae5a4SJacob Faibussowitsch { 180362febeeSStefano Zampini return n; 181e93bc3c1Svictor } 182e93bc3c1Svictor 183e5c89e4eSSatish Balay static char PetscErrorBaseMessage[1024]; 184e5c89e4eSSatish Balay /* 185e5c89e4eSSatish Balay The numerical values for these are defined in include/petscerror.h; any changes 186e5c89e4eSSatish Balay there must also be made here 187e5c89e4eSSatish Balay */ 188e5c89e4eSSatish Balay static const char *PetscErrorStrings[] = { 189e5c89e4eSSatish Balay /*55 */ "Out of memory", 190e5c89e4eSSatish Balay "No support for this operation for this object type", 191e5c89e4eSSatish Balay "No support for this operation on this system", 192e5c89e4eSSatish Balay /*58 */ "Operation done in wrong order", 193e5c89e4eSSatish Balay /*59 */ "Signal received", 194e5c89e4eSSatish Balay /*60 */ "Nonconforming object sizes", 195e5c89e4eSSatish Balay "Argument aliasing not permitted", 196e5c89e4eSSatish Balay "Invalid argument", 197e5c89e4eSSatish Balay /*63 */ "Argument out of range", 198a17b96a8SKyle Gerard Felker "Corrupt argument: https://petsc.org/release/faq/#valgrind", 199e5c89e4eSSatish Balay "Unable to open file", 200e5c89e4eSSatish Balay "Read from file failed", 201e5c89e4eSSatish Balay "Write to file failed", 202e5c89e4eSSatish Balay "Invalid pointer", 203e5c89e4eSSatish Balay /*69 */ "Arguments must have same type", 204a8b45ee7SBarry Smith /*70 */ "Attempt to use a pointer that does not point to a valid accessible location", 205a17b96a8SKyle Gerard Felker /*71 */ "Zero pivot in LU factorization: https://petsc.org/release/faq/#zeropivot", 206e5c89e4eSSatish Balay /*72 */ "Floating point exception", 207e5c89e4eSSatish Balay /*73 */ "Object is in wrong state", 208e5c89e4eSSatish Balay "Corrupted Petsc object", 209e5c89e4eSSatish Balay "Arguments are incompatible", 210e5c89e4eSSatish Balay "Error in external library", 211e5c89e4eSSatish Balay /*77 */ "Petsc has generated inconsistent data", 212a17b96a8SKyle Gerard Felker "Memory corruption: https://petsc.org/release/faq/#valgrind", 213e5c89e4eSSatish Balay "Unexpected data in file", 214e5c89e4eSSatish Balay /*80 */ "Arguments must have same communicators", 215a17b96a8SKyle Gerard Felker /*81 */ "Zero pivot in Cholesky factorization: https://petsc.org/release/faq/#zeropivot", 216e5c89e4eSSatish Balay "", 217e5c89e4eSSatish Balay "", 218a17b96a8SKyle Gerard Felker "Overflow in integer operation: https://petsc.org/release/faq/#64-bit-indices", 219e5c89e4eSSatish Balay /*85 */ "Null argument, when expecting valid pointer", 220a17b96a8SKyle Gerard Felker /*86 */ "Unknown type. Check for miss-spelling or missing package: https://petsc.org/release/install/install/#external-packages", 2213d96e996SBarry Smith /*87 */ "MPI library at runtime is not compatible with MPI used at compile time", 2228cda6cd7SBarry Smith /*88 */ "Error in system call", 223a17b96a8SKyle Gerard Felker /*89 */ "Object Type not set: https://petsc.org/release/faq/#object-type-not-set", 22473260a9bSLisandro Dalcin /*90 */ "", 22573260a9bSLisandro Dalcin /* */ "", 226a17b96a8SKyle Gerard Felker /*92 */ "See https://petsc.org/release/overview/linear_solve_table/ for possible LU and Cholesky solvers", 227f560318cSPatrick Sanan /*93 */ "You cannot overwrite this option since that will conflict with other previously set options", 228691b26d3SBarry Smith /*94 */ "Example/application run with number of MPI ranks it does not support", 229691b26d3SBarry Smith /*95 */ "Missing or incorrect user input", 230e57d7714SBarry Smith /*96 */ "GPU resources unavailable", 231764761abSStefano Zampini /*97 */ "GPU error", 232e809461dSJacob Faibussowitsch /*98 */ "General MPI error", 233e809461dSJacob Faibussowitsch /*99 */ "PetscError() incorrectly returned an error code of 0"}; 234e5c89e4eSSatish Balay 235e5c89e4eSSatish Balay /*@C 236e5c89e4eSSatish Balay PetscErrorMessage - returns the text string associated with a PETSc error code. 237e5c89e4eSSatish Balay 238e5c89e4eSSatish Balay Not Collective 239e5c89e4eSSatish Balay 240e5c89e4eSSatish Balay Input Parameter: 241e5c89e4eSSatish Balay . errnum - the error code 242e5c89e4eSSatish Balay 243d8d19677SJose E. Roman Output Parameters: 2440298fd71SBarry Smith + text - the error message (NULL if not desired) 245811af0c4SBarry Smith - specific - the specific error message that was set with `SETERRQ()` or `PetscError()`. (NULL if not desired) 246e5c89e4eSSatish Balay 247e5c89e4eSSatish Balay Level: developer 248e5c89e4eSSatish Balay 249db781477SPatrick Sanan .seealso: `PetscPushErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, `PetscError()`, `SETERRQ()`, `PetscCall()` 250db781477SPatrick Sanan `PetscAbortErrorHandler()`, `PetscTraceBackErrorHandler()` 251e5c89e4eSSatish Balay @*/ 252*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscErrorMessage(int errnum, const char *text[], char **specific) 253*d71ae5a4SJacob Faibussowitsch { 254c35ec7c7SPierre Jolivet size_t len; 255c35ec7c7SPierre Jolivet 256e5c89e4eSSatish Balay PetscFunctionBegin; 257c35ec7c7SPierre Jolivet if (text && errnum > PETSC_ERR_MIN_VALUE && errnum < PETSC_ERR_MAX_VALUE) { 258c35ec7c7SPierre Jolivet *text = PetscErrorStrings[errnum - PETSC_ERR_MIN_VALUE - 1]; 259c35ec7c7SPierre Jolivet PetscCall(PetscStrlen(*text, &len)); 260c35ec7c7SPierre Jolivet if (!len) *text = NULL; 2619371c9d4SSatish Balay } else if (text) *text = NULL; 262e5c89e4eSSatish Balay 263a297a907SKarl Rupp if (specific) *specific = PetscErrorBaseMessage; 264e5c89e4eSSatish Balay PetscFunctionReturn(0); 265e5c89e4eSSatish Balay } 266e5c89e4eSSatish Balay 267984a1229SMatthew G. Knepley #if defined(PETSC_CLANGUAGE_CXX) 268984a1229SMatthew G. Knepley /* C++ exceptions are formally not allowed to propagate through extern "C" code. In practice, far too much software 269984a1229SMatthew G. Knepley * would be broken if implementations did not handle it it some common cases. However, keep in mind 270984a1229SMatthew G. Knepley * 271984a1229SMatthew G. Knepley * Rule 62. Don't allow exceptions to propagate across module boundaries 272984a1229SMatthew G. Knepley * 273984a1229SMatthew G. Knepley * in "C++ Coding Standards" by Sutter and Alexandrescu. (This accounts for part of the ongoing C++ binary interface 274984a1229SMatthew G. Knepley * instability.) Having PETSc raise errors as C++ exceptions was probably misguided and should eventually be removed. 275984a1229SMatthew G. Knepley * 276984a1229SMatthew G. Knepley * Here is the problem: You have a C++ function call a PETSc function, and you would like to maintain the error message 277984a1229SMatthew G. Knepley * and stack information from the PETSc error. You could make everyone write exactly this code in their C++, but that 278984a1229SMatthew G. Knepley * seems crazy to me. 279984a1229SMatthew G. Knepley */ 280984a1229SMatthew G. Knepley #include <sstream> 2814c94c282SMatthew G. Knepley #include <stdexcept> 282*d71ae5a4SJacob Faibussowitsch static void PetscCxxErrorThrow() 283*d71ae5a4SJacob Faibussowitsch { 284984a1229SMatthew G. Knepley const char *str; 285984a1229SMatthew G. Knepley if (eh && eh->ctx) { 286984a1229SMatthew G. Knepley std::ostringstream *msg; 287984a1229SMatthew G. Knepley msg = (std::ostringstream *)eh->ctx; 288984a1229SMatthew G. Knepley str = msg->str().c_str(); 289984a1229SMatthew G. Knepley } else str = "Error detected in C PETSc"; 290984a1229SMatthew G. Knepley 291984a1229SMatthew G. Knepley throw std::runtime_error(str); 292984a1229SMatthew G. Knepley } 293984a1229SMatthew G. Knepley #endif 294984a1229SMatthew G. Knepley 295e5c89e4eSSatish Balay /*@C 29645b666d6SBarry Smith PetscError - Routine that is called when an error has been detected, usually called through the macro SETERRQ(PETSC_COMM_SELF,). 297e5c89e4eSSatish Balay 298811af0c4SBarry Smith Collective 299e5c89e4eSSatish Balay 300e5c89e4eSSatish Balay Input Parameters: 301e32f2f54SBarry Smith + comm - communicator over which error occurred. ALL ranks of this communicator MUST call this routine 302e32f2f54SBarry Smith . line - the line number of the error (indicated by __LINE__) 3033de71b31SHong Zhang . func - the function name in which the error was detected 304e5c89e4eSSatish Balay . file - the file in which the error was detected (indicated by __FILE__) 305e5c89e4eSSatish Balay . n - the generic error number 306811af0c4SBarry Smith . p - `PETSC_ERROR_INITIAL` indicates the error was initially detected, `PETSC_ERROR_REPEAT` indicates this is a traceback from a previously detected error 307e5c89e4eSSatish Balay - mess - formatted message string - aka printf 308e5c89e4eSSatish Balay 309811af0c4SBarry Smith Options Database Keys: 31045b666d6SBarry Smith + -error_output_stdout - output the error messages to stdout instead of the default stderr 31145b666d6SBarry Smith - -error_output_none - do not output the error messages 31245b666d6SBarry Smith 313e5c89e4eSSatish Balay Level: intermediate 314e5c89e4eSSatish Balay 315e5c89e4eSSatish Balay Notes: 316e809461dSJacob Faibussowitsch PETSc error handling is done with error return codes. A non-zero return indicates an error 317e809461dSJacob Faibussowitsch was detected. The return-value of this routine is what is ultimately returned by 318e809461dSJacob Faibussowitsch `SETERRQ()`. 31945b666d6SBarry Smith 320e809461dSJacob Faibussowitsch Note that numerical errors (potential divide by zero, for example) are not managed by the 321e809461dSJacob Faibussowitsch error return codes; they are managed via, for example, `KSPGetConvergedReason()` that 322e809461dSJacob Faibussowitsch indicates if the solve was successful or not. The option `-ksp_error_if_not_converged`, for 323e809461dSJacob Faibussowitsch example, turns numerical failures into hard errors managed via `PetscError()`. 32445b666d6SBarry Smith 325e809461dSJacob Faibussowitsch PETSc provides a rich supply of error handlers, see the list below, and users can also 326e809461dSJacob Faibussowitsch provide their own error handlers. 327811af0c4SBarry Smith 328e809461dSJacob Faibussowitsch If the user sets their own error handler (via `PetscPushErrorHandler()`) they may return any 329e809461dSJacob Faibussowitsch arbitrary value from it, but are encouraged to return nonzero values. If the return value is 330e809461dSJacob Faibussowitsch zero, `SETERRQ()` will ignore the value and return `PETSC_ERR_RETURN` (a nonzero value) 331e809461dSJacob Faibussowitsch instead. 332e809461dSJacob Faibussowitsch 333e809461dSJacob Faibussowitsch Most users need not directly use this routine and the error handlers, but can instead use 334e809461dSJacob Faibussowitsch the simplified interface `PetscCall()` or `SETERRQ()`. 335e5c89e4eSSatish Balay 336e3081792SBarry Smith Fortran Note: 337e3081792SBarry Smith This routine is used differently from Fortran 338e3081792SBarry Smith $ PetscError(MPI_Comm comm,PetscErrorCode n,PetscErrorType p,char *message) 339e3081792SBarry Smith 340811af0c4SBarry Smith Developer Note: 341811af0c4SBarry Smith Since this is called after an error condition it should not be calling any error handlers (currently it ignores any error codes) 3423bf036e2SBarry Smith BUT this routine does call regular PETSc functions that may call error handlers, this is problematic and could be fixed by never calling other PETSc routines 3433bf036e2SBarry Smith but this annoying. 3443bf036e2SBarry Smith 345db781477SPatrick Sanan .seealso: `PetscErrorCode`, `PetscPushErrorHandler()`, `PetscPopErrorHandler()`, `PetscTraceBackErrorHandler()`, `PetscAbortErrorHandler()`, `PetscMPIAbortErrorHandler()`, 346db781477SPatrick Sanan `PetscReturnErrorHandler()`, `PetscAttachDebuggerErrorHandler()`, `PetscEmacsClientErrorHandler()`, 347db781477SPatrick Sanan `SETERRQ()`, `PetscCall()`, `CHKMEMQ`, `SETERRQ()`, `SETERRQ()`, `PetscErrorMessage()`, `PETSCABORT()` 348e5c89e4eSSatish Balay @*/ 349*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscError(MPI_Comm comm, int line, const char *func, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, ...) 350*d71ae5a4SJacob Faibussowitsch { 351e5c89e4eSSatish Balay va_list Argp; 352c9a19010SBarry Smith size_t fullLength; 35302c9f0b5SLisandro Dalcin char buf[2048], *lbuf = NULL; 354fbfcfee5SBarry Smith PetscBool ismain; 3553bf036e2SBarry Smith PetscErrorCode ierr; 356e5c89e4eSSatish Balay 35739a651e2SJacob Faibussowitsch if (!PetscErrorHandlingInitialized) return n; 3580d577829SBarry Smith if (comm == MPI_COMM_NULL) comm = PETSC_COMM_SELF; 359e5c89e4eSSatish Balay 360e5c89e4eSSatish Balay /* Compose the message evaluating the print format */ 361e5c89e4eSSatish Balay if (mess) { 362e5c89e4eSSatish Balay va_start(Argp, mess); 3632d609e63SMatthew Knepley PetscVSNPrintf(buf, 2048, mess, &fullLength, Argp); 364e5c89e4eSSatish Balay va_end(Argp); 365e5c89e4eSSatish Balay lbuf = buf; 36678179f8bSBarry Smith if (p == PETSC_ERROR_INITIAL) PetscStrncpy(PetscErrorBaseMessage, lbuf, 1023); 367e5c89e4eSSatish Balay } 368e5c89e4eSSatish Balay 3694ed0ab5bSBarry Smith if (p == PETSC_ERROR_INITIAL && n != PETSC_ERR_MEMC) PetscMallocValidate(__LINE__, PETSC_FUNCTION_NAME, __FILE__); 3704ed0ab5bSBarry Smith 37102c9f0b5SLisandro Dalcin if (!eh) ierr = PetscTraceBackErrorHandler(comm, line, func, file, n, p, lbuf, NULL); 372efca3c55SSatish Balay else ierr = (*eh->handler)(comm, line, func, file, n, p, lbuf, eh->ctx); 373362febeeSStefano Zampini PetscStackClearTop; 374e5c89e4eSSatish Balay 375e5c89e4eSSatish Balay /* 3767233276eSBarry Smith If this is called from the main() routine we call MPI_Abort() instead of 377e5c89e4eSSatish Balay return to allow the parallel program to be properly shutdown. 378e5c89e4eSSatish Balay 3797233276eSBarry Smith Does not call PETSCABORT() since that would provide the wrong source file and line number information 380e5c89e4eSSatish Balay */ 38149c86fc7SBarry Smith if (func) { 382e5c89e4eSSatish Balay PetscStrncmp(func, "main", 4, &ismain); 3837233276eSBarry Smith if (ismain) { 38449c86fc7SBarry Smith if (petscwaitonerrorflg) PetscSleep(1000); 385660278c0SBarry Smith PETSCABORT(comm, ierr); 3867233276eSBarry Smith } 38749c86fc7SBarry Smith } 3882c280183SJed Brown #if defined(PETSC_CLANGUAGE_CXX) 389ad540459SPierre Jolivet if (p == PETSC_ERROR_IN_CXX) PetscCxxErrorThrow(); 390d736bfebSBarry Smith #endif 391362febeeSStefano Zampini return ierr; 392e5c89e4eSSatish Balay } 393e5c89e4eSSatish Balay 394e5c89e4eSSatish Balay /* -------------------------------------------------------------------------*/ 395e5c89e4eSSatish Balay 396e5c89e4eSSatish Balay /*@C 397e5c89e4eSSatish Balay PetscIntView - Prints an array of integers; useful for debugging. 398e5c89e4eSSatish Balay 399811af0c4SBarry Smith Collective on viewer 400e5c89e4eSSatish Balay 401e5c89e4eSSatish Balay Input Parameters: 402e5c89e4eSSatish Balay + N - number of integers in array 403e5c89e4eSSatish Balay . idx - array of integers 404811af0c4SBarry Smith - viewer - location to print array, `PETSC_VIEWER_STDOUT_WORLD`, `PETSC_VIEWER_STDOUT_SELF` or 0 405e5c89e4eSSatish Balay 406e5c89e4eSSatish Balay Level: intermediate 407e5c89e4eSSatish Balay 408811af0c4SBarry Smith Note: 409811af0c4SBarry Smith This may be called from within the debugger 410300a7f5bSBarry Smith 411811af0c4SBarry Smith Developer Note: 412811af0c4SBarry Smith idx cannot be const because may be passed to binary viewer where temporary byte swapping may be done 413811af0c4SBarry Smith 414811af0c4SBarry Smith .seealso: `PetscViewer`, `PetscRealView()` 415e5c89e4eSSatish Balay @*/ 416*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntView(PetscInt N, const PetscInt idx[], PetscViewer viewer) 417*d71ae5a4SJacob Faibussowitsch { 418ca0c3be5SJacob Faibussowitsch PetscMPIInt rank, size; 419e5c89e4eSSatish Balay PetscInt j, i, n = N / 20, p = N % 20; 420ace3abfcSBarry Smith PetscBool iascii, isbinary; 421e5c89e4eSSatish Balay MPI_Comm comm; 422e5c89e4eSSatish Balay 423e5c89e4eSSatish Balay PetscFunctionBegin; 424e5c89e4eSSatish Balay if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 4250700a824SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 3); 4265ab33896SBarry Smith if (N) PetscValidIntPointer(idx, 2); 4279566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm)); 4289566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4299566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 430e5c89e4eSSatish Balay 4319566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 4329566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary)); 433e5c89e4eSSatish Balay if (iascii) { 4349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 435e5c89e4eSSatish Balay for (i = 0; i < n; i++) { 436ca0c3be5SJacob Faibussowitsch if (size > 1) { 4379566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] %" PetscInt_FMT ":", rank, 20 * i)); 438ca0c3be5SJacob Faibussowitsch } else { 4399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT ":", 20 * i)); 440ca0c3be5SJacob Faibussowitsch } 44148a46eb9SPierre Jolivet for (j = 0; j < 20; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " %" PetscInt_FMT, idx[i * 20 + j])); 4429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 443e5c89e4eSSatish Balay } 444e5c89e4eSSatish Balay if (p) { 445ca0c3be5SJacob Faibussowitsch if (size > 1) { 4469566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] %" PetscInt_FMT ":", rank, 20 * n)); 447ca0c3be5SJacob Faibussowitsch } else { 4489566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%" PetscInt_FMT ":", 20 * n)); 449ca0c3be5SJacob Faibussowitsch } 4509566063dSJacob Faibussowitsch for (i = 0; i < p; i++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " %" PetscInt_FMT, idx[20 * n + i])); 4519566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 452e5c89e4eSSatish Balay } 4539566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 4549566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 4556805f65bSBarry Smith } else if (isbinary) { 456ca0c3be5SJacob Faibussowitsch PetscMPIInt *sizes, Ntotal, *displs, NN; 457e5c89e4eSSatish Balay PetscInt *array; 458783b601eSJed Brown 4599566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(N, &NN)); 460e5c89e4eSSatish Balay 461e5c89e4eSSatish Balay if (size > 1) { 462e5c89e4eSSatish Balay if (rank) { 4639566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gather(&NN, 1, MPI_INT, NULL, 0, MPI_INT, 0, comm)); 4649566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gatherv((void *)idx, NN, MPIU_INT, NULL, NULL, NULL, MPIU_INT, 0, comm)); 465e5c89e4eSSatish Balay } else { 4669566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(size, &sizes)); 4679566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gather(&NN, 1, MPI_INT, sizes, 1, MPI_INT, 0, comm)); 468e5c89e4eSSatish Balay Ntotal = sizes[0]; 4699566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(size, &displs)); 470e5c89e4eSSatish Balay displs[0] = 0; 471e5c89e4eSSatish Balay for (i = 1; i < size; i++) { 472e5c89e4eSSatish Balay Ntotal += sizes[i]; 473e5c89e4eSSatish Balay displs[i] = displs[i - 1] + sizes[i - 1]; 474e5c89e4eSSatish Balay } 4759566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(Ntotal, &array)); 4769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gatherv((void *)idx, NN, MPIU_INT, array, sizes, displs, MPIU_INT, 0, comm)); 4779566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, array, Ntotal, PETSC_INT)); 4789566063dSJacob Faibussowitsch PetscCall(PetscFree(sizes)); 4799566063dSJacob Faibussowitsch PetscCall(PetscFree(displs)); 4809566063dSJacob Faibussowitsch PetscCall(PetscFree(array)); 481e5c89e4eSSatish Balay } 482e5c89e4eSSatish Balay } else { 4839566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, idx, N, PETSC_INT)); 484e5c89e4eSSatish Balay } 485e5c89e4eSSatish Balay } else { 486e5c89e4eSSatish Balay const char *tname; 4879566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)viewer, &tname)); 48898921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot handle that PetscViewer of type %s", tname); 489e5c89e4eSSatish Balay } 490e5c89e4eSSatish Balay PetscFunctionReturn(0); 491e5c89e4eSSatish Balay } 492e5c89e4eSSatish Balay 493e5c89e4eSSatish Balay /*@C 494e5c89e4eSSatish Balay PetscRealView - Prints an array of doubles; useful for debugging. 495e5c89e4eSSatish Balay 496811af0c4SBarry Smith Collective on viewer 497e5c89e4eSSatish Balay 498e5c89e4eSSatish Balay Input Parameters: 499811af0c4SBarry Smith + N - number of `PetscReal` in array 500811af0c4SBarry Smith . idx - array of `PetscReal` 501811af0c4SBarry Smith - viewer - location to print array, `PETSC_VIEWER_STDOUT_WORLD`, `PETSC_VIEWER_STDOUT_SELF` or 0 502e5c89e4eSSatish Balay 503e5c89e4eSSatish Balay Level: intermediate 504e5c89e4eSSatish Balay 505811af0c4SBarry Smith Note: 506811af0c4SBarry Smith This may be called from within the debugger 507300a7f5bSBarry Smith 508811af0c4SBarry Smith Developer Note: 509811af0c4SBarry Smith idx cannot be const because may be passed to binary viewer where temporary byte swapping may be done 510811af0c4SBarry Smith 511811af0c4SBarry Smith .seealso: `PetscViewer`, `PetscIntView()` 512e5c89e4eSSatish Balay @*/ 513*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRealView(PetscInt N, const PetscReal idx[], PetscViewer viewer) 514*d71ae5a4SJacob Faibussowitsch { 515ca0c3be5SJacob Faibussowitsch PetscMPIInt rank, size; 516e5c89e4eSSatish Balay PetscInt j, i, n = N / 5, p = N % 5; 517ace3abfcSBarry Smith PetscBool iascii, isbinary; 518e5c89e4eSSatish Balay MPI_Comm comm; 519e5c89e4eSSatish Balay 520e5c89e4eSSatish Balay PetscFunctionBegin; 521e5c89e4eSSatish Balay if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 5220700a824SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 3); 523064a246eSJacob Faibussowitsch PetscValidRealPointer(idx, 2); 5249566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm)); 5259566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 5269566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 527e5c89e4eSSatish Balay 5289566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 5299566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary)); 530e5c89e4eSSatish Balay if (iascii) { 5311a989b97SToby Isaac PetscInt tab; 5321a989b97SToby Isaac 5339566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 5349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(viewer, &tab)); 535e5c89e4eSSatish Balay for (i = 0; i < n; i++) { 5369566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tab)); 537ca0c3be5SJacob Faibussowitsch if (size > 1) { 5389566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] %2" PetscInt_FMT ":", rank, 5 * i)); 539ca0c3be5SJacob Faibussowitsch } else { 5409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%2" PetscInt_FMT ":", 5 * i)); 541ca0c3be5SJacob Faibussowitsch } 5429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, 0)); 54348a46eb9SPierre Jolivet for (j = 0; j < 5; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " %12.4e", (double)idx[i * 5 + j])); 5449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 545e5c89e4eSSatish Balay } 546e5c89e4eSSatish Balay if (p) { 5479566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tab)); 548ca0c3be5SJacob Faibussowitsch if (size > 1) { 5499566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] %2" PetscInt_FMT ":", rank, 5 * n)); 550ca0c3be5SJacob Faibussowitsch } else { 5519566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%2" PetscInt_FMT ":", 5 * n)); 552ca0c3be5SJacob Faibussowitsch } 5539566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, 0)); 5549566063dSJacob Faibussowitsch for (i = 0; i < p; i++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " %12.4e", (double)idx[5 * n + i])); 5559566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 556e5c89e4eSSatish Balay } 5579566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 5589566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tab)); 5599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 5606805f65bSBarry Smith } else if (isbinary) { 561ca0c3be5SJacob Faibussowitsch PetscMPIInt *sizes, *displs, Ntotal, NN; 562e5c89e4eSSatish Balay PetscReal *array; 563e5c89e4eSSatish Balay 5649566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(N, &NN)); 565e5c89e4eSSatish Balay 566e5c89e4eSSatish Balay if (size > 1) { 567e5c89e4eSSatish Balay if (rank) { 5689566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gather(&NN, 1, MPI_INT, NULL, 0, MPI_INT, 0, comm)); 5699566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gatherv((PetscReal *)idx, NN, MPIU_REAL, NULL, NULL, NULL, MPIU_REAL, 0, comm)); 570e5c89e4eSSatish Balay } else { 5719566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(size, &sizes)); 5729566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gather(&NN, 1, MPI_INT, sizes, 1, MPI_INT, 0, comm)); 573e5c89e4eSSatish Balay Ntotal = sizes[0]; 5749566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(size, &displs)); 575e5c89e4eSSatish Balay displs[0] = 0; 576e5c89e4eSSatish Balay for (i = 1; i < size; i++) { 577e5c89e4eSSatish Balay Ntotal += sizes[i]; 578e5c89e4eSSatish Balay displs[i] = displs[i - 1] + sizes[i - 1]; 579e5c89e4eSSatish Balay } 5809566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(Ntotal, &array)); 5819566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gatherv((PetscReal *)idx, NN, MPIU_REAL, array, sizes, displs, MPIU_REAL, 0, comm)); 5829566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, array, Ntotal, PETSC_REAL)); 5839566063dSJacob Faibussowitsch PetscCall(PetscFree(sizes)); 5849566063dSJacob Faibussowitsch PetscCall(PetscFree(displs)); 5859566063dSJacob Faibussowitsch PetscCall(PetscFree(array)); 586e5c89e4eSSatish Balay } 587e5c89e4eSSatish Balay } else { 5889566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, (void *)idx, N, PETSC_REAL)); 589e5c89e4eSSatish Balay } 590e5c89e4eSSatish Balay } else { 591e5c89e4eSSatish Balay const char *tname; 5929566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)viewer, &tname)); 59398921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot handle that PetscViewer of type %s", tname); 594e5c89e4eSSatish Balay } 595e5c89e4eSSatish Balay PetscFunctionReturn(0); 596e5c89e4eSSatish Balay } 597e5c89e4eSSatish Balay 598e5c89e4eSSatish Balay /*@C 599811af0c4SBarry Smith PetscScalarView - Prints an array of `PetscScalar`; useful for debugging. 600e5c89e4eSSatish Balay 601811af0c4SBarry Smith Collective on viewer 602e5c89e4eSSatish Balay 603e5c89e4eSSatish Balay Input Parameters: 604e5c89e4eSSatish Balay + N - number of scalars in array 605e5c89e4eSSatish Balay . idx - array of scalars 606811af0c4SBarry Smith - viewer - location to print array, `PETSC_VIEWER_STDOUT_WORLD`, `PETSC_VIEWER_STDOUT_SELF` or 0 607e5c89e4eSSatish Balay 608e5c89e4eSSatish Balay Level: intermediate 609e5c89e4eSSatish Balay 610811af0c4SBarry Smith Note: 611811af0c4SBarry Smith This may be called from within the debugger 612300a7f5bSBarry Smith 613811af0c4SBarry Smith Developer Note: 614811af0c4SBarry Smith idx cannot be const because may be passed to binary viewer where byte swapping may be done 615811af0c4SBarry Smith 616811af0c4SBarry Smith .seealso: `PetscViewer`, `PetscIntView()`, `PetscRealView()` 617e5c89e4eSSatish Balay @*/ 618*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscScalarView(PetscInt N, const PetscScalar idx[], PetscViewer viewer) 619*d71ae5a4SJacob Faibussowitsch { 620ca0c3be5SJacob Faibussowitsch PetscMPIInt rank, size; 621e5c89e4eSSatish Balay PetscInt j, i, n = N / 3, p = N % 3; 622ace3abfcSBarry Smith PetscBool iascii, isbinary; 623e5c89e4eSSatish Balay MPI_Comm comm; 624e5c89e4eSSatish Balay 625e5c89e4eSSatish Balay PetscFunctionBegin; 626e5c89e4eSSatish Balay if (!viewer) viewer = PETSC_VIEWER_STDOUT_SELF; 627e5c89e4eSSatish Balay PetscValidHeader(viewer, 3); 6288c34849bSStefano Zampini if (N) PetscValidScalarPointer(idx, 2); 6299566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm)); 6309566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 6319566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 632e5c89e4eSSatish Balay 6339566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 6349566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary)); 635e5c89e4eSSatish Balay if (iascii) { 6369566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 637e5c89e4eSSatish Balay for (i = 0; i < n; i++) { 638ca0c3be5SJacob Faibussowitsch if (size > 1) { 6399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] %2" PetscInt_FMT ":", rank, 3 * i)); 640ca0c3be5SJacob Faibussowitsch } else { 6419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%2" PetscInt_FMT ":", 3 * i)); 642ca0c3be5SJacob Faibussowitsch } 643e5c89e4eSSatish Balay for (j = 0; j < 3; j++) { 644e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 6459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " (%12.4e,%12.4e)", (double)PetscRealPart(idx[i * 3 + j]), (double)PetscImaginaryPart(idx[i * 3 + j]))); 646e5c89e4eSSatish Balay #else 6479566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " %12.4e", (double)idx[i * 3 + j])); 648e5c89e4eSSatish Balay #endif 649e5c89e4eSSatish Balay } 6509566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 651e5c89e4eSSatish Balay } 652e5c89e4eSSatish Balay if (p) { 653ca0c3be5SJacob Faibussowitsch if (size > 1) { 6549566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] %2" PetscInt_FMT ":", rank, 3 * n)); 655ca0c3be5SJacob Faibussowitsch } else { 6569566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%2" PetscInt_FMT ":", 3 * n)); 657ca0c3be5SJacob Faibussowitsch } 658e5c89e4eSSatish Balay for (i = 0; i < p; i++) { 659e5c89e4eSSatish Balay #if defined(PETSC_USE_COMPLEX) 6609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " (%12.4e,%12.4e)", (double)PetscRealPart(idx[n * 3 + i]), (double)PetscImaginaryPart(idx[n * 3 + i]))); 661e5c89e4eSSatish Balay #else 6629566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, " %12.4e", (double)idx[3 * n + i])); 663e5c89e4eSSatish Balay #endif 664e5c89e4eSSatish Balay } 6659566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 666e5c89e4eSSatish Balay } 6679566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 6689566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 6696805f65bSBarry Smith } else if (isbinary) { 670ca0c3be5SJacob Faibussowitsch PetscMPIInt *sizes, Ntotal, *displs, NN; 671e5c89e4eSSatish Balay PetscScalar *array; 672e5c89e4eSSatish Balay 6739566063dSJacob Faibussowitsch PetscCall(PetscMPIIntCast(N, &NN)); 674e5c89e4eSSatish Balay 675e5c89e4eSSatish Balay if (size > 1) { 676e5c89e4eSSatish Balay if (rank) { 6779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gather(&NN, 1, MPI_INT, NULL, 0, MPI_INT, 0, comm)); 6789566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gatherv((void *)idx, NN, MPIU_SCALAR, NULL, NULL, NULL, MPIU_SCALAR, 0, comm)); 679e5c89e4eSSatish Balay } else { 6809566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(size, &sizes)); 6819566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gather(&NN, 1, MPI_INT, sizes, 1, MPI_INT, 0, comm)); 682e5c89e4eSSatish Balay Ntotal = sizes[0]; 6839566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(size, &displs)); 684e5c89e4eSSatish Balay displs[0] = 0; 685e5c89e4eSSatish Balay for (i = 1; i < size; i++) { 686e5c89e4eSSatish Balay Ntotal += sizes[i]; 687e5c89e4eSSatish Balay displs[i] = displs[i - 1] + sizes[i - 1]; 688e5c89e4eSSatish Balay } 6899566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(Ntotal, &array)); 6909566063dSJacob Faibussowitsch PetscCallMPI(MPI_Gatherv((void *)idx, NN, MPIU_SCALAR, array, sizes, displs, MPIU_SCALAR, 0, comm)); 6919566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, array, Ntotal, PETSC_SCALAR)); 6929566063dSJacob Faibussowitsch PetscCall(PetscFree(sizes)); 6939566063dSJacob Faibussowitsch PetscCall(PetscFree(displs)); 6949566063dSJacob Faibussowitsch PetscCall(PetscFree(array)); 695e5c89e4eSSatish Balay } 696e5c89e4eSSatish Balay } else { 6979566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, (void *)idx, N, PETSC_SCALAR)); 698e5c89e4eSSatish Balay } 699e5c89e4eSSatish Balay } else { 700e5c89e4eSSatish Balay const char *tname; 7019566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)viewer, &tname)); 70298921bdaSJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot handle that PetscViewer of type %s", tname); 703e5c89e4eSSatish Balay } 704e5c89e4eSSatish Balay PetscFunctionReturn(0); 705e5c89e4eSSatish Balay } 706e5c89e4eSSatish Balay 707e22e20c5SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 7080e6b6b59SJacob Faibussowitsch #include <petscdevice_cuda.h> 709*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN const char *PetscCUBLASGetErrorName(cublasStatus_t status) 710*d71ae5a4SJacob Faibussowitsch { 711e22e20c5SJunchao Zhang switch (status) { 712e22e20c5SJunchao Zhang #if (CUDART_VERSION >= 8000) /* At least CUDA 8.0 of Sep. 2016 had these */ 713*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_SUCCESS: 714*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_SUCCESS"; 715*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_NOT_INITIALIZED: 716*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_NOT_INITIALIZED"; 717*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_ALLOC_FAILED: 718*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_ALLOC_FAILED"; 719*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_INVALID_VALUE: 720*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_INVALID_VALUE"; 721*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_ARCH_MISMATCH: 722*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_ARCH_MISMATCH"; 723*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_MAPPING_ERROR: 724*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_MAPPING_ERROR"; 725*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_EXECUTION_FAILED: 726*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_EXECUTION_FAILED"; 727*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_INTERNAL_ERROR: 728*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_INTERNAL_ERROR"; 729*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_NOT_SUPPORTED: 730*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_NOT_SUPPORTED"; 731*d71ae5a4SJacob Faibussowitsch case CUBLAS_STATUS_LICENSE_ERROR: 732*d71ae5a4SJacob Faibussowitsch return "CUBLAS_STATUS_LICENSE_ERROR"; 733e22e20c5SJunchao Zhang #endif 734*d71ae5a4SJacob Faibussowitsch default: 735*d71ae5a4SJacob Faibussowitsch return "unknown error"; 736e22e20c5SJunchao Zhang } 737e22e20c5SJunchao Zhang } 738*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN const char *PetscCUSolverGetErrorName(cusolverStatus_t status) 739*d71ae5a4SJacob Faibussowitsch { 740a4b895e1SBarry Smith switch (status) { 741a4b895e1SBarry Smith #if (CUDART_VERSION >= 8000) /* At least CUDA 8.0 of Sep. 2016 had these */ 742*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_SUCCESS: 743*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_SUCCESS"; 744*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_NOT_INITIALIZED: 745*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_NOT_INITIALIZED"; 746*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_INVALID_VALUE: 747*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_INVALID_VALUE"; 748*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_ARCH_MISMATCH: 749*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_ARCH_MISMATCH"; 750*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_INTERNAL_ERROR: 751*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_INTERNAL_ERROR"; 752030f984aSJacob Faibussowitsch #if (CUDART_VERSION >= 9000) /* CUDA 9.0 had these defined on June 2021 */ 753*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_ALLOC_FAILED: 754*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_ALLOC_FAILED"; 755*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_MAPPING_ERROR: 756*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_MAPPING_ERROR"; 757*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_EXECUTION_FAILED: 758*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_EXECUTION_FAILED"; 759*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED: 760*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED"; 761*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_NOT_SUPPORTED: 762*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_NOT_SUPPORTED "; 763*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_ZERO_PIVOT: 764*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_ZERO_PIVOT"; 765*d71ae5a4SJacob Faibussowitsch case CUSOLVER_STATUS_INVALID_LICENSE: 766*d71ae5a4SJacob Faibussowitsch return "CUSOLVER_STATUS_INVALID_LICENSE"; 767a4b895e1SBarry Smith #endif 768030f984aSJacob Faibussowitsch #endif 769*d71ae5a4SJacob Faibussowitsch default: 770*d71ae5a4SJacob Faibussowitsch return "unknown error"; 771030f984aSJacob Faibussowitsch } 772030f984aSJacob Faibussowitsch } 773*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN const char *PetscCUFFTGetErrorName(cufftResult result) 774*d71ae5a4SJacob Faibussowitsch { 775030f984aSJacob Faibussowitsch switch (result) { 776*d71ae5a4SJacob Faibussowitsch case CUFFT_SUCCESS: 777*d71ae5a4SJacob Faibussowitsch return "CUFFT_SUCCESS"; 778*d71ae5a4SJacob Faibussowitsch case CUFFT_INVALID_PLAN: 779*d71ae5a4SJacob Faibussowitsch return "CUFFT_INVALID_PLAN"; 780*d71ae5a4SJacob Faibussowitsch case CUFFT_ALLOC_FAILED: 781*d71ae5a4SJacob Faibussowitsch return "CUFFT_ALLOC_FAILED"; 782*d71ae5a4SJacob Faibussowitsch case CUFFT_INVALID_TYPE: 783*d71ae5a4SJacob Faibussowitsch return "CUFFT_INVALID_TYPE"; 784*d71ae5a4SJacob Faibussowitsch case CUFFT_INVALID_VALUE: 785*d71ae5a4SJacob Faibussowitsch return "CUFFT_INVALID_VALUE"; 786*d71ae5a4SJacob Faibussowitsch case CUFFT_INTERNAL_ERROR: 787*d71ae5a4SJacob Faibussowitsch return "CUFFT_INTERNAL_ERROR"; 788*d71ae5a4SJacob Faibussowitsch case CUFFT_EXEC_FAILED: 789*d71ae5a4SJacob Faibussowitsch return "CUFFT_EXEC_FAILED"; 790*d71ae5a4SJacob Faibussowitsch case CUFFT_SETUP_FAILED: 791*d71ae5a4SJacob Faibussowitsch return "CUFFT_SETUP_FAILED"; 792*d71ae5a4SJacob Faibussowitsch case CUFFT_INVALID_SIZE: 793*d71ae5a4SJacob Faibussowitsch return "CUFFT_INVALID_SIZE"; 794*d71ae5a4SJacob Faibussowitsch case CUFFT_UNALIGNED_DATA: 795*d71ae5a4SJacob Faibussowitsch return "CUFFT_UNALIGNED_DATA"; 796*d71ae5a4SJacob Faibussowitsch case CUFFT_INCOMPLETE_PARAMETER_LIST: 797*d71ae5a4SJacob Faibussowitsch return "CUFFT_INCOMPLETE_PARAMETER_LIST"; 798*d71ae5a4SJacob Faibussowitsch case CUFFT_INVALID_DEVICE: 799*d71ae5a4SJacob Faibussowitsch return "CUFFT_INVALID_DEVICE"; 800*d71ae5a4SJacob Faibussowitsch case CUFFT_PARSE_ERROR: 801*d71ae5a4SJacob Faibussowitsch return "CUFFT_PARSE_ERROR"; 802*d71ae5a4SJacob Faibussowitsch case CUFFT_NO_WORKSPACE: 803*d71ae5a4SJacob Faibussowitsch return "CUFFT_NO_WORKSPACE"; 804*d71ae5a4SJacob Faibussowitsch case CUFFT_NOT_IMPLEMENTED: 805*d71ae5a4SJacob Faibussowitsch return "CUFFT_NOT_IMPLEMENTED"; 806*d71ae5a4SJacob Faibussowitsch case CUFFT_LICENSE_ERROR: 807*d71ae5a4SJacob Faibussowitsch return "CUFFT_LICENSE_ERROR"; 808*d71ae5a4SJacob Faibussowitsch case CUFFT_NOT_SUPPORTED: 809*d71ae5a4SJacob Faibussowitsch return "CUFFT_NOT_SUPPORTED"; 810*d71ae5a4SJacob Faibussowitsch default: 811*d71ae5a4SJacob Faibussowitsch return "unknown error"; 812a4b895e1SBarry Smith } 813a4b895e1SBarry Smith } 814e22e20c5SJunchao Zhang #endif 81559af0bd3SScott Kruger 81659af0bd3SScott Kruger #if defined(PETSC_HAVE_HIP) 8170e6b6b59SJacob Faibussowitsch #include <petscdevice_hip.h> 818*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN const char *PetscHIPBLASGetErrorName(hipblasStatus_t status) 819*d71ae5a4SJacob Faibussowitsch { 82059af0bd3SScott Kruger switch (status) { 821*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_SUCCESS: 822*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_SUCCESS"; 823*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_NOT_INITIALIZED: 824*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_NOT_INITIALIZED"; 825*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_ALLOC_FAILED: 826*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_ALLOC_FAILED"; 827*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_INVALID_VALUE: 828*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_INVALID_VALUE"; 829*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_ARCH_MISMATCH: 830*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_ARCH_MISMATCH"; 831*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_MAPPING_ERROR: 832*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_MAPPING_ERROR"; 833*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_EXECUTION_FAILED: 834*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_EXECUTION_FAILED"; 835*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_INTERNAL_ERROR: 836*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_INTERNAL_ERROR"; 837*d71ae5a4SJacob Faibussowitsch case HIPBLAS_STATUS_NOT_SUPPORTED: 838*d71ae5a4SJacob Faibussowitsch return "HIPBLAS_STATUS_NOT_SUPPORTED"; 839*d71ae5a4SJacob Faibussowitsch default: 840*d71ae5a4SJacob Faibussowitsch return "unknown error"; 84159af0bd3SScott Kruger } 84259af0bd3SScott Kruger } 84359af0bd3SScott Kruger #endif 844db9cea48SBarry Smith 845db9cea48SBarry Smith /*@ 846811af0c4SBarry Smith PetscMPIErrorString - Given an MPI error code returns the `MPI_Error_string()` appropriately 847db9cea48SBarry Smith formatted for displaying with the PETSc error handlers. 848db9cea48SBarry Smith 849db9cea48SBarry Smith Input Parameter: 850db9cea48SBarry Smith . err - the MPI error code 851db9cea48SBarry Smith 852db9cea48SBarry Smith Output Parameter: 853811af0c4SBarry Smith . string - the MPI error message, should declare its length to be larger than `MPI_MAX_ERROR_STRING` 854db9cea48SBarry Smith 85549c86fc7SBarry Smith Level: developer 85649c86fc7SBarry Smith 857811af0c4SBarry Smith Note: 858db9cea48SBarry Smith Does not return an error code or do error handling because it may be called from inside an error handler 859db9cea48SBarry Smith 860db9cea48SBarry Smith @*/ 861*d71ae5a4SJacob Faibussowitsch void PetscMPIErrorString(PetscMPIInt err, char *string) 862*d71ae5a4SJacob Faibussowitsch { 863db9cea48SBarry Smith char errorstring[MPI_MAX_ERROR_STRING]; 864db9cea48SBarry Smith PetscMPIInt len, j = 0; 865db9cea48SBarry Smith 866db9cea48SBarry Smith MPI_Error_string(err, (char *)errorstring, &len); 867db9cea48SBarry Smith for (PetscMPIInt i = 0; i < len; i++) { 868db9cea48SBarry Smith string[j++] = errorstring[i]; 869db9cea48SBarry Smith if (errorstring[i] == '\n') { 870db9cea48SBarry Smith for (PetscMPIInt k = 0; k < 16; k++) string[j++] = ' '; 871db9cea48SBarry Smith } 872db9cea48SBarry Smith } 873db9cea48SBarry Smith string[j] = 0; 874db9cea48SBarry Smith } 875