[petsc-users] divergence of quasi-Newton scheme (SNES)

Barry Smith bsmith at petsc.dev
Tue May 25 15:51:07 CDT 2021


 Yes,  with your options I would expect the first SNES iteration of QN  to produce the same result as the first iteration of SNES Newton ls. 

  I have fixed an error that crept (well actually I put it there) in where KSPSetFromOptions() was not being called with the QN and Jacobian option, hence only the default PC (ilu) was being used so if you changed the PC it only affected Newton not QN. I also made it possible to run with a history of length 0 so that with the Jacobian option it should exactly match Newton for all iterations. 

  You can access my fixes with 

   get fetch
   git checkout barry/2021-05-25/fix-qn-jacobian-setfromoptions/release

  The merge request with the fixes for release is here https://gitlab.com/petsc/petsc/-/merge_requests/4018 <https://gitlab.com/petsc/petsc/-/merge_requests/4018>

   I checked it with the runs below. Using first -pc_type lu then the default PC. 

~/Src/petsc/src/snes/tutorials (barry/2021-05-25/fix-qn-jacobian-setfromoptions/release *=) arch-fix-qn-jacobian-setfromoptions
$ ./ex19 -pc_type lu -snes_monitor -snes_type qn -snes_qn_type lbfgs -snes_qn_m 0 -snes_qn_restart_type periodic -snes_qn_scale_type jacobian -snes_linesearch_type basic 
lid velocity = 0.0625, prandtl # = 1., grashof # = 1.
  0 SNES Function norm 2.391552133017e-01 
  1 SNES Function norm 6.819684624592e-05 
  2 SNES Function norm 4.203401869625e-12 
Number of SNES iterations = 2
~/Src/petsc/src/snes/tutorials (barry/2021-05-25/fix-qn-jacobian-setfromoptions/release *=) arch-fix-qn-jacobian-setfromoptions
$ ./ex19 -pc_type lu -snes_monitor -snes_linesearch_type basic
lid velocity = 0.0625, prandtl # = 1., grashof # = 1.
  0 SNES Function norm 2.391552133017e-01 
  1 SNES Function norm 6.819684624592e-05 
  2 SNES Function norm 4.203401869625e-12 
Number of SNES iterations = 2
~/Src/petsc/src/snes/tutorials (barry/2021-05-25/fix-qn-jacobian-setfromoptions/release *=) arch-fix-qn-jacobian-setfromoptions
$ ./ex19  -snes_monitor -snes_linesearch_type basic
lid velocity = 0.0625, prandtl # = 1., grashof # = 1.
  0 SNES Function norm 2.391552133017e-01 
  1 SNES Function norm 6.839858507066e-05 
  2 SNES Function norm 8.558777232425e-11 
Number of SNES iterations = 2
~/Src/petsc/src/snes/tutorials (barry/2021-05-25/fix-qn-jacobian-setfromoptions/release *=) arch-fix-qn-jacobian-setfromoptions
$ ./ex19  -snes_monitor -snes_type qn -snes_qn_type lbfgs -snes_qn_m 0 -snes_qn_restart_type periodic -snes_qn_scale_type jacobian -snes_linesearch_type basic 
lid velocity = 0.0625, prandtl # = 1., grashof # = 1.
  0 SNES Function norm 2.391552133017e-01 
  1 SNES Function norm 6.839858507066e-05 
  2 SNES Function norm 8.558777232425e-11 
Number of SNES iterations = 2
~/Src/petsc/src/snes/tutorials (barry/2021-05-25/fix-qn-jacobian-setfromoptions/release *=) arch-fix-qn-jacobian-setfromoptions
$ ./ex19  -snes_monitor -snes_type qn -snes_qn_type lbfgs -snes_qn_m 1 -snes_qn_restart_type periodic -snes_qn_scale_type jacobian -snes_linesearch_type basic 
lid velocity = 0.0625, prandtl # = 1., grashof # = 1.
  0 SNES Function norm 2.391552133017e-01 
  1 SNES Function norm 6.839858507066e-05 
  2 SNES Function norm 1.977614824765e-05 
  3 SNES Function norm 1.286952209377e-10 
Number of SNES iterations = 3

  If you still have trouble with the branch you can run with -ksp_monitor -snes_linesearch_monitor -info -snes_view to see what may be different with your runs with Newton and with QN. 

  Barry

   
> On May 25, 2021, at 12:15 PM, hg <hgbk2008 at gmail.com> wrote:
> 
> Hello
> 
> I would expect the setting below would give the same behaviour like -snes_type newtonls -snes_linesearch_type basic:
> 
> -snes_type qn
> -snes_qn_type lbfgs
> -snes_qn_m 1
> -snes_qn_restart_type periodic
> -snes_qn_scale_type jacobian
> -snes_linesearch_type basic
> 
> But it's not, below is the convergence log:
> entering BuildRHS
> 0 SNES Function norm 7.450427214612e+03 
> entering BuildLHS
> entering BuildRHS
>   1 SNES Function norm 7.902262148182e+03 
> entering BuildRHS
>   2 SNES Function norm 8.426417730274e+03 
>     Periodic restart! i_r = 1
> entering BuildLHS
> entering BuildRHS
>   3 SNES Function norm 5.571513092130e+04 
> entering BuildRHS
>   4 SNES Function norm 4.019723509872e+05 
>     Periodic restart! i_r = 1
> entering BuildLHS
> entering BuildRHS
>   5 SNES Function norm 9.259722791615e+05 
> entering BuildRHS
>   6 SNES Function norm 3.985884724278e+08 
> Nonlinear solve did not converge due to DIVERGED_DTOL iterations 6
> 
> For -snes_type newtonls -snes_linesearch_type basic:
> 
> entering BuildRHS
>   0 SNES Function norm 7.450427214612e+03 
> entering BuildLHS
> entering BuildRHS
>   1 SNES Function norm 1.937109245338e+01 
> entering BuildLHS
> entering BuildRHS
>   2 SNES Function norm 8.126736406257e-01 
> entering BuildLHS
> entering BuildRHS
>   3 SNES Function norm 1.143237968970e-03 
> entering BuildLHS
> entering BuildRHS
>   4 SNES Function norm 2.706184329411e-09 
> Nonlinear solve converged due to CONVERGED_FNORM_RELATIVE iterations 4
> 
> Would it be the parameters not the same? My idea is first starting with a good configuration of lbfgs then increase the restart (m) to see how the convergence going (and save time).
> 
> Thanks
> Giang
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210525/eb446e42/attachment-0001.html>


More information about the petsc-users mailing list