From 48a0487f9febffae28a6de990b3b732674db242f Mon Sep 17 00:00:00 2001
From: Markus Blatt <markus@dr-blatt.de>
Date: Wed, 28 Aug 2013 12:52:56 +0200
Subject: [PATCH] Added test for twolevelmethod with Schwarz smoother.

---
 dune/istl/paamg/test/CMakeLists.txt        |  6 +++++-
 dune/istl/paamg/test/Makefile.am           |  8 +++++++-
 dune/istl/paamg/test/twolevelmethodtest.cc | 21 ++++++++++++++++++---
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/dune/istl/paamg/test/CMakeLists.txt b/dune/istl/paamg/test/CMakeLists.txt
index e8e2d448b..ffda4e21e 100644
--- a/dune/istl/paamg/test/CMakeLists.txt
+++ b/dune/istl/paamg/test/CMakeLists.txt
@@ -14,7 +14,7 @@ endif(PARMETIS_FOUND)
 if(CMAKE_USE_PTHREADS_INIT)
   set(PTHREADTESTS pthreadamgtest pthreadfastamgtest)
 endif(CMAKE_USE_PTHREADS_INIT)
-set(NORMALTESTS amgtest fastamg graphtest kamgtest twolevelmethodtest ${PTHREADTESTS})
+set(NORMALTESTS amgtest fastamg graphtest kamgtest twolevelmethodschwarztest twolevelmethodtest ${PTHREADTESTS})
 set(ALLTESTS ${MPITESTS} ${PARMETISTESTS} ${NORMALTESTS} ${UMFPACKTESTS} ${SUPERLUTESTS})
 
 # We do not want want to build the tests during make all,
@@ -62,6 +62,10 @@ set_target_properties(pamg_comm_repart_test PROPERTIES COMPILE_FLAGS "-DAMG_REPA
 add_executable(pamgtest "parallelamgtest.cc")
 add_dune_superlu_flags(pamgtest)
 add_executable(transfertest "transfertest.cc")
+add_executable(twolevelmethodschwarztest "twolevelmethodtest.cc")
+add_dune_superlu_flags(twolevelmethodschwarztest)
+set_target_properties(twolevelmethodschwarztest PROPERTIES COMPILE_FLAGS "-DUSE_OVERLAPPINGSCHWARZ")
+add_executable(twolevelmethodtest "twolevelmethodtest.cc")
 
 foreach(_exe ${ALLTESTS})
   target_link_libraries(${_exe} "dunecommon")
diff --git a/dune/istl/paamg/test/Makefile.am b/dune/istl/paamg/test/Makefile.am
index 85e707e3e..24ea95419 100644
--- a/dune/istl/paamg/test/Makefile.am
+++ b/dune/istl/paamg/test/Makefile.am
@@ -5,7 +5,7 @@ if MPI
   TESTPROGS = galerkintest hierarchytest pamgtest transfertest pamg_comm_repart_test
 endif
 
-NORMALTESTS = amgtest fastamg graphtest kamgtest twolevelmethodtest $(MPITESTS)
+NORMALTESTS = amgtest fastamg graphtest kamgtest twolevelmethodschwarztest twolevelmethodtest $(MPITESTS)
 
 # which tests to run
 TESTS = $(NORMALTESTS) $(TESTPROGS)
@@ -94,6 +94,12 @@ pamg_comm_repart_test_LDADD =				\
 	$(DUNEMPILIBS)				\
 	$(LDADD)
 
+twolevelmethodschwarztest_SOURCES = twolevelmethodtest.cc
+twolevelmethodschwarztest_CPPFLAGS = $(AM_CPPFLAGS) $(SUPERLU_CPPFLAGS)
+twolevelmethodschwarztest_LDFLAGS = $(AM_LDFLAGS) $(SUPERLU_LDFLAGS)
+twolevelmethodschwarztest_LDADD =					\
+	$(SUPERLU_LIBS)				\
+	$(LDADD)
 
 twolevelmethodtest_SOURCES = twolevelmethodtest.cc
 twolevelmethodtest_CPPFLAGS = $(AM_CPPFLAGS) $(SUPERLU_CPPFLAGS)
diff --git a/dune/istl/paamg/test/twolevelmethodtest.cc b/dune/istl/paamg/test/twolevelmethodtest.cc
index a3dca622f..a8aa15c02 100644
--- a/dune/istl/paamg/test/twolevelmethodtest.cc
+++ b/dune/istl/paamg/test/twolevelmethodtest.cc
@@ -3,7 +3,8 @@
 #include <dune/common/timer.hh>
 #include <dune/common/parallel/indexset.hh>
 #include <dune/common/parallel/collectivecommunication.hh>
-#include<dune/istl/paamg/twolevelmethod.hh>
+#include <dune/istl/paamg/twolevelmethod.hh>
+#include <dune/istl/overlappingschwarz.hh>
 #include <dune/istl/paamg/pinfo.hh>
 #include <dune/istl/solvers.hh>
 
@@ -38,12 +39,26 @@ void testTwoLevelMethod()
     BCRSMat mat = setupAnisotropic2d<BS,double>(N, indices, c, &n, 1);
     Vector b(mat.N()), x(mat.M());
     randomize(mat, b);
+#ifndef USE_OVERLAPPINGSCHWARZ
     typedef Dune::SeqSSOR<BCRSMat,Vector,Vector> FSmoother;
-    typedef Dune::SeqSOR<BCRSMat,Vector,Vector> CSmoother;
+    FSmoother fineSmoother(mat,1,1.0);
+#else
+    typedef Dune::SeqOverlappingSchwarz<BCRSMat,Vector> FSmoother;
+    typedef FSmoother::subdomain_vector SubdomainVector;
+    SubdomainVector subdomains(N);
+
+    for(int i=0; i<N; ++i)
+        for(int j=0; j<N; ++j)
+        {
+            int index=i*N+j;
+            subdomains[j].insert(index);
+        }
+    FSmoother fineSmoother(mat,subdomains, 1.0, false);
+#endif
+    typedef Dune::SeqJac<BCRSMat,Vector,Vector> CSmoother;
     typedef Dune::Amg::CoarsenCriterion<
         Dune::Amg::UnSymmetricCriterion<BCRSMat,Dune::Amg::FirstDiagonal> >
         Criterion;
-    FSmoother fineSmoother(mat,1,1.0);
     typedef Dune::Amg::AggregationLevelTransferPolicy<Operator,Criterion>
         TransferPolicy;
     typedef Dune::Amg::OneStepAMGCoarseSolverPolicy<Operator,CSmoother, Criterion>
-- 
GitLab