From 95271375c9604c7fbd512087dad95c9c082d0bcf Mon Sep 17 00:00:00 2001 From: bangerth Date: Wed, 30 Jul 2008 20:43:10 +0000 Subject: [PATCH] Start a set of tests that check individual functions of the SparsityPattern class and friends. git-svn-id: https://svn.dealii.org/trunk@16452 0785d39b-7218-0410-832d-ea1e28bc413d --- tests/lac/Makefile | 1 + tests/lac/sparsity_pattern_01.cc | 32 ++ tests/lac/sparsity_pattern_01/cmp/generic | 198 ++++++++++++ tests/lac/sparsity_pattern_common.h | 363 ++++++++++++++++++++++ tests/lac/testmatrix.h | 12 +- 5 files changed, 602 insertions(+), 4 deletions(-) create mode 100644 tests/lac/sparsity_pattern_01.cc create mode 100644 tests/lac/sparsity_pattern_01/cmp/generic create mode 100644 tests/lac/sparsity_pattern_common.h diff --git a/tests/lac/Makefile b/tests/lac/Makefile index b30389e76f..59f53b5bc5 100644 --- a/tests/lac/Makefile +++ b/tests/lac/Makefile @@ -26,6 +26,7 @@ tests_x = vector-vector vector_memory \ tridiagonal_matrix \ tridiagonal_matrix_sym \ sparsity_pattern \ + sparsity_pattern_* \ sparse_matrices matrices \ block_sparsity_pattern_01 \ block_indices \ diff --git a/tests/lac/sparsity_pattern_01.cc b/tests/lac/sparsity_pattern_01.cc new file mode 100644 index 0000000000..2a2c5eb05b --- /dev/null +++ b/tests/lac/sparsity_pattern_01.cc @@ -0,0 +1,32 @@ +//---------------------------- sparsity_pattern_01.cc --------------------------- +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2008 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------------- sparsity_pattern_01.cc --------------------------- + + +// check SparsityPattern::row_length + +#include "sparsity_pattern_common.h" + +int main () +{ + std::ofstream logfile("sparsity_pattern_01/output"); + logfile.setf(std::ios::fixed); + deallog << std::setprecision(3); + deallog.attach(logfile); + deallog.depth_console(0); + deallog.threshold_double(1.e-10); + + row_length (); +} + + + diff --git a/tests/lac/sparsity_pattern_01/cmp/generic b/tests/lac/sparsity_pattern_01/cmp/generic new file mode 100644 index 0000000000..b77e22b182 --- /dev/null +++ b/tests/lac/sparsity_pattern_01/cmp/generic @@ -0,0 +1,198 @@ + +DEAL::196 196 14 924 +DEAL::3 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::3 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::4 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::5 +DEAL::4 +DEAL::3 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::4 +DEAL::3 diff --git a/tests/lac/sparsity_pattern_common.h b/tests/lac/sparsity_pattern_common.h new file mode 100644 index 0000000000..182fce4002 --- /dev/null +++ b/tests/lac/sparsity_pattern_common.h @@ -0,0 +1,363 @@ +//---------------------------- sparsity_pattern_01.cc --------------------------- +// $Id: sparsity_pattern_01.cc 15674 2008-01-24 17:40:56Z kanschat $ +// Version: $Name$ +// +// Copyright (C) 2008 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------------- sparsity_pattern_01.cc --------------------------- + + +// check + +#include "../tests.h" +#include +#include +#include +#include +#include +#include "testmatrix.h" +#include +#include +#include +#include +#include +#include + + +const unsigned int N = 15; + + +template +void build_sparsity (SP &sparsity_pattern) +{ + // generate usual 5-point sparsity pattern + sparsity_pattern.reinit((N-1)*(N-1), (N-1)*(N-1), 5); + FDMatrix(N,N).five_point_structure (sparsity_pattern); + sparsity_pattern.compress (); + + deallog << sparsity_pattern.n_rows() << " " + << sparsity_pattern.n_cols() << " " + << sparsity_pattern.bandwidth() << " " + << sparsity_pattern.n_nonzero_elements() + << std::endl; +} + + +template +void row_length () +{ + SP sparsity_pattern; + build_sparsity (sparsity_pattern); + + for (unsigned int i=0; i +void print_gnuplot () +{ + SP sparsity_pattern; + build_sparsity (sparsity_pattern); + + sparsity_pattern.print_gnuplot(deallog.get_file_stream()); +} + + + +template +void print () +{ + SP sparsity_pattern; + build_sparsity (sparsity_pattern); + + sparsity_pattern.print(deallog.get_file_stream()); +} + + + +template +void copy_with_offdiagonals_1 () +{ + SparsityPattern sparsity_pattern; + build_sparsity (sparsity_pattern); + + // generate copy of sp1 with extra + // off-diagonals + SP sp2(sparsity_pattern, 10, 2); + sp2.compress (); + deallog << sp2.n_rows() << " " << sp2.n_cols() << " " + << sp2.bandwidth() << " " << sp2.n_nonzero_elements() + << std::endl; + for (unsigned int i=0; i +void copy_with_offdiagonals_2 () +{ + SparsityPattern sparsity_pattern; + build_sparsity (sparsity_pattern); + + // generate copy of sp1 with + // extra off-diagonals, add some + // non-symmetric elements and symmetrize + // again + SP sp3(sparsity_pattern, (N-1)*(N-1), 2); + for (unsigned int i=0; i<(N-1)*(N-1); ++i) + sp3.add (0,i); + sp3.symmetrize (); + sp3.compress (); + deallog << sp3.n_rows() << " " << sp3.n_cols() << " " + << sp3.bandwidth() << " " << sp3.n_nonzero_elements() + << std::endl; + for (unsigned int i=0; i > > &sparsity, + SparsityPattern &sp4) +{ + sp4.copy_from ((N-1)*(N-1), (N-1)*(N-1), + sparsity.begin(), sparsity.end()); +} + + +template +void +do_copy_from (const CompressedSparsityPattern &sparsity, + SP &sp4) +{ + std::list > > sparsity_x; + for (unsigned int i=0; i >()); + + for (unsigned int j=0; j > > sparsity_x; + for (unsigned int i=0; i >()); + + for (unsigned int j=0; j &sparsity, + SparsityPattern &sp4) +{ + sp4.copy_from (sparsity); +} + + + +template +void copy_from_1 () +{ + SparsityPattern sparsity_pattern; + build_sparsity (sparsity_pattern); + + // now test the copy_from function. for + // this copy over the column indices, but + // in different order as the order should + // not matter to that function + std::list > > sparsity; + for (unsigned int row=0; row >()); + for (const unsigned int + *p=(sparsity_pattern.get_column_numbers() + +sparsity_pattern.get_rowstart_indices()[row]); + p != (sparsity_pattern.get_column_numbers() + +sparsity_pattern.get_rowstart_indices()[row+1]); + ++p) + sparsity.back().insert (*p); + } + SP sp4; + do_copy_from (sparsity, sp4); + + // now check for equivalence of original + // and copy + Assert (sparsity_pattern.n_nonzero_elements() == + sp4.n_nonzero_elements(), + ExcInternalError()); + for (unsigned int i=0; i +void copy_from_2 () +{ + CompressedSparsityPattern sparsity_pattern; + build_sparsity (sparsity_pattern); + + SP sp4; + do_copy_from (sparsity_pattern, sp4); + + // now check for equivalence of original + // and copy + Assert (sparsity_pattern.n_nonzero_elements() == + sp4.n_nonzero_elements(), + ExcInternalError()); + for (unsigned int i=0; i +void copy_from_3 () +{ + CompressedSetSparsityPattern sparsity_pattern; + build_sparsity (sparsity_pattern); + + SP sp4; + do_copy_from (sparsity_pattern, sp4); + + // now check for equivalence of original + // and copy + Assert (sparsity_pattern.n_nonzero_elements() == + sp4.n_nonzero_elements(), + ExcInternalError()); + for (unsigned int i=0; i +void copy_from_4 () +{ + const unsigned int M = 25; + FullMatrix sparsity_pattern(M,M); + for (unsigned int i=0; i(sparsity_pattern.frobenius_norm()), + ExcInternalError()); + + for (unsigned int i=0; i +void matrix_position () +{ + SP sparsity_pattern; + build_sparsity (sparsity_pattern); + + // check the matrix_position + // function. the checked + // function should be the inverse + // of operator() + for (unsigned int i=0; i +void block_read_write () +{ + SP sparsity_pattern; + build_sparsity (sparsity_pattern); + + // check block_write/block_read by + // dumping a sparsity pattern and + // checking whether the + // read-back-in pattern is the same + std::ostringstream tmp_write; + sparsity_pattern.block_write (tmp_write); + + SP sp5; + + std::istringstream tmp_read(tmp_write.str()); + sp5.block_read (tmp_read); + + // now check for equivalence of + // sparsity_pattern and sp5 + deallog << sparsity_pattern.n_rows() - sp5.n_rows() << ' ' + << sparsity_pattern.n_cols() - sp5.n_cols() << ' ' + << (sparsity_pattern.is_compressed() ^ sp5.is_compressed()) << ' ' + << (sparsity_pattern.is_compressed() ^ sp5.is_compressed()) << ' ' + << std::endl; + + for (unsigned int row=0; row + void five_point_structure(SP& structure) const; /** * Generate the matrix structure. */ - void nine_point_structure(SparsityPattern& structure) const; + template + void nine_point_structure(SP& structure) const; /** * Fill the matrix with values. @@ -76,9 +78,10 @@ FDMatrix::FDMatrix(unsigned int nx, unsigned int ny) +template inline void -FDMatrix::five_point_structure(SparsityPattern& structure) const +FDMatrix::five_point_structure(SP& structure) const { for(unsigned int i=0;i<=ny-2;i++) { @@ -113,9 +116,10 @@ FDMatrix::five_point_structure(SparsityPattern& structure) const +template inline void -FDMatrix::nine_point_structure(SparsityPattern& structure) const +FDMatrix::nine_point_structure(SP& structure) const { for(unsigned int i=0;i<=ny-2;i++) { -- 2.39.5