[petsc-users] Call multiple error handler

Florian Lindner mailinglists at xgm.de
Wed Jan 11 07:00:20 CST 2017


Hey,

Am 10.01.2017 um 14:20 schrieb Barry Smith:
> 
> I do not understand what you mean. I hope this is C.

Yes, I'm talking about C(++).

I'm using PETSc functions like that:

  ierr = ISDestroy(&ISlocal); CHKERRV(ierr);

Unfortunately that is not alway possible, e.g. in this function:

std::pair<PetscInt, PetscInt> Vector::ownerRange()
{
  PetscInt range_start, range_end;
  VecGetOwnershipRange(vector, &range_start, &range_end);
  return std::make_pair(range_start, range_end);
}

CHKERRV would returns void, CHKERRQ returns an int (iirc). Neither is possible here. But that is not my main issue here.

For non PETSc related functions, I do not use CHKERRV and alike.

> 
> By default when an error is detected PetscError using PetscTraceBackErrorHandler returns up the stack printing the
> function/line number then returning to the next function which prints the function/line number until it gets up to
> the function main where it calls MPI_Abort.

Ok, we use petsc like that:

void myFunc() {
   PetscErrorCode ierr = 0;
   ierr = MatMultTranspose(_matrixA, in, Au); CHKERRV(ierr);
   [... no further error checking ...]
}

with the standard error handler this gives a nice traceback, but the application continues to run.

With a PetscPushErrorHandler(&PetscMPIAbortErrorHandler, nullptr); above these lines, that gives no traceback, just

[0]PETSC ERROR: MatMult() line 2244 in /home/florian/software/petsc/src/mat/interface/matrix.c
    Null Object: Parameter # 1

and the application aborts.

I want to combine these two traits. Print a nice traceback like the first example, then abort, like the second example.


> Now if one of the functions in the stack of functions is a user function that DOES NOT check a return code with
> CHKERRQ(ierr) then bad stuff happens because PetscError will print part of the stack of functions but then the user
> code (that ignores the error code) continues running generally causing bad and confusing things to happen.  This is
> why we recommend always using CHKERRQ() in user code.
> 
> From the perspective of PETSc error handling there really isn't any difference between user code and PETSc code.

I understand that. But changing our application so that every function returns an error code and is checked using
CHKERR* is not an option. The PETSc code is buried deeply in the framework.


>> However, I want my application to be aborted with the PetscMPIAbortErrorHandler when an error occures.
> 
> Do you mean that in your code when you detect an error you want SETERRQ() to call PetscMPIAbortErrorHandler()  but in
> PETSc code you want it to try to return through the stack printing the PETSc function/line numbers? You can do this
> by making your own macro mySETERRQ() that is defined to be a call to PetscMPIAbortErrorHandler and using mySETERRQ()
> to mark errors in your code.  Though I do not recommend this, better to use CHKERRQ() in your code and get error
> tracebacks for PETSc code and your code.

Ok, I'll keep that option in mind...

Best,
Florian

>> On Jan 10, 2017, at 6:42 AM, Florian Lindner <mailinglists at xgm.de> wrote:
>> 
>> Hello,
>> 
>> I really enjoy the verbosity (line number) of the default PetscTraceBackErrorHandler. However, I want my
>> application to be aborted with the PetscMPIAbortErrorHandler when an error occures.
>> 
>> Can I instruct PETSc to call first one handler, then another one?
>> 
>> Thanks, Florian
> 



More information about the petsc-users mailing list