Belos/Tpetra: Add Pipelined CG
Created by: mhoemmen
Add a Pipelined CG implementation (see e.g., work by Pieter Ghysels and Paul Eller). I'm calling this a "story" because it has a few steps:
- #752 (closed): Implement a generic interface to MPI_Iallreduce
- #753 (closed), #1013 (closed): Implement Tpetra functions for nonblocking dot products
- Implement a "native" Tpetra implementation of Pipelined CG (see #734 (closed) for a standard CG example)
- #754 (closed), #953: Make it possible to extend Belos::SolverFactory with custom Tpetra solvers
- Wrap the native solver in a Belos::SolverManager subclass (extending #734 (closed); include stubs for making the subclass throw if given a non-Tpetra linear algebra implementation)
- Actually make Pipelined CG available, using the previous steps.
Step 5 (wrapping the native Tpetra-based solver) requires a partial specialization of Belos::SolverFactory for Tpetra objects, since BelosTpetra lives downstream of Belos proper. To avoid redundant code, it would be nicer to add a internal factory for Belos' generic implementations, and then have a hook for adding a factory of implementations native to the linear algebra.