[petsc-users] Strange behavior of TS after setting hand-coded Jacobian

Zhang, Hong hongzhang at anl.gov
Wed Oct 27 09:43:54 CDT 2021


Since your Jacobian matrix is small, it is possible to compare your hand-written Jacobian with the finite-difference approximation directly. Add -snes_test_jacobian_view to print out the matrices. Then you can see exactly where the difference is.

Hong

> On Oct 27, 2021, at 12:47 AM, 仓宇 <yhcy1993 at gmail.com> wrote:
> 
> Thanks for your kind reply.
> 
> Several comparison tests have been performed. Attached are execution
> output files. Below are corresponding descriptions.
> 
> good.txt -- Run without hand-coded jacobian, solution converged, with
> option '-ts_monitor -snes_monitor -snes_converged_reason
> -ksp_monitor_true_residual -ksp_converged_reason';
> jac1.txt -- Run with hand-coded jacobian, does not converge, with
> option '-ts_monitor -snes_monitor -snes_converged_reason
> -ksp_monitor_true_residual -ksp_converged_reason -snes_test_jacobian';
> jac2.txt -- Run with hand-coded jacobian, does not converge, with
> option '-ts_monitor -snes_monitor -snes_converged_reason
> -ksp_monitor_true_residual -ksp_converged_reason -snes_test_jacobian
> -ksp_view';
> jac3.txt -- Run with hand-coded jacobian, does not converge, with
> option '-ts_monitor -snes_monitor -snes_converged_reason
> -ksp_monitor_true_residual -ksp_converged_reason -snes_test_jacobian
> -ksp_view -ts_max_snes_failures -1 ';
> 
> The problem under consideration contains an eigen-value to be solved,
> making the first diagonal element of the jacobian matrix being zero.
> From these outputs, it seems that the PC failed to factorize, which is
> caused by this 0 diagonal element.  But I'm wondering why it works
> with jacobian matrix generated by finite-difference? Would employing
> DMDA for discretization be helpful?
> 
> Regards
> 
> Yu Cang
> 
> Barry Smith <bsmith at petsc.dev> 于2021年10月25日周一 下午10:50写道:
>> 
>> 
>>  It is definitely unexpected that -snes_test_jacobian verifies the Jacobian as matching but the solve process is completely different.
>> 
>>   Please run with -snes_monitor -snes_converged_reason -ksp_monitor_true_residual -ksp_converged_reason -snes_test_jacobian and send all the output
>> 
>>  Barry
>> 
>> 
>>> On Oct 25, 2021, at 9:53 AM, 仓宇 <yhcy1993 at gmail.com> wrote:
>>> 
>>> I'm using TS to solve a set of DAE, which originates from a
>>> one-dimensional problem. The grid points are uniformly distributed.
>>> For simplicity, the DMDA is not employed for discretization.
>>> 
>>> At first, only the residual function is prescribed through
>>> 'TSSetIFunction', and PETSC produces converged results. However, after
>>> providing hand-coded Jacobian through 'TSSetIJacobian', the internal
>>> SNES object fails (residual norm does not change), and TS reports
>>> 'DIVERGED_STEP_REJECTED'.
>>> 
>>> I have tried to add the option '-snes_test_jacobian' to see if the
>>> hand-coded jacobian is somewhere wrong, but it shows '||J -
>>> Jfd||_F/||J||_F = 1.07488e-10, ||J - Jfd||_F = 2.14458e-07',
>>> indicating that the hand-coded jacobian is correct.
>>> 
>>> Then, I added a monitor for the internal SNES object through
>>> 'SNESMonitorSet', in which the solution vector will be displayed at
>>> each iteration. It is interesting to find that, if the jacobian is not
>>> provided, meaning finite-difference is utilized for jacobian
>>> evaluation internally, the solution vector converges to steady
>>> solution and the SNES residual norm is reduced continuously. However,
>>> it turns out that, as long as the jacobian is provided, the solution
>>> vector will NEVER get changed! So the solution procedure stucked!
>>> 
>>> This is quite strange!  Hope to get some advice.
>>> PETSC version=3.14.6, program run in serial mode.
>>> 
>>> Regards
>>> 
>>> Yu Cang
>> 
> <jac3.txt><jac2.txt><jac1.txt><good.txt>



More information about the petsc-users mailing list