From eb29abc86ecfc174b3a3fcca9dd016b49b65f393 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Mon, 12 Jul 2004 13:59:10 +0000 Subject: [PATCH] Make instantiation scheme a little simpler. git-svn-id: https://svn.dealii.org/trunk@9507 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/lac/source/filtered_matrix.cc | 126 ++++++++++++++++++++---- deal.II/lac/source/filtered_matrix.in.h | 117 ---------------------- 2 files changed, 107 insertions(+), 136 deletions(-) delete mode 100644 deal.II/lac/source/filtered_matrix.in.h diff --git a/deal.II/lac/source/filtered_matrix.cc b/deal.II/lac/source/filtered_matrix.cc index 82eeb008be..3bd0d036f6 100644 --- a/deal.II/lac/source/filtered_matrix.cc +++ b/deal.II/lac/source/filtered_matrix.cc @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 2001, 2002, 2003 by the deal.II authors +// Copyright (C) 2001, 2002, 2003, 2004 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -14,27 +14,115 @@ #include -//TODO: Maybe split in several files? -#define TYPEMAT double -#define TYPEVEC double -#include "filtered_matrix.in.h" +// Following, we define some partial specializations. since C++ does not allow +// this properly, we have to work around it using some macro ugliness -template class FilteredMatrix,Vector >; -template class FilteredMatrix,BlockVector >; +#define DEFINE_SPECIALIZATIONS(TYPE) \ +template <> \ +void \ +FilteredMatrix,Vector >:: \ +get_column_entries (const unsigned int index, \ + std::vector &column_entries, \ + const bool matrix_is_symmetric) const \ +{ \ + /* depending on whether the matrix */ \ + /* can be assumed symmetric or not,*/ \ + /* either use a fast or a slow */ \ + /* algorithm */ \ + if (matrix_is_symmetric == true) \ + /* ok, matrix is symmetric. we */ \ + /* may determine the matrix */ \ + /* entries in this column by */ \ + /* looking at the matrix entries */ \ + /* in this row which is */ \ + /* significantly faster since we */ \ + /* can traverse them linearly and */ \ + /* do not have to check each row */ \ + /* for the possible existence of */ \ + /* a matrix entry */ \ + { \ + const unsigned int * \ + col_nums = &(matrix->get_sparsity_pattern().get_column_numbers() \ + [matrix->get_sparsity_pattern().get_rowstart_indices()[index]]); \ + const unsigned int \ + row_length = matrix->get_sparsity_pattern().row_length(index); \ + \ + for (unsigned int i=0; iget_sparsity_pattern()(row,index); \ + if (global_index != SparsityPattern::invalid_entry) \ + column_entries.push_back (std::make_pair(row, \ + (*matrix)(row,index))); \ + }; \ + }; \ +} \ + \ + \ + \ +template <> \ +void \ +FilteredMatrix,BlockVector >:: \ +get_column_entries (const unsigned int /*index*/, \ + std::vector &/*column_entries*/, \ + const bool /*matrix_is_symmetric*/) const \ +{ \ + /* presently not implemented, but */ \ + /* should be fairly simple to do */ \ + Assert (false, ExcNotImplemented()); \ +} \ + \ + \ + \ + \ +template <> \ +void \ +FilteredMatrix,Vector >:: \ +allocate_tmp_vector () \ +{ \ + Threads::ThreadMutex::ScopedLock lock (tmp_mutex); \ + tmp_vector.reinit (matrix->n(), true); \ +} \ + \ + \ + \ +template <> \ +void \ +FilteredMatrix,BlockVector >:: \ +allocate_tmp_vector () \ +{ \ + std::vector block_sizes (matrix->n_block_rows()); \ + for (unsigned int i=0; iblock(i,i).n(); \ + \ + Threads::ThreadMutex::ScopedLock lock (tmp_mutex); \ + tmp_vector.reinit (block_sizes, true); \ +} -#undef TYPEVEC -#undef TYPEMAT +// now instantiate +DEFINE_SPECIALIZATIONS(double) +template class FilteredMatrix,Vector >; +template class FilteredMatrix,BlockVector >; - -#define TYPEMAT float -#define TYPEVEC float -#include "filtered_matrix.in.h" - -template class FilteredMatrix,Vector >; -template class FilteredMatrix,BlockVector >; - -#undef TYPEVEC -#undef TYPEMAT +DEFINE_SPECIALIZATIONS(float) +template class FilteredMatrix,Vector >; +template class FilteredMatrix,BlockVector >; diff --git a/deal.II/lac/source/filtered_matrix.in.h b/deal.II/lac/source/filtered_matrix.in.h deleted file mode 100644 index 70d10e2887..0000000000 --- a/deal.II/lac/source/filtered_matrix.in.h +++ /dev/null @@ -1,117 +0,0 @@ -//--------------------------------------------------------------------------- -// $Id$ -// Version: $Name$ -// -// Copyright (C) 2001, 2002, 2003 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. -// -//--------------------------------------------------------------------------- - - -// File included by driver file fitered_matrix.?.cc -// There, TYPEMAT and TYPEVEC must be set to the number types - - -//TODO: Check if this cannot be implemented with iterators -// and applied to SparseMatrixEZ - -template <> -void -FilteredMatrix,Vector >:: -get_column_entries (const unsigned int index, - std::vector &column_entries, - const bool matrix_is_symmetric) const -{ - // depending on whether the matrix - // can be assumed symmetric or not, - // either use a fast or a slow - // algorithm - if (matrix_is_symmetric == true) - // ok, matrix is symmetric. we - // may determine the matrix - // entries in this column by - // looking at the matrix entries - // in this row which is - // significantly faster since we - // can traverse them linearly and - // do not have to check each row - // for the possible existence of - // a matrix entry - { - const unsigned int * - col_nums = &(matrix->get_sparsity_pattern().get_column_numbers() - [matrix->get_sparsity_pattern().get_rowstart_indices()[index]]); - const unsigned int - row_length = matrix->get_sparsity_pattern().row_length(index); - - for (unsigned int i=0; iget_sparsity_pattern()(row,index); - if (global_index != SparsityPattern::invalid_entry) - column_entries.push_back (std::make_pair(row, - (*matrix)(row,index))); - }; - }; -} - - - -template <> -void -FilteredMatrix,BlockVector >:: -get_column_entries (const unsigned int /*index*/, - std::vector &/*column_entries*/, - const bool /*matrix_is_symmetric*/) const -{ - // presently not implemented, but - // should be fairly simple to do - Assert (false, ExcNotImplemented()); -} - - - - -template <> -void -FilteredMatrix,Vector >:: -allocate_tmp_vector () -{ - Threads::ThreadMutex::ScopedLock lock (tmp_mutex); - tmp_vector.reinit (matrix->n(), true); -} - - - -template <> -void -FilteredMatrix,BlockVector >:: -allocate_tmp_vector () -{ - std::vector block_sizes (matrix->n_block_rows()); - for (unsigned int i=0; iblock(i,i).n(); - - Threads::ThreadMutex::ScopedLock lock (tmp_mutex); - tmp_vector.reinit (block_sizes, true); -} -- 2.39.5