[petsc-users] neumann failure in my version of snes ex12
Geoffrey Irving
irving at naml.us
Fri Nov 22 18:09:25 CST 2013
On Fri, Nov 22, 2013 at 3:41 PM, Matthew Knepley <knepley at gmail.com> wrote:
> On Fri, Nov 22, 2013 at 5:36 PM, Geoffrey Irving <irving at naml.us> wrote:
>>
>> I have a duplicate of snes ex12 (FEM Poisson) which works with
>> Dirichlet boundary conditions, but it's breaking for me with Neumann
>> conditions. In particular, with Neumann conditions I get results
>> which explode even though I believe I am setting a constant nullspace.
>>
>> For example, if I use two first order elements (the unit square
>> divided into two triangles), the resulting solution has
>>
>> L2 error = 1.75514e+08
>> u = [-175513825.75680602, -175513825.66302037,
>> -175513825.48390722, -175513824.84436429]
>>
>> This looks rather a lot like the null space isn't getting through. I
>> am creating the constant nullspace with
>>
>> MatNullSpace null;
>> CHECK(MatNullSpaceCreate(comm(),PETSC_TRUE,0,0,&null));
>> CHECK(MatSetNullSpace(m,null));
>> CHECK(MatNullSpaceDestroy(&null));
>>
>> If I pass "-ksp_view -mat_view", I get the following. The matrix
>> entries seem right (they do indeed have the constant nullspace), and
>> ksp_view shows that a nullspace is attached. Is attaching the
>> nullspace to the matrix with MatSetNullSpace enough, or do I need to
>> additionally attach it to the KSP object?
>
>
> 1) I always run with -ksp_monitor_true_residual now when debugging. This can
> give
> you an idea whether you have a singular PC, which I suspect here.
>
> 2) Can you try using -pc_type jacobi? I think ILU might go crazy on a
> deficient matrix.
Here are results with -ksp_monitor_true_residual -pc_type none:
http://naml.us/random/laplace-rtol.txt # with -ksp_rtol 1e-5
http://naml.us/random/laplace-atol.txt # with -ksp_atol 1e-5
Both versions converge in 3 iterations for the first SNES iteration,
but the relative one starts to churn after that since the residual
starts very small. The true residual goes down to 4/3 and stagnates.
Is there a convenient way to print out the RHS to see whether it has a
component in the nullspace (which seems likely given the true residual
stagnation)?
I suppose I already do print the result of SNESComputeFunction on the
zero vec, which is
RHS = [ 6.66666667e-01 1.33333333e+00 6.66666667e-01 1.11022302e-16]
Thanks,
Geoffrey
More information about the petsc-users
mailing list