[petsc-users] Issues with the Variational Inequality solver
Barry Smith
bsmith at mcs.anl.gov
Tue Dec 1 18:58:10 CST 2015
> On Dec 1, 2015, at 5:13 PM, Justin Chang <jychang48 at gmail.com> wrote:
>
> Hi all,
>
> So I am running into some issues with the SNESVINEWTONRSLS solver. I originally had this done in firedrake, but have ported it to petsc4py. Attached is the code as well as the two required input files.
>
> First issue, when I run the program like this:
>
> python testVI.py psiA_1 psiB_1 2 1
>
> I get this error:
>
> Traceback (most recent call last):
> File "testVI.py", line 103, in <module>
> snes.solve(None,X)
> File "PETSc/SNES.pyx", line 520, in petsc4py.PETSc.SNES.solve (src/petsc4py.PETSc.c:169677)
> petsc4py.PETSc.Error: error code 60
> [0] SNESSolve() line 3992 in /Users/justin/Software/petsc/src/snes/interface/snes.c
> [0] SNESSolve_VINEWTONRSLS() line 507 in /Users/justin/Software/petsc/src/snes/impls/vi/rs/virs.c
> [0] KSPSetOperators() line 544 in /Users/justin/Software/petsc/src/ksp/ksp/interface/itcreate.c
> [0] PCSetOperators() line 1170 in /Users/justin/Software/petsc/src/ksp/pc/interface/precon.c
> [0] Nonconforming object sizes
> [0] Cannot change local size of Amat after use old sizes 2 2 new sizes 3 3
>
> No such error occurred when this was ran in firedrake, though I did notice that -snes_view did indicate that some of the iterations had 2x2 instead of 3x3 matrices. Why is this happening? I thought I should be solving a 3x3 system each time so why would a 2x2 ever arise?
Justin,
For VI's the rs (reduced space solver) solves the linearized problem on a subset of the variables, thus the size of the linear system may change from iteration of Newton to the next iteration of Newton.
In the rs solver we have
ierr = ISEqual(vi->IS_inact_prev,vi->IS_inact,&isequal);CHKERRQ(ierr);
if (!isequal) {
ierr = SNESVIResetPCandKSP(snes,jac_inact_inact,prejac_inact_inact);CHKERRQ(ierr);
}
so what __should__ happen is that if the size of the reduced space changes KSPReset() is called on the KSP allowing the KSP/PC to handle a different sized system then before. But why doesn't it work? Why isn't KSPReset() called? Somehow the ISEqual is not working.
Can you run the C debugger and put a breakpoint in the ISEqual() then check the inputs and see if it is correctly setting the isequal to false when it should? Each time the vi->IS_inact changes the KSPReset() should get called. You can check this in the debugger.
Barry
>
> More issues to come :)
>
> Thanks,
> Justin
> <testVI.py><psiA_1><psiB_1>
More information about the petsc-users
mailing list