From 72f16adce25d95006d847943cfe658bb6c38ddad Mon Sep 17 00:00:00 2001 From: Oliver Sander <oliver.sander@tu-dresden.de> Date: Tue, 22 Jan 2019 21:44:48 +0100 Subject: [PATCH] Refactor UMFPack test To prepare for testing with more matrix types. --- dune/istl/test/umfpacktest.cc | 101 ++++++++++++++++------------------ 1 file changed, 47 insertions(+), 54 deletions(-) diff --git a/dune/istl/test/umfpacktest.cc b/dune/istl/test/umfpacktest.cc index 158dc4d05..60e824bc1 100644 --- a/dune/istl/test/umfpacktest.cc +++ b/dune/istl/test/umfpacktest.cc @@ -2,91 +2,84 @@ // vi: set et ts=4 sw=2 sts=2: #include <config.h> -#include <complex> #include <iostream> #include <dune/common/fmatrix.hh> #include <dune/common/fvector.hh> #include <dune/common/timer.hh> #include <dune/istl/bvector.hh> -#include <dune/istl/colcompmatrix.hh> -#include <dune/istl/io.hh> -#include <dune/istl/operators.hh> #include <dune/istl/umfpack.hh> #include "laplacian.hh" -int main(int argc, char** argv) +template<typename Matrix, typename Vector> +void runUMFPack(std::size_t N) { -#if HAVE_SUITESPARSE_UMFPACK - try - { - typedef double FIELD_TYPE; - //typedef std::complex<double> FIELD_TYPE; + typedef Dune::MatrixAdapter<Matrix,Vector,Vector> Operator; - const int BS=1; - std::size_t N=100; + Matrix mat; + Operator fop(mat); + Vector b(N*N), x(N*N), b1(N/2), x1(N/2); - if(argc>1) - N = atoi(argv[1]); - std::cout<<"testing for N="<<N<<" BS="<<1<<std::endl; + setupLaplacian(mat,N); + b=1; + b1=1; + x=0; + x1=0; - 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; + Dune::Timer watch; - BCRSMat mat; - Operator fop(mat); - Vector b(N*N), x(N*N), b1(N/2), x1(N/2); + watch.reset(); - setupLaplacian(mat,N); - b=1; - b1=1; - x=0; - x1=0; + Dune::UMFPack<Matrix> solver(mat,1); - Dune::Timer watch; + Dune::InverseOperatorResult res; - watch.reset(); + solver.apply(x, b, res); + solver.free(); - Dune::UMFPack<BCRSMat> solver(mat,1); + Dune::UMFPack<Matrix> solver1; - Dune::InverseOperatorResult res; + std::set<std::size_t> mrs; + for(std::size_t s=0; s < N/2; ++s) + mrs.insert(s); - solver.apply(x, b, res); - solver.free(); + solver1.setSubMatrix(mat,mrs); + solver1.setVerbosity(true); - Dune::UMFPack<BCRSMat> solver1; + solver1.apply(x1,b1, res); + solver1.apply(reinterpret_cast<typename Matrix::field_type*>(&x1[0]), + reinterpret_cast<typename Matrix::field_type*>(&b1[0])); - std::set<std::size_t> mrs; - for(std::size_t s=0; s < N/2; ++s) - mrs.insert(s); + Dune::UMFPack<Matrix> save_solver(mat,"umfpack_decomp",0); + Dune::UMFPack<Matrix> load_solver(mat,"umfpack_decomp",0); +} - solver1.setSubMatrix(mat,mrs); - solver1.setVerbosity(true); +int main(int argc, char** argv) try +{ +#if HAVE_SUITESPARSE_UMFPACK + std::size_t N=100; - solver1.apply(x1,b1, res); - solver1.apply(reinterpret_cast<FIELD_TYPE*>(&x1[0]), reinterpret_cast<FIELD_TYPE*>(&b1[0])); + if(argc>1) + N = atoi(argv[1]); - Dune::UMFPack<BCRSMat> save_solver(mat,"umfpack_decomp",0); - Dune::UMFPack<BCRSMat> load_solver(mat,"umfpack_decomp",0); - return 0; - } - catch (std::exception &e) + // ------------------------------------------------------------------------------ + std::cout<<"testing for N="<<N<<" BCRSMatrix<FieldMatrix<double,1,1> >"<<std::endl; { - std::cout << "ERROR: " << e.what() << std::endl; - return 1; - } - catch (...) - { - std::cerr << "Dune reported an unknown error." << std::endl; - exit(1); + using Matrix = Dune::BCRSMatrix<Dune::FieldMatrix<double,1,1> >; + using Vector = Dune::BlockVector<Dune::FieldVector<double,1> >; + runUMFPack<Matrix,Vector>(N); } + + return 0; #else // HAVE_SUITESPARSE_UMFPACK std::cerr << "You need SuiteSparse's UMFPack to run this test." << std::endl; return 77; #endif // HAVE_SUITESPARSE_UMFPACK } +catch (std::exception &e) +{ + std::cout << "ERROR: " << e.what() << std::endl; + return 1; +} -- GitLab