From 97cb1d6a193ac3ef2957794dc72b4e290e7a4bab Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Sun, 20 Jan 2019 07:39:36 +0100
Subject: [PATCH] Test SuperLU with BCRSMatrix<FieldMatrix<T,2,2> >

Previously, only BCRSMatrix<FieldMatrix<T,1,1> > was tested.
---
 dune/istl/test/superlutest.cc | 82 ++++++++++++++++++++++++++---------
 1 file changed, 62 insertions(+), 20 deletions(-)

diff --git a/dune/istl/test/superlutest.cc b/dune/istl/test/superlutest.cc
index 270c6fdd8..8f230a928 100644
--- a/dune/istl/test/superlutest.cc
+++ b/dune/istl/test/superlutest.cc
@@ -15,19 +15,12 @@
 #include "laplacian.hh"
 
 #if HAVE_SUPERLU
-template<typename FIELD_TYPE>
+template<typename Matrix, typename Vector>
 void runSuperLU(std::size_t N)
 {
-  const int BS=1;
+  using Operator = Dune::MatrixAdapter<Matrix,Vector,Vector>;
 
-
-  typedef Dune::FieldMatrix<FIELD_TYPE,BS,BS> MatrixBlock;
-  typedef Dune::BCRSMatrix<MatrixBlock> BCRSMat;
-  typedef Dune::FieldVector<FIELD_TYPE,BS> VectorBlock;
-  typedef Dune::BlockVector<VectorBlock> Vector;
-  typedef Dune::MatrixAdapter<BCRSMat,Vector,Vector> Operator;
-
-  BCRSMat mat;
+  Matrix mat;
   Operator fop(mat);
   Vector b(N*N), x(N*N), b1(N/2), x1(N/2);
 
@@ -41,11 +34,11 @@ void runSuperLU(std::size_t N)
 
   watch.reset();
 
-  Dune::SuperLU<BCRSMat> solver(mat, true);
+  Dune::SuperLU<Matrix> solver(mat, true);
 
   Dune::InverseOperatorResult res;
 
-  Dune::SuperLU<BCRSMat> solver1;
+  Dune::SuperLU<Matrix> solver1;
 
   solver.setVerbosity(true);
   solver.apply(x,b, res);
@@ -57,31 +50,80 @@ void runSuperLU(std::size_t N)
   solver1.setSubMatrix(mat,mrs);
 
   solver1.apply(x1,b1, res);
-  solver1.apply(reinterpret_cast<FIELD_TYPE*>(&x1[0]), reinterpret_cast<FIELD_TYPE*>(&b1[0]));
+  solver1.apply(reinterpret_cast<typename Matrix::field_type*>(&x1[0]),
+                reinterpret_cast<typename Matrix::field_type*>(&b1[0]));
 }
 #endif
 
 int main(int argc, char** argv)
 try
 {
-
+#if HAVE_SUPERLU
   std::size_t N=100;
 
   if(argc>1)
     N = atoi(argv[1]);
-  std::cout<<"testing for N="<<N<<" BS="<<1<<std::endl;
-#if HAVE_SUPERLU
+
+  // ------------------------------------------------------------------------------
+  std::cout<<"testing for N="<<N<<" BCRSMatrix<FieldMatrix<T,1,1> >"<<std::endl;
+#if HAVE_SLU_SDEFS_H
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<float,1,1> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<float,1> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
+#endif
+#if HAVE_SLU_DDEFS_H
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<double,1,1> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<double,1> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
+#endif
+#if HAVE_SLU_CDEFS_H
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<std::complex<float>,1,1> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<std::complex<float>,1> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
+#endif
+#if HAVE_SLU_ZDEFS_H
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<std::complex<double>,1,1> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<std::complex<double>,1> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
+#endif
+
+  // ------------------------------------------------------------------------------
+  std::cout<<"testing for N="<<N<<" BCRSMatrix<FieldMatrix<T,2,2> >"<<std::endl;
 #if HAVE_SLU_SDEFS_H
-  runSuperLU<float>(N);
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<float,2,2> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<float,2> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
 #endif
 #if HAVE_SLU_DDEFS_H
-  runSuperLU<double>(N);
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<double,2,2> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<double,2> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
 #endif
 #if HAVE_SLU_CDEFS_H
-  runSuperLU<std::complex<float> >(N);
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<std::complex<float>,2,2> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<std::complex<float>,2> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
 #endif
 #if HAVE_SLU_ZDEFS_H
-  runSuperLU<std::complex<double> >(N);
+  {
+    using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<std::complex<double>,2,2> >;
+    using Vector = Dune::BlockVector<Dune::FieldVector<std::complex<double>,2> >;
+    runSuperLU<Matrix,Vector>(N);
+  }
 #endif
 
   return 0;
-- 
GitLab