xref: /petsc/src/sys/error/errstop.c (revision e32f2f54e699d0aa6e733466c00da7e34666fe5e)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay 
3d382aafbSBarry Smith #include "petscsys.h"           /*I "petscsys.h" I*/
4e5c89e4eSSatish Balay 
5e5c89e4eSSatish Balay #undef __FUNCT__
6e8fb0fc0SBarry Smith #define __FUNCT__ "PetscMPIAbortErrorHandler"
7e5c89e4eSSatish Balay /*@C
8e8fb0fc0SBarry Smith    PetscMPIAbortErrorHandler - Calls MPI_abort() and exits.
9e5c89e4eSSatish Balay 
10e5c89e4eSSatish Balay    Not Collective
11e5c89e4eSSatish Balay 
12e5c89e4eSSatish Balay    Input Parameters:
13*e32f2f54SBarry Smith +  comm - communicator over which error occurred
14*e32f2f54SBarry Smith .  line - the line number of the error (indicated by __LINE__)
15e5c89e4eSSatish Balay .  fun - the function where the error occurred (indicated by __FUNCT__)
16e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
17e5c89e4eSSatish Balay .  dir - the directory of the file (indicated by __SDIR__)
18e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
19e5c89e4eSSatish Balay .  n - the generic error number
20e5c89e4eSSatish Balay .  p - the specific error number
21e5c89e4eSSatish Balay -  ctx - error handler context
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Level: developer
24e5c89e4eSSatish Balay 
25e5c89e4eSSatish Balay    Notes:
26e5c89e4eSSatish Balay    Most users need not directly employ this routine and the other error
27e5c89e4eSSatish Balay    handlers, but can instead use the simplified interface SETERRQ, which has
28e5c89e4eSSatish Balay    the calling sequence
29*e32f2f54SBarry Smith $     SETERRQ(comm,n,p,mess)
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay    Notes for experienced users:
32e5c89e4eSSatish Balay    Use PetscPushErrorHandler() to set the desired error handler.  The
33e5c89e4eSSatish Balay    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
34e8fb0fc0SBarry Smith    PetscMPIAbortErrorHandler(), PetscAttachDebuggerErrorHandler(), and PetscAbortErrorHandler().
35e5c89e4eSSatish Balay 
36e5c89e4eSSatish Balay    Concepts: error handler^stopping
37e5c89e4eSSatish Balay 
38e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
39e5c89e4eSSatish Balay            PetscAbortErrorHandler(), PetscTraceBackErrorHandler()
40e5c89e4eSSatish Balay  @*/
41*e32f2f54SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscMPIAbortErrorHandler(MPI_Comm comm,int line,const char *fun,const char *file,const char *dir,PetscErrorCode n,int p,const char *mess,void *ctx)
42e5c89e4eSSatish Balay {
4390d69ab7SBarry Smith   PetscTruth     flg1 = PETSC_FALSE,flg2 = PETSC_FALSE;
44e5c89e4eSSatish Balay   PetscLogDouble mem,rss;
45e5c89e4eSSatish Balay 
46e5c89e4eSSatish Balay   PetscFunctionBegin;
47e5c89e4eSSatish Balay   if (!mess) mess = " ";
48e5c89e4eSSatish Balay 
49e5c89e4eSSatish Balay   if (n == PETSC_ERR_MEM) {
50e5c89e4eSSatish Balay     (*PetscErrorPrintf)("%s() line %d in %s%s\n",fun,line,dir,file);
51e5c89e4eSSatish Balay     (*PetscErrorPrintf)("Out of memory. This could be due to allocating\n");
52e5c89e4eSSatish Balay     (*PetscErrorPrintf)("too large an object or bleeding by not properly\n");
53e5c89e4eSSatish Balay     (*PetscErrorPrintf)("destroying unneeded objects.\n");
54e5c89e4eSSatish Balay     PetscMallocGetCurrentUsage(&mem); PetscMemoryGetCurrentUsage(&rss);
5590d69ab7SBarry Smith     PetscOptionsGetTruth(PETSC_NULL,"-malloc_dump",&flg1,PETSC_NULL);
5690d69ab7SBarry Smith     PetscOptionsGetTruth(PETSC_NULL,"-malloc_log",&flg2,PETSC_NULL);
57e5c89e4eSSatish Balay     if (flg2) {
58e5c89e4eSSatish Balay       PetscMallocDumpLog(stdout);
59e5c89e4eSSatish Balay     } else {
60e5c89e4eSSatish Balay       (*PetscErrorPrintf)("Memory allocated %D Memory used by process %D\n",(PetscInt)mem,(PetscInt)rss);
61e5c89e4eSSatish Balay       if (flg1) {
62e5c89e4eSSatish Balay         PetscMallocDump(stdout);
63e5c89e4eSSatish Balay       }  else {
64e5c89e4eSSatish Balay         (*PetscErrorPrintf)("Try running with -malloc_dump or -malloc_log for info.\n");
65e5c89e4eSSatish Balay       }
66e5c89e4eSSatish Balay     }
67e5c89e4eSSatish Balay   } else if (n == PETSC_ERR_SUP) {
68e5c89e4eSSatish Balay     (*PetscErrorPrintf)("%s() line %d in %s%s\n",fun,line,dir,file);
69e5c89e4eSSatish Balay     (*PetscErrorPrintf)("No support for this operation for this object type!\n");
70e5c89e4eSSatish Balay     (*PetscErrorPrintf)("%s\n",mess);
71e5c89e4eSSatish Balay   } else if (n == PETSC_ERR_SIG) {
72e5c89e4eSSatish Balay     (*PetscErrorPrintf)("%s() line %d in %s%s %s\n",fun,line,dir,file,mess);
73e5c89e4eSSatish Balay   } else {
74e5c89e4eSSatish Balay     (*PetscErrorPrintf)("%s() line %d in %s%s\n    %s\n",fun,line,dir,file,mess);
75e5c89e4eSSatish Balay   }
76e5c89e4eSSatish Balay   MPI_Abort(PETSC_COMM_WORLD,n);
77e5c89e4eSSatish Balay   PetscFunctionReturn(0);
78e5c89e4eSSatish Balay }
79e5c89e4eSSatish Balay 
80