From: frohne Date: Mon, 2 Apr 2012 12:35:26 +0000 (+0000) Subject: Add ability to call ConstraintMatrix::set_zero for parallel vectors. X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f426d814a686006f0b1171b052babc602f85a417;p=dealii-svn.git Add ability to call ConstraintMatrix::set_zero for parallel vectors. git-svn-id: https://svn.dealii.org/trunk@25355 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/include/deal.II/lac/constraint_matrix.templates.h b/deal.II/include/deal.II/lac/constraint_matrix.templates.h index a75c6e3cf1..cc03ac7f52 100644 --- a/deal.II/include/deal.II/lac/constraint_matrix.templates.h +++ b/deal.II/include/deal.II/lac/constraint_matrix.templates.h @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include @@ -698,19 +700,106 @@ ConstraintMatrix::condense (BlockSparseMatrix &uncondensed, +// number of functions to select the right implementation for set_zero(). +namespace internal +{ + namespace ConstraintMatrix + { + namespace + { + // TODO: in general we should iterate over the constraints and not over all DoFs + // for performance reasons + template + void set_zero_parallel(const dealii::ConstraintMatrix &cm, VEC &vec, unsigned int shift = 0) + { + Assert(!vec.has_ghost_elements(), ExcInternalError());//ExcGhostsPresent()); + + const unsigned int + start = vec.local_range().first, + end = vec.local_range().second; + for (unsigned int i=start; i + void set_zero_in_parallel(const dealii::ConstraintMatrix &cm, VEC &vec, internal::bool2type) + { + set_zero_parallel(cm, vec, 0); + } + + // in parallel for BlockVectors + template + void set_zero_in_parallel(const dealii::ConstraintMatrix &cm, VEC &vec, internal::bool2type) + { + unsigned int start_shift = 0; + for (unsigned int j=0; j + void set_zero_serial(const dealii::ConstraintMatrix &cm, VEC &vec) + { + // TODO would be faster: + /* std::vector::const_iterator constraint_line = cm.lines.begin(); + for (; constraint_line!=cm.lines.end(); ++constraint_line) + vec(constraint_line->line) = 0.;*/ + for (unsigned int i=0; i + void set_zero_all(const dealii::ConstraintMatrix &cm, VEC &vec) + { + set_zero_in_parallel(cm, vec, internal::bool2type::value>()); + } + + + template + void set_zero_all(const dealii::ConstraintMatrix &cm, dealii::Vector &vec) + { + set_zero_serial(cm, vec); + } + + template + void set_zero_all(const dealii::ConstraintMatrix &cm, dealii::BlockVector &vec) + { + set_zero_serial(cm, vec); + } + + + template + void set_zero_all(const dealii::ConstraintMatrix &cm, dealii::parallel::distributed::Vector &vec) + { + // should use the general template above, but requires that + // some member functions are added to parallel::distributed::Vector + Assert (false, ExcNotImplemented()); + } + + template + void set_zero_all(const dealii::ConstraintMatrix &cm, dealii::parallel::distributed::BlockVector &vec) + { + Assert (false, ExcNotImplemented()); + } + } + } +} + + template void ConstraintMatrix::set_zero (VectorType &vec) const { - Assert (sorted == true, ExcMatrixNotClosed()); - - std::vector::const_iterator constraint_line = lines.begin(); - for (; constraint_line!=lines.end(); ++constraint_line) - vec(constraint_line->line) = 0.; + internal::ConstraintMatrix::set_zero_all(*this, vec); } + template void ConstraintMatrix:: diff --git a/deal.II/source/lac/constraint_matrix.inst.pl b/deal.II/source/lac/constraint_matrix.inst.pl index 33b5701226..af0f37d0c0 100644 --- a/deal.II/source/lac/constraint_matrix.inst.pl +++ b/deal.II/source/lac/constraint_matrix.inst.pl @@ -2,7 +2,7 @@ # $Id$ ###################################################################### # -# Copyright (C) 2011 by the deal.II authors +# Copyright (C) 2011, 2012 by the deal.II authors # # This file is subject to QPL and may not be distributed # without copyright and license information. Please refer @@ -19,11 +19,17 @@ my $vector_functions = <<'EOT' template void ConstraintMatrix::condense(const V1 &, V1&) const; template void ConstraintMatrix::condense(V1 &vec) const; -template void ConstraintMatrix::set_zero(V1&) const; template void ConstraintMatrix::distribute_local_to_global ( const Vector&, const std::vector &, V1&, const FullMatrix&) const; template void ConstraintMatrix::distribute(const V1 &, V1&) const; template void ConstraintMatrix::distribute(V1 &) const; +EOT + ; + +my $vector_functions_also_parallel = <(V1&) const; + EOT ; @@ -50,5 +56,7 @@ EOT ###################################################################### multisubst($vector_functions, ['V1'], \@sequential_vectors); +multisubst($vector_functions_also_parallel, ['V1'], \@sequential_vectors); +multisubst($vector_functions_also_parallel, ['V1'], \@parallel_vectors); multisubst($scalar_functions, ['S1'], \@real_scalars); multisubst($scalar_scalar_functions, ['S1','S2'], \@real_scalars, \@real_scalars);