Dear all,
I have a question with regards to the behavior of the Conjugate Gradient method in serial and parallel. I am using version 8.5 of dealii and I have a parallel implementation based on Trilinos.
The system matrix is in a block format and sparse, with blocks A, B, B^T and 0. The right hand side has two blocks, f_0 and f_1 = 0. I am using a Schur complement similar to step 20 but in parallel to solve the system and I am facing an issue with the first step of the solve routine, where I use the conjugate gradient to solve for y_1. At this point I am not using any preconditioning.
I have exported and converted the matrices and vectors in appropriate format, so that I am able to work with them in Matlab too. When I compare the system matrix created serially and the one created in parallel (say mpirun -n2), their maximum difference in absolute value is of order 1e-11. The right hand sides created serially and in parallel are identical. However, the solution of the system with tolerance for CG 1e-8, has a maximum difference of order 1e-4. However, for this particular calculation the condition number of the Schur complement is of order 1e+5 (calculated in Matlab). Moreover, when I use Matlab to do the Schur solve with CG for those matrices and the same tolerance, the resulting solutions differ by an order of 1e-12.
The above discrepancy in the solution reduces by two orders if I make the tolerance for CG to be smaller, i.e. of order 1e-11, for both the serial and the parallel execution.
My question is why for this difference in the matrices and this condition number do I see such a difference in the solution? Could this be related to how CG is implemented in parallel and how the tolerance is guaranteed in parallel vs serially?
Thanks,
Dimitris