Hi everyone,
For the mixed formulation to solve the Poisson problem in 2D, I'm
using Tutorial 20. For the Schur complement system solver I'm using
both the approaches as suggested in the tutorial, i.e., with Identity
preconditioner and the approximate Schur complement (by diagonal
scaling) preconditioner. I fixed the accuracy for the relative
residual of the Schur complement solution to 10e-08. For the relative
residual of the Inv(M) I chose two values as 10e-08 and 10e-10. The
timings and Schur complement iterations (denoted by Iter) presented
below are for optimized compilation on a 4 dual core, Intel Xeon
processor, 64 GB RAM machine with exclusive use (no other user). The
problem size is from 5th refinement level (32) to 11th refinement
levels (2048). To note the timings I used the Timer class. To be more
specific, I started the timings just before the cg.solve call for
Schur complement.
...
Timer timer_sol_schur;
cg.solve (schur_complement, solution.block(1), schur_rhs,
PreconditionIdentity()); //PreconditionIdentity()|preconditioner
...
For the whole system, I started the timings in the very beginning of the call.
void MixedLaplaceProblem<dim>::solve ()
{
Timer timer_sol_whole;
...
I've two observations from these results. Firstly, for the large
problem size, it doesn't seem to agree with the conclusion in the
tutorial that approximate Schur complement preconditioner will be
faster. Secondly, the results seem to be quite dependent on the
accuracy for the Inv(M). For the choice of 10e-08, we see a jump in
timings (and iterations for Identity preconditioner) from the size 128
to 256. For 10e-10, this jump occurs from the size 512 to 1024. In
fact, for the approximate Schur complement preconditioner, this jump
is rather too severe. To investigate further, for the largest problem
size I additionally took the relative residual for the Inv(M) as
10e-12 when solving with approximate Schur complement preconditioner,
and the largest problem could be solved even cheaply than 1024 size
with 10e-10 accuracy for Inv(M).
Now I'm curious whether these are expected results. If so, then where
should one stop the accuracy for Inv(M) (seems smaller the better). Or
my choice of tolerance(s) is improper?
Bests,
Satyendra
==============================================
(1) Accuracy: M_Inverse 10e-08, SchurSolve 10e-08
(A) Identity Preconditioner
Size Iter T_Schur T_Whole
0032 5 0.004 0.008
0064 7 0.032 0.048
0128 9 0.156 0.232
0256 69 6.884 7.228
0512 89 54.103 55.843
1024 151 434.07 441.38
2048 266 3041.62 3070.95
(B) Approximate Schur Preconditioner
Size Iter T_Schur T_Whole
0032 3 0.004 0.008
0064 3 0.040 0.060
0128 4 0.408 0.480
0256 5 5.452 5.772
0512 5 57.940 59.592
1024 6 618.631 625.915
2048 6 6159.05 6188.31
(2) Accuracy: M_Inverse 10e-10, SchurSolve 10e-08
(A) Identity Preconditioner
Size Iter T_Schur T_Whole
0032 1 0.004 0.004
0064 1 0.004 0.016
0128 1 0.020 0.064
0256 1 0.108 0.332
0512 1 0.672 2.020
1024 3 9.537 15.697
2048 6 78.261 102.666
(B) Approximate Schur Preconditioner
Size Iter T_Schur T_Whole
0032 1 0.000 0.004
0064 1 0.008 0.016
0128 1 0.020 0.064
0256 1 0.124 0.348
0512 1 0.772 2.128
1024 2 293.522 299.707
2048 3 5278.02 5302.53
(3) Accuracy: M_Inverse 10e-12, SchurSolve 10e-08
Approximate Schur Preconditioner
2048 1 83.521 112.655
_______________________________________________
dealii mailing list http://poisson.dealii.org/mailman/listinfo/dealii