[petsc-users] Handling infeasible solution iterates in TS/SNES
Steve
stevenbenbow at quintessa.org
Mon Sep 2 11:22:39 CDT 2019
Hello,
I have another beginner's PETSc question. Apologies if the solution is
obvious, but I've looked around the manual and the API and haven't yet
spotted a solution.
I'm solving a nonlinear problem using the BDF TSP (although the same
issue arises if I use BEULER and other TS - it's not specific to BDF).
The issue that I have is that during the SNES iterations for a timestep
it's possible for the solution iterates to wander into an infeasible
region when evaluating the TS IFunction. In the particular instance I
have this is resulting in an exp overflow, so it is both physically and
computationally infeasible.
The problem arises because of the highly nonlinear nature of the
problem. I have a hand-coded DAE solver that also suffers with the same
issue, but which spots that the situation had arisen in the evaluation
of the residual, and then rejects the timestep and takes a smaller one,
which is usually sufficient for the Newton iterates to remain feasible
and for timestepping to proceed. I would like to take the same approach
with PETSc.
Currently I return a non-zero PetscErrorCode from my IFunction to
indicate that the solution iterate is infeasible, but this results in an
immediate (but graceful) exit from PETSc.
Ideally I guess I would like to call a function like
TS/SNESSetIterateIsInfeasible(...) from within my IFunction and then
return zero, to indicate to PETSc that the Newton iterations have gone
awry but that nothing fatal has happened, or (better?) would return a
specific non-zero error code from my IFunction and handle the particular
error code by reducing the timestep. The crucial thing is that I can't
return a new residual from my IFunction when this happens, due to the
infeasibility of the input, and so PETSc should not use the value of the
residual itself to infer divergence.
Are either of these approaches possible? Or is there an
alternative/better approach that I can use with PETSc to handle such
situations? (I've seen SETERRQ in the API but this only appears to
allow tailored error messages to be set rather than providing a method
to handle them - but perhaps I have misunderstood.)
Again, apologies if this is a naive question, and thanks in advance for
any suggestions.
Steve
More information about the petsc-users
mailing list