Dear Petsc-Users,
I am implementing a 1D solution of the (drift/diffusion) semiconductor 
equations.  The case of Dirichlet boundaries works fine.  The case of Neumann 
boundaries (i.e. current boundary conditions such as occur at 
semiconductor/metal contacts) does not.   In sorting this out, I have modified 
one of your examples to recreate the problem:

The (modified) example seeks to solve
u`` + u^{2} = f
on [0,1] with
u'(0) = U0
u(1) = 1

With U0 = 0, the SNES solver converges.  With U0=-2 (for example) it does not:
 11 SNES Function norm 5.018284941187e+00
Nonlinear solve did not converge due to DIVERGED_LS_FAILURE

(interestingly, it still comes up with roughly good solutions, e.g. at least 
visually, which suggests to me my discretization is not _total_ garbage)

Along the way (with -info) I get messages of the form:
SNESLSCheckResidual_Private(): ||J^T(F-Ax)||/||F-AX|| 208.031 near zero implies 
inconsistent rhs

At the end, I get:
[0] SNESLSCheckLocalMin_Private(): || J^T F|| 80.3 near zero implies found a 
local minimum

I have used -snes_type test to verify that my Jacobian is accurate.
I have also dumped the Jacobians to a file and examined their condition 
numbers.  The nonconverged cases have condition numbers around 10^7, whereas 
the converged cases have condition numbers around 10^3.  This seems like a 
clue, but I'm not sure what to do about it.

All this is completely analogous to the real case of interest (in that case, my 
condition numbers go to 10^13 or more, and there is similar visual evidence 
that the solver is "trying" to do the right thing).
I would love to have help getting this to work.  Specifically, what does the 
message about the "inconsistent rhs" tell me I'm doing wrong?  What is the 
evidence of the condition number telling me?  Do I have an error somewhere, or 
do I have a legitimately ill-conditioned Jacobian (in which case, what should I 
do about that?)?

Thank you very much for any advice,

Peter Graf
NREL Scientific Computing Center
Golden, CO

Reply via email to