I have a Poisson equation with wildly varying material parameters (1 .. 1000), wildly varying element sizes (5 nm .. 100 um) and some quite anisotropic (tetrahedral) elements (100 nm x 100 um). I use (a C++ port of) Dan Spielman's approxChol as a preconditioner for a preconditioned CG method. It converges pretty fast (around 20 iterations), but the convergence test of the preconditioned CG method sometimes stops the iteration much too early, especially if I start the iteration with a "good" initial guess of the solution. The termination criterion is that the L2 norm of the residual is smaller than 1e-6 times the L2 norm of the right hand side. I looked around at some implementations of CG and some documents describing CG, and they all seem to use this as a termination criterion.
I wonder whether my trouble with the convergence test is caused by the bad condition of my matrix, and whether it would be a good idea to use the preconditioned residual instead as termination criterion. But why does nobody else does this? Perhaps because one would have to additionally compute $M^{-1}b$ in order to evaluate $b^TM^{-1}b$? Could one use $x_0^Tx_0 + r_0^TM^{-1}r_0$ instead ($r_0^TM^{-1}r_0$ gets computed anyway) to avoid that additional cost? (But the additional cost seems small anyway, so ...)