From: kayser-herold Date: Wed, 6 Jun 2007 15:25:03 +0000 (+0000) Subject: Added a few new "make_sparsity_pattern" methods which use the X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=519418b6c08366843e65b15a87b64136d2915004;p=dealii-svn.git Added a few new "make_sparsity_pattern" methods which use the CompressedSetSparsityPattern instead of the usual CompressedSparsityPattern. git-svn-id: https://svn.dealii.org/trunk@14759 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/dofs/dof_constraints.h b/deal.II/deal.II/include/dofs/dof_constraints.h index d06da26fc4..3b1cfb8d8f 100644 --- a/deal.II/deal.II/include/dofs/dof_constraints.h +++ b/deal.II/deal.II/include/dofs/dof_constraints.h @@ -28,6 +28,7 @@ template class Vector; template class FullMatrix; class SparsityPattern; class CompressedSparsityPattern; +class CompressedSetSparsityPattern; class BlockSparsityPattern; class CompressedBlockSparsityPattern; template class SparseMatrix; @@ -680,12 +681,23 @@ class ConstraintMatrix : public Subscriptor */ void condense (CompressedSparsityPattern &sparsity) const; + /** + * Same function as above, but + * condenses compressed + * sparsity patterns, which are + * based on the std::set container. + */ + void condense (CompressedSetSparsityPattern &sparsity) const; + + void condense_fast (CompressedSparsityPattern &sparsity) const; + /** * Same function as above, but * condenses square compressed * sparsity patterns. */ void condense (CompressedBlockSparsityPattern &sparsity) const; + /** * Condense a given matrix. The associated diff --git a/deal.II/deal.II/source/dofs/dof_constraints.cc b/deal.II/deal.II/source/dofs/dof_constraints.cc index 0ea47bc9a1..a895f2e7df 100644 --- a/deal.II/deal.II/source/dofs/dof_constraints.cc +++ b/deal.II/deal.II/source/dofs/dof_constraints.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -1044,6 +1045,194 @@ void ConstraintMatrix::condense (CompressedSparsityPattern &sparsity) const +void ConstraintMatrix::condense_fast (CompressedSparsityPattern &sparsity) const +{ + /* + Assert (sorted == true, ExcMatrixNotClosed()); + Assert (sparsity.n_rows() == sparsity.n_cols(), + ExcNotQuadratic()); + + // store for each index whether it must be + // distributed or not. If entry is + // deal_II_numbers::invalid_unsigned_int, + // no distribution is necessary. + // otherwise, the number states which line + // in the constraint matrix handles this + // index + std::vector distribute(sparsity.n_rows(), + deal_II_numbers::invalid_unsigned_int); + + for (unsigned int c=0; c row_cache; + for (unsigned int j=0; j::iterator col_num = row_cache.begin (); + + for (; col_num != row_cache.end (); ++col_num) + { + const unsigned int column = *col_num; + + if (distribute[column] != deal_II_numbers::invalid_unsigned_int) + { + // row + for (unsigned int q=0; + q!=lines[distribute[column]].entries.size(); + ++q) + { + const unsigned int + new_col = lines[distribute[column]].entries[q].first; + + sparsity.add (row, new_col); + }; + }; + } + } + else + // row must be distributed + { + std::set::iterator col_num = row_cache.begin (); + + for (; col_num != row_cache.end (); ++col_num) + { + const unsigned int column = *col_num; + + if (distribute[column] == deal_II_numbers::invalid_unsigned_int) + // distribute entry at irregular + // row @p{row} and regular column + // sparsity.colnums[j] + for (unsigned int q=0; + q!=lines[distribute[row]].entries.size(); ++q) + sparsity.add (lines[distribute[row]].entries[q].first, + column); + else + // distribute entry at irregular + // row @p{row} and irregular column + // sparsity.get_column_numbers()[j] + for (unsigned int p=0; p!=lines[distribute[row]].entries.size(); ++p) + for (unsigned int q=0; + q!=lines[distribute[column]] + .entries.size(); ++q) + sparsity.add (lines[distribute[row]].entries[p].first, + lines[distribute[column]] + .entries[q].first); + }; + } + + // Now copy stuff back to sparsity pattern + std::set::iterator col_num = row_cache.begin (); + for (; col_num != row_cache.end (); ++col_num) + { + } + }; + */ +} + + +void ConstraintMatrix::condense (CompressedSetSparsityPattern &sparsity) const +{ + Assert (sorted == true, ExcMatrixNotClosed()); + Assert (sparsity.n_rows() == sparsity.n_cols(), + ExcNotQuadratic()); + + // store for each index whether it must be + // distributed or not. If entry is + // deal_II_numbers::invalid_unsigned_int, + // no distribution is necessary. + // otherwise, the number states which line + // in the constraint matrix handles this + // index + std::vector distribute(sparsity.n_rows(), + deal_II_numbers::invalid_unsigned_int); + + for (unsigned int c=0; c (const std::vector (const std::vector &, + CompressedSetSparsityPattern &, + const bool) const; + +template void ConstraintMatrix:: add_entries_local_to_global (const std::vector &, BlockSparsityPattern &, const bool) const; diff --git a/deal.II/deal.II/source/dofs/dof_tools.cc b/deal.II/deal.II/source/dofs/dof_tools.cc index c4ece0c0c3..43e42c20f8 100644 --- a/deal.II/deal.II/source/dofs/dof_tools.cc +++ b/deal.II/deal.II/source/dofs/dof_tools.cc @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -4957,6 +4958,7 @@ DoFTools::convert_couplings_to_blocks ( // explicit instantiations +// TODO: Add missing instantiations for CompressedSetSparsityPattern template void DoFTools::make_sparsity_pattern, SparsityPattern> @@ -4988,12 +4990,23 @@ DoFTools::make_sparsity_pattern, (const hp::DoFHandler &dof, SparsityPattern &sparsity, const ConstraintMatrix &); + + template void DoFTools::make_sparsity_pattern, CompressedSparsityPattern> (const hp::DoFHandler &dof, CompressedSparsityPattern &sparsity, const ConstraintMatrix &); + +template void +DoFTools::make_sparsity_pattern, + CompressedSetSparsityPattern> +(const hp::DoFHandler &dof, + CompressedSetSparsityPattern &sparsity, + const ConstraintMatrix &); + + template void DoFTools::make_sparsity_pattern, BlockSparsityPattern>