[petsc-users] help needed for -snes_mf_operator

Matthew Knepley knepley at gmail.com
Thu Apr 26 08:28:14 CDT 2012


On Thu, Apr 26, 2012 at 9:24 AM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
> On Apr 26, 2012, at 6:28 AM, Dominik Szczerba wrote:
>
> > Jed, Barry, Matt:
> >
> > Below a collection of all pending answers in one mail.
>

You can use -pc_type lu to test for a rank deficient preconditioning matrix.

   Matt


> >> How do you define "right results"?
> >
> > I run the exact same problem on in a commercial FEM package and
> > compare the results. The test problem is diffusion-reaction, with a
> > nonlinear reaction term of a polynomial form (tested up to order 5). I
> > Form the Jacobian as follows. We have a problem Ax = b(x), with A
> > constant and b depending pointwise on x (i.e. db/dxn does not depend
> > on xm, m!=n). Therefore I provide a simple Jacobian equal to A with
> > the diagonal augmented with -db/dx. The relevant code is below. I do
> > hope I do something wrong and you can point it out.
> >
> >       ierr = MatCopy(that->system.A, *B, SAME_NONZERO_PATTERN);
> CHKERRQ(ierr);
> >
> >       ierr = VecScale(that->dbdx, -1.0); CHKERRQ(ierr);
> >       ierr = MatDiagonalSet(*B, that->dbdx, ADD_VALUES); CHKERRQ(ierr);
> >
> >       ierr = MatAssemblyBegin(*B, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> >       ierr = MatAssemblyEnd(*B, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> >
> >       if(*J != *B)
> >       {
> >               ierr = MatAssemblyBegin(*J, MAT_FINAL_ASSEMBLY);
> CHKERRQ(ierr);
> >               ierr = MatAssemblyEnd(*J, MAT_FINAL_ASSEMBLY);
> CHKERRQ(ierr);
> >       }
> >
> >       *flag = SAME_NONZERO_PATTERN;
> >
> >
> >> Is SNES converging quadratically when you
> >> do not use -snes_mf_operator?
> >
> > Without -snes_mf_operator, providing analytically derived Jacobian:
> >
> >  0 SNES Function norm 1.747536282885e+01
> >  1 SNES Function norm 1.918464419679e-03
> >  2 SNES Function norm 1.086746779744e-03
> >  3 SNES Function norm 2.904556511511e-06
> >  4 SNES Function norm 7.804808098453e-08
> >
> > Without -snes_mf_operator, passing A as the jacobian (which you call
> > Picard), and slightly underrelaxing the linear solves (otherwise it
> > would not converge):
> >
> >  0 SNES Function norm 1.747886139999e+01
> >  1 SNES Function norm 3.495796117011e+00
> >  2 SNES Function norm 6.991806248330e-01
> >  3 SNES Function norm 1.398879936054e-01
> >  4 SNES Function norm 2.809047018752e-02
> >  5 SNES Function norm 5.843745932752e-03
> >  6 SNES Function norm 1.594583643926e-03
> >  7 SNES Function norm 7.712066092135e-04
> >  8 SNES Function norm 4.932447251451e-04
> >  9 SNES Function norm 3.217945635817e-04
> > 10 SNES Function norm 2.129867244811e-04
> > 11 SNES Function norm 1.399983127264e-04
> > 12 SNES Function norm 9.246882776024e-05
> > 13 SNES Function norm 6.088284618615e-05
> > 14 SNES Function norm 4.017029247381e-05
> > 15 SNES Function norm 2.646770266042e-05
> > 16 SNES Function norm 1.745497080382e-05
> > 17 SNES Function norm 1.150437737331e-05
> > 18 SNES Function norm 7.585434690336e-06
> > 19 SNES Function norm 5.000147553531e-06
> > 20 SNES Function norm 3.296560754852e-06
> > 21 SNES Function norm 2.173152296533e-06
> > 22 SNES Function norm 1.432685503660e-06
> > 23 SNES Function norm 9.444717211995e-07
> > 24 SNES Function norm 6.226464090397e-07
> > 25 SNES Function norm 4.104757979681e-07
> > 26 SNES Function norm 2.706068836265e-07
> > 27 SNES Function norm 1.783963930887e-07
> > 28 SNES Function norm 1.176079057620e-07
> >
> > Dominik
> >
> >> Run with -snes_type test and see what it reports.
> >
> > Running with the options:
> >
> > -ksp_type bcgs -pc_type jacobi -ksp_rtol 1e-4 -ksp_max_it 1000
> > -ksp_converged_use_initial_residual_norm -ksp_norm_type
> > unpreconditioned -ksp_monitor_true_residual -ksp_converged_reason
> > -ksp_view -snes_monitor -snes_converged_reason -snes_ls_monitor
> > -snes_view -snes_type test -snes_test_display
> >
> > I get the output:
> >
> > Testing hand-coded Jacobian, if the ratio is
> > O(1.e-8), the hand-coded Jacobian is probably correct.
> >
> > and the procedure stagnates, calling FormJacobian only once, and then
> > FormFunction infinitely, with my own computation of ||F|| indicating
> > stagnation.
>
>    It is not calling it infinitely. Run with the -snes_type test option
> for a small problem, with say 10 unknowns to start.
>
>   Barry
>
> >
> > Regards,
> > Dominik
>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120426/22b24afe/attachment.htm>


More information about the petsc-users mailing list