From 063194fa4b94869e190ef72fe5a91afc21d5a7d6 Mon Sep 17 00:00:00 2001 From: Markus Blatt <mblatt@dune-project.org> Date: Tue, 15 Nov 2005 10:40:49 +0000 Subject: [PATCH] Laplacian finite difference 5 point stencil. [[Imported from SVN: r402]] --- istl/test/laplacian.hh | 65 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 istl/test/laplacian.hh diff --git a/istl/test/laplacian.hh b/istl/test/laplacian.hh new file mode 100644 index 000000000..6e3020f57 --- /dev/null +++ b/istl/test/laplacian.hh @@ -0,0 +1,65 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#ifndef LAPLACIAN_HH +#define LAPLACIAN_HH + +template<int N, class B> +void setupSparsityPattern(Dune::BCRSMatrix<B>& A) +{ + for (typename Dune::BCRSMatrix<B>::CreateIterator i = A.createbegin(); i != A.createend(); ++i) { + int x = i.index()%N; // x coordinate in the 2d field + int y = i.index()/N; // y coordinate in the 2d field + + if(y>0) + // insert lower neighbour + i.insert(i.index()-N); + if(x>0) + // insert left neighbour + i.insert(i.index()-1); + + // insert diagonal value + i.insert(i.index()); + + if(x<N-1) + //insert right neighbour + i.insert(i.index()+1); + if(y<N-1) + // insert upper neighbour + i.insert(i.index()+N); + } +} + +template<int N, class B> +void setupLaplacian(Dune::BCRSMatrix<B>& A) +{ + setupSparsityPattern<N>(A); + + B diagonal = 0, bone=0, beps=0; + for(typename B::RowIterator b = diagonal.begin(); b != diagonal.end(); ++b) + b->operator[](b.index())=4; + + + for(typename B::RowIterator b=bone.begin(); b != bone.end(); ++b) + b->operator[](b.index())=-1.0; + + + for (typename Dune::BCRSMatrix<B>::RowIterator i = A.begin(); i != A.end(); ++i) { + int x = i.index()%N; // x coordinate in the 2d field + int y = i.index()/N; // y coordinate in the 2d field + + i->operator[](i.index())=diagonal; + + if(y>0) + i->operator[](i.index()-N)=bone; + + if(y<N-1) + i->operator[](i.index()+N)=bone; + + if(x>0) + i->operator[](i.index()-1)=bone; + + if(x < N-1) + i->operator[](i.index()+1)=bone; + } +} +#endif -- GitLab