diff --git a/src/amdis/CreatorMap.hpp b/src/amdis/CreatorMap.hpp index 4ec1eae1680e907dc23ca21e0569f50af748d3fe..46d779b6d978e9df3dfa3184e33d06582b979b40 100644 --- a/src/amdis/CreatorMap.hpp +++ b/src/amdis/CreatorMap.hpp @@ -46,11 +46,13 @@ namespace AMDiS init(); auto it = creatorMap.find(key); - if (it == creatorMap.end()) + if (it == creatorMap.end()) { + warning("No creator for key `{}` defined (used in init-file parameter `{}`). Falling back to `default`.", key, initFileStr); key = "default"; + } auto creator = creatorMap[key]; - test_exit(creator, "No creator for key `{}` defined in init file for parameter `{}`", key, initFileStr); + test_exit(creator, "Undefined creator for `{}` (used in init-file parameter `{}`)", key, initFileStr); return creator; } diff --git a/src/amdis/linearalgebra/istl/ISTL_Preconditioner.hpp b/src/amdis/linearalgebra/istl/ISTL_Preconditioner.hpp index ca8c16e42731ec3d7aec42a2555044f98f8f10e1..833dbb7f6252ad94841200fc1db37cf684ab8baf 100644 --- a/src/amdis/linearalgebra/istl/ISTL_Preconditioner.hpp +++ b/src/amdis/linearalgebra/istl/ISTL_Preconditioner.hpp @@ -84,6 +84,7 @@ namespace AMDiS = typename ISTLPreconCreator<Precon, Mat>::Creator; using Map = CreatorMap<ISTLPreconCreatorInterface<Mat, Sol, Rhs>>; + using FTraits = Dune::FieldTraits<typename Mat::field_type>; public: static void init() @@ -102,23 +103,33 @@ namespace AMDiS auto ssor = new PreconCreator<Dune::SeqSSOR<Mat, Sol, Rhs>>; Map::addCreator("ssor", ssor); - init_ilu(std::is_arithmetic<typename Dune::FieldTraits<Mat>::field_type>{}); - init_amg(std::is_same<typename Dune::FieldTraits<Mat>::real_type, double>{}); + init_ilu(std::is_arithmetic<typename FTraits::field_type>{}); + init_amg(std::is_same<typename FTraits::real_type, double>{}); auto richardson = new PreconCreator<Dune::Richardson<Sol, Rhs>>; Map::addCreator("richardson", richardson); Map::addCreator("default", richardson); } - static void init_ilu(std::false_type) {} + static void init_ilu(std::false_type) + { + warning("ILU preconditioners not created for the matrix with field_type = {}.", + Dune::className<typename FTraits::field_type>()); + } + static void init_ilu(std::true_type) { auto ilu = new PreconCreator<Dune::SeqILU<Mat, Sol, Rhs>>; - Map::addCreator("ilu", id(ilu)); - Map::addCreator("ilu0", id(ilu)); + Map::addCreator("ilu", ilu); + Map::addCreator("ilu0", ilu); + } + + static void init_amg(std::false_type) + { + warning("AMG preconditioners not created for the matrix with real_type = {}.", + Dune::className<typename FTraits::real_type>()); } - static void init_amg(std::false_type) {} static void init_amg(std::true_type) { auto amg = new AMGPreconCreator<Dune::Amg::AMG, Mat, Sol, Rhs>; diff --git a/src/amdis/linearalgebra/istl/ISTL_Solver.hpp b/src/amdis/linearalgebra/istl/ISTL_Solver.hpp index 700cb1fa31978230f069cbd37d1446d882c56e4a..826157848191d25401bb72d5ad402fb0f0e563d5 100644 --- a/src/amdis/linearalgebra/istl/ISTL_Solver.hpp +++ b/src/amdis/linearalgebra/istl/ISTL_Solver.hpp @@ -2,6 +2,7 @@ #include <memory> +#include <dune/common/classname.hh> #include <dune/istl/solvers.hh> #include <dune/istl/umfpack.hh> #include <dune/istl/superlu.hh> @@ -141,6 +142,7 @@ namespace AMDiS class DefaultCreators<LinearSolverInterface<Dune::BCRSMatrix<Block,Alloc>, VectorX, VectorB>> { using Matrix = Dune::BCRSMatrix<Block,Alloc>; + using FTraits = Dune::FieldTraits<typename Matrix::field_type>; using SolverBase = LinearSolverInterface<Matrix, VectorX, VectorB>; template <class Solver> @@ -178,10 +180,15 @@ namespace AMDiS // default iterative solver Map::addCreator("default", gmres); - init_direct(std::is_same<typename Dune::FieldTraits<Matrix>::real_type, double>{}); + init_direct(std::is_same<typename FTraits::real_type, double>{}); + } + + static void init_direct(std::false_type) + { + warning("Direct solvers not created for the matrix with real_type = {}.", + Dune::className<typename FTraits::real_type>()); } - static void init_direct(std::false_type) {} static void init_direct(std::true_type) { #if HAVE_SUITESPARSE_UMFPACK