[petsc-users] help needed for -snes_mf_operator
Dominik Szczerba
dominik at itis.ethz.ch
Thu Apr 26 06:28:10 CDT 2012
Jed, Barry, Matt:
Below a collection of all pending answers in one mail.
> 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.
Regards,
Dominik
More information about the petsc-users
mailing list