From 8568c5a0dbb7300a9e2a38adb226983400e7f1f8 Mon Sep 17 00:00:00 2001 From: Peter Bastian <peter@dune-project.org> Date: Tue, 5 Oct 2004 11:40:35 +0000 Subject: [PATCH] testing of generic solver [[Imported from SVN: r33]] --- istl/tutorial/example.cc | 94 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 5 deletions(-) diff --git a/istl/tutorial/example.cc b/istl/tutorial/example.cc index 59efab25f..60fdeb47d 100644 --- a/istl/tutorial/example.cc +++ b/istl/tutorial/example.cc @@ -17,6 +17,7 @@ #include "fmatrix.hh" #include "bcrsmatrix.hh" #include "io.hh" +#include "gsetc.hh" // a simple stop watch class Timer @@ -40,6 +41,12 @@ public: cend = times(&buf); return ((double)(cend-cstart))/100.0; } + + double gettime () + { + return ((double)(cend-cstart))/100.0; + } + private: clock_t cstart,cend; }; @@ -214,11 +221,11 @@ void test_FieldMatrix () A /= 3.14; A.umv(z,b); - A.umvt(b,z); - A.umvh(b,z); + A.umtv(b,z); + A.umhv(b,z); A.usmv(-1.0,z,b); - A.usmvt(-1.0,b,z); - A.usmvh(-1.0,b,z); + A.usmtv(-1.0,b,z); + A.usmhv(-1.0,b,z); std::cout << A.frobenius_norm() << " " << A.frobenius_norm2() << std::endl; std::cout << A.infinity_norm() << " " << A.infinity_norm_real() << std::endl; @@ -312,6 +319,78 @@ void test_IO () printmatrix(std::cout,B,"a block compressed sparse matrix","row",9,1); } +void test_Iter () +{ + // block types + Timer t; + const int BlockSize=1; + typedef Dune::FieldVector<double,BlockSize> VB; + typedef Dune::FieldMatrix<double,BlockSize,BlockSize> MB; + + // a fake discretization + t.start(); + const int N=1000000, K1=1, K2=1000; + Dune::BCRSMatrix<MB> A(N,N,5*N,Dune::BCRSMatrix<MB>::row_wise); + for (Dune::BCRSMatrix<MB>::CreateIterator i=A.createbegin(); i!=A.createend(); ++i) + { + i.insert(i.index()); + if (i.index()-K1>=0) i.insert(i.index()-K1); + if (i.index()-K2>=0) i.insert(i.index()-K2); + if (i.index()+K2< N) i.insert(i.index()+K2); + if (i.index()+K1< N) i.insert(i.index()+K1); + } + for (Dune::BCRSMatrix<MB>::RowIterator i=A.begin(); i!=A.end(); ++i) + for (Dune::BCRSMatrix<MB>::ColIterator j=(*i).begin(); j!=(*i).end(); ++j) + if (i.index()==j.index()) + (*j) = 4; + else + (*j) = -1; + t.stop(); + std::cout << "time for build=" << t.gettime() << " seconds." << std::endl; + // printmatrix(std::cout,A,"system matrix","row",10,2); + + // set up system + Dune::BlockVector<VB> x(N),b(N),d(N); + b=0; b[0] = 1; b[N-1] = 1; + // printvector(std::cout,b,"rhs","entry",1,10,2); + + // same in defect formulation + x = 0; // initial guess + std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); + std::cout.precision(8); + t.start(); + d=b; A.mmv(x,d); // compute defect + std::cout << 0 << " " << d.two_norm() << std::endl; + Dune::BlockVector<VB> v(x); // memory for update + v = 1.23E-4; + double w=1.0; // damping factor + for (int k=1; k<=50; k++) + { + bgs_update(A,v,d); // compute update + x.axpy(w,v); // update solution + A.usmv(-w,v,d); // update defect + std::cout << k << " " << d.two_norm() << std::endl; + } + t.stop(); + std::cout << "time for solve=" << t.gettime() << " seconds." << std::endl; + return; + + // printvector(std::cout,x,"solution","entry",1,10,2); + + // a simple iteration + x = 0; // initial guess + d=b; A.mmv(x,d); + std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); + std::cout.precision(8); + std::cout << 0 << " " << d.two_norm() << std::endl; + for (int k=1; k<=50; k++) + { + bsor(A,x,b,1.0); + d=b; A.mmv(x,d); + std::cout << k << " " << d.two_norm() << std::endl; + } + // printvector(std::cout,x,"solution","entry",1,10,2); +} int main (int argc , char ** argv) { @@ -321,7 +400,12 @@ int main (int argc , char ** argv) // test_VariableBlockVector(); // test_FieldMatrix(); // test_BCRSMatrix(); - test_IO(); + // test_IO(); + test_Iter(); + } + catch (Dune::ISTLError& error) + { + std::cout << error << std::endl; } catch (Dune::Exception& error) { -- GitLab