From 0e91f0c9f7abf0560ee849ab80fd636bcef0eb38 Mon Sep 17 00:00:00 2001
From: bangerth
Date: Mon, 6 Aug 2012 09:47:20 +0000
Subject: [PATCH] Disallow modifying operations on vectors with ghost elements.
git-svn-id: https://svn.dealii.org/trunk@25751 0785d39b-7218-0410-832d-ea1e28bc413d
---
deal.II/doc/news/changes.h | 12 ++++++
.../deal.II/lac/trilinos_vector_base.h | 41 +++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h
index 0cbea7afb4..36057055e3 100644
--- a/deal.II/doc/news/changes.h
+++ b/deal.II/doc/news/changes.h
@@ -24,6 +24,18 @@ inconvenience this causes.
+- Changed/fixed: Several operations on Trilinos vectors that change the
+elements of these vectors were allowed accidentally for vectors that have
+ghost elements. This is a source of errors because a change on one
+MPI process will not show up on a different processor. Consequently, we
+intended to disallow all functions that modify vectors with ghost elements
+but this was not enforced for all of these functions. This is now fixed
+but it may lead to errors if your code relied on the existing behavior. The
+way to work around this is to only ever modify fully distributed vectors,
+and then copy it into a vector with ghost elements.
+
+(Wolfgang Bangerth, 2012/08/06)
+
- Changed: The argument material_id of the estimate-functions of
the KellyErrorEstimator class is now of type types::material_id_type
with default value types::invalid_material_id, instead of type
diff --git a/deal.II/include/deal.II/lac/trilinos_vector_base.h b/deal.II/include/deal.II/lac/trilinos_vector_base.h
index c3d422bcfc..549bc76afb 100644
--- a/deal.II/include/deal.II/lac/trilinos_vector_base.h
+++ b/deal.II/include/deal.II/lac/trilinos_vector_base.h
@@ -1243,6 +1243,9 @@ namespace TrilinosWrappers
VectorBase &
VectorBase::operator = (const TrilinosScalar s)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (numbers::is_finite(s), ExcNumberNotFinite());
@@ -1260,6 +1263,10 @@ namespace TrilinosWrappers
VectorBase::set (const std::vector &indices,
const std::vector &values)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
+
Assert (indices.size() == values.size(),
ExcDimensionMismatch(indices.size(),values.size()));
@@ -1273,6 +1280,10 @@ namespace TrilinosWrappers
VectorBase::set (const std::vector &indices,
const ::dealii::Vector &values)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
+
Assert (indices.size() == values.size(),
ExcDimensionMismatch(indices.size(),values.size()));
@@ -1616,6 +1627,9 @@ namespace TrilinosWrappers
void
VectorBase::add (const TrilinosScalar s)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (numbers::is_finite(s), ExcNumberNotFinite());
unsigned int n_local = local_size();
@@ -1630,6 +1644,9 @@ namespace TrilinosWrappers
VectorBase::add (const TrilinosScalar a,
const VectorBase &v)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == v.local_size(),
ExcDimensionMismatch(local_size(), v.local_size()));
@@ -1648,6 +1665,9 @@ namespace TrilinosWrappers
const TrilinosScalar b,
const VectorBase &w)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == v.local_size(),
ExcDimensionMismatch(local_size(), v.local_size()));
Assert (local_size() == w.local_size(),
@@ -1668,6 +1688,9 @@ namespace TrilinosWrappers
VectorBase::sadd (const TrilinosScalar s,
const VectorBase &v)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == v.local_size(),
ExcDimensionMismatch(local_size(), v.local_size()));
@@ -1686,6 +1709,9 @@ namespace TrilinosWrappers
const TrilinosScalar a,
const VectorBase &v)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == v.local_size(),
ExcDimensionMismatch(local_size(), v.local_size()));
@@ -1707,6 +1733,9 @@ namespace TrilinosWrappers
const TrilinosScalar b,
const VectorBase &w)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == v.local_size(),
ExcDimensionMismatch(local_size(), v.local_size()));
Assert (local_size() == w.local_size(),
@@ -1733,6 +1762,9 @@ namespace TrilinosWrappers
const TrilinosScalar c,
const VectorBase &x)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == v.local_size(),
ExcDimensionMismatch(local_size(), v.local_size()));
Assert (local_size() == w.local_size(),
@@ -1762,6 +1794,9 @@ namespace TrilinosWrappers
void
VectorBase::scale (const VectorBase &factors)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (local_size() == factors.local_size(),
ExcDimensionMismatch(local_size(), factors.local_size()));
@@ -1776,6 +1811,9 @@ namespace TrilinosWrappers
VectorBase::equ (const TrilinosScalar a,
const VectorBase &v)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (numbers::is_finite(a), ExcNumberNotFinite());
// If we don't have the same map, copy.
@@ -1804,6 +1842,9 @@ namespace TrilinosWrappers
const TrilinosScalar b,
const VectorBase &w)
{
+ // if we have ghost values, do not allow
+ // writing to this vector at all.
+ Assert (!has_ghost_elements(), ExcGhostsPresent());
Assert (v.local_size() == w.local_size(),
ExcDimensionMismatch (v.local_size(), w.local_size()));
--
2.39.5