simplify and cleanup the SolverFactory
This MR simplifies the SolverFactory. This includes the following changes:
- Unification of the creator interface. All creators (solvers and preconditioners) now get the new type OperatorTraitsand ashared_ptr<LinearOperator<X,Y>>. This has the advantage, that all available information is passed to the creator and can be accessed easily via theOperatorTraits. In particular, it is also possible for an iterative solver creator to access the matrix. This was not possible before as the actual operator type was not passed to the creator.
- The OperatorTraitsreplace theTypeListthat was passed to the creators before. This makes the code far more readable as the type can be accessed by their names instead of a list index.
- Direct and iterative solvers are no longer kept in separate factories. The reason for keeping them separate was the need of the direct solver to access the matrix. This can now be achieved via the OperatorTraits.
Open questions regarding backward-compatibility:
- 
Do we need backward compatibility to the old creator interface? - For the direct and iterative solvers, we could add easily the old macros- DUNE_REGISTER_ITERARIVE_SOLVERand- DUNE_REGISTER_DIRECT_SOLVERthe wrap a provided old interface creator to the new interface.
- I'm not sure how to deal with- DUNE_REGISTER_PRECONDITIONER.
- I added the old macros again and make OperatorTraitscompatible toTypeList<matrix_tpye, domain_type, range_type>so that the old interface can be used. For theDUNE_REGISTER_ITERATIVE_SOLVERi added a wrapper that translates the creator to the new interface.
 
- 
The method getSolverFromFactoryhad a third parameter before to inject a precreated preconditioner. This is now a bit more difficult as the preconditioner is created the the creator of the iterative solvers.- Possible solution: Add a- setPrecondititionermethod to the- IterativeSolverclass, this could then be used to replace the preconditioner of the created iterative solver. With that we could implement a function with the same functionality as before.
- I solved that by defining the passed preconditioner in the ProconditionerRegistry with a dummy tag (__passed at runtime__)
 
Edited  by Nils-Arne Dreier