From e048bf2a91aadf4c8670893e181c7d53e1b87a5c Mon Sep 17 00:00:00 2001 From: Guido Kanschat Date: Tue, 8 Jul 2003 16:35:09 +0000 Subject: [PATCH] allow for zero dimensions in matrices and vectors git-svn-id: https://svn.dealii.org/trunk@7855 0785d39b-7218-0410-832d-ea1e28bc413d --- .../lac/include/lac/block_vector.templates.h | 1 + deal.II/lac/include/lac/solver.h | 7 ++- deal.II/lac/include/lac/sparsity_pattern.h | 9 ++++ deal.II/lac/include/lac/vector.h | 10 +++- deal.II/lac/include/lac/vector.templates.h | 52 +++++++++---------- deal.II/lac/source/sparsity_pattern.cc | 10 ++-- 6 files changed, 55 insertions(+), 34 deletions(-) diff --git a/deal.II/lac/include/lac/block_vector.templates.h b/deal.II/lac/include/lac/block_vector.templates.h index 66061cf4a8..8fa9bf34f9 100644 --- a/deal.II/lac/include/lac/block_vector.templates.h +++ b/deal.II/lac/include/lac/block_vector.templates.h @@ -493,6 +493,7 @@ BlockVector& BlockVector::operator = (const Number s) { for (unsigned int i=0;i class Vector; template class VectorMemory; class SolverControl; +/*! @addtogroup Solvers + * @{ + */ /** * Base class for iterative solvers. This class defines possible @@ -173,6 +176,9 @@ class Solver : public Subscriptor */ VectorMemory &memory; }; +/*! + * @} + */ /*-------------------------------- Inline functions ------------------------*/ @@ -193,5 +199,4 @@ Solver::Solver(SolverControl &cn, VectorMemory &mem) memory(mem) {} - #endif diff --git a/deal.II/lac/include/lac/sparsity_pattern.h b/deal.II/lac/include/lac/sparsity_pattern.h index 69ceeddf96..ab7ad9fca6 100644 --- a/deal.II/lac/include/lac/sparsity_pattern.h +++ b/deal.II/lac/include/lac/sparsity_pattern.h @@ -1246,6 +1246,15 @@ SparsityPattern::copy_from (const unsigned int n_rows, { Assert (static_cast(std::distance (begin, end)) == n_rows, ExcIteratorRange (std::distance (begin, end), n_rows)); + + // If the matrix has a zero + // dimension, we are done here. + if ((n_rows == 0) || (n_cols ==0)) + { + reinit(n_rows, n_cols, 0); + compressed = true; + return; + } // first determine row lengths for // each row. if the matrix is diff --git a/deal.II/lac/include/lac/vector.h b/deal.II/lac/include/lac/vector.h index ba8b2e1420..b27be53704 100644 --- a/deal.II/lac/include/lac/vector.h +++ b/deal.II/lac/include/lac/vector.h @@ -646,7 +646,9 @@ void Vector::reinit (const unsigned int n, const bool fast) if (n==0) { if (val) delete[] val; - val = 0; + // one entry must be allocated + // for begin() and end() + val = new value_type[1]; maxdim = dim = 0; return; }; @@ -689,6 +691,7 @@ inline typename Vector::iterator Vector::begin () { + Assert (val!=0, ExcEmptyVector()); return &val[0]; } @@ -699,6 +702,7 @@ inline typename Vector::const_iterator Vector::begin () const { + Assert (val!=0, ExcEmptyVector()); return &val[0]; } @@ -709,6 +713,7 @@ inline typename Vector::iterator Vector::end () { + Assert (val!=0, ExcEmptyVector()); return &val[dim]; } @@ -719,6 +724,7 @@ inline typename Vector::const_iterator Vector::end () const { + Assert (val!=0, ExcEmptyVector()); return &val[dim]; } @@ -769,7 +775,7 @@ template inline Vector & Vector::operator = (const Number s) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); std::fill (begin(), end(), s); return *this; } diff --git a/deal.II/lac/include/lac/vector.templates.h b/deal.II/lac/include/lac/vector.templates.h index 3ee37bacb5..8019229f7e 100644 --- a/deal.II/lac/include/lac/vector.templates.h +++ b/deal.II/lac/include/lac/vector.templates.h @@ -95,7 +95,7 @@ Vector::swap (Vector &v) template bool Vector::all_zero () const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); const_iterator p = begin(), e = end(); @@ -110,7 +110,7 @@ template template Number Vector::operator * (const Vector& v) const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); if (this == reinterpret_cast*>(&v)) return norm_sqr(); @@ -146,7 +146,7 @@ Number Vector::operator * (const Vector& v) const template Number Vector::norm_sqr () const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Number sum0 = 0, sum1 = 0, @@ -176,7 +176,7 @@ Number Vector::norm_sqr () const template Number Vector::mean_value () const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Number sum0 = 0, sum1 = 0, @@ -206,7 +206,7 @@ Number Vector::mean_value () const template Number Vector::l1_norm () const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Number sum0 = 0, sum1 = 0, @@ -243,7 +243,7 @@ Number Vector::l2_norm () const template Number Vector::lp_norm (const Number p) const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Number sum0 = 0, sum1 = 0, @@ -274,7 +274,7 @@ Number Vector::lp_norm (const Number p) const template Number Vector::linfty_norm () const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Number max0=0., max1=0., @@ -300,7 +300,7 @@ Number Vector::linfty_norm () const template Vector& Vector::operator += (const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); add (v); return *this; @@ -310,7 +310,7 @@ Vector& Vector::operator += (const Vector& v) template Vector& Vector::operator -= (const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); iterator i_ptr = begin(), @@ -326,7 +326,7 @@ Vector& Vector::operator -= (const Vector& v) template void Vector::add (const Number v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); iterator i_ptr = begin(), i_end = end(); @@ -338,7 +338,7 @@ void Vector::add (const Number v) template void Vector::add (const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); iterator i_ptr = begin(), @@ -352,7 +352,7 @@ void Vector::add (const Vector& v) template void Vector::add (const Number a, const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); iterator i_ptr = begin(), @@ -367,7 +367,7 @@ template void Vector::add (const Number a, const Vector& v, const Number b, const Vector& w) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); Assert (dim == w.dim, ExcDimensionMismatch(dim, w.dim)); iterator i_ptr = begin(), @@ -382,7 +382,7 @@ void Vector::add (const Number a, const Vector& v, template void Vector::sadd (const Number x, const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); iterator i_ptr = begin(), i_end = end(); @@ -396,7 +396,7 @@ template void Vector::sadd (const Number x, const Number a, const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); iterator i_ptr = begin(), i_end = end(); @@ -411,7 +411,7 @@ void Vector::sadd (const Number x, const Number a, const Vector& v, const Number b, const Vector& w) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); Assert (dim == w.dim, ExcDimensionMismatch(dim, w.dim)); iterator i_ptr = begin(), @@ -429,7 +429,7 @@ void Vector::sadd (const Number x, const Number a, const Vector& w, const Number c, const Vector& y) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); Assert (dim == w.dim, ExcDimensionMismatch(dim, w.dim)); Assert (dim == y.dim, ExcDimensionMismatch(dim, y.dim)); @@ -448,7 +448,7 @@ void Vector::sadd (const Number x, const Number a, template void Vector::scale (const Number factor) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); iterator ptr = begin(); const const_iterator eptr = end(); @@ -462,7 +462,7 @@ template template void Vector::scale (const Vector &s) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == s.dim, ExcDimensionMismatch(dim, s.dim)); iterator ptr = begin(); @@ -478,7 +478,7 @@ template void Vector::equ (const Number a, const Vector& u, const Number b, const Vector& v) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == u.dim, ExcDimensionMismatch(dim, u.dim)); Assert (dim == v.dim, ExcDimensionMismatch(dim, v.dim)); iterator i_ptr = begin(), @@ -495,7 +495,7 @@ template template void Vector::equ (const Number a, const Vector& u) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (dim == u.dim, ExcDimensionMismatch(dim, u.dim)); iterator i_ptr = begin(), i_end = end(); @@ -509,7 +509,7 @@ void Vector::equ (const Number a, const Vector& u) template void Vector::ratio (const Vector &a, const Vector &b) { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); Assert (a.dim == b.dim, ExcDimensionMismatch (a.dim, b.dim)); // no need to reinit with zeros, since @@ -531,7 +531,7 @@ Vector::operator = (const Vector& v) { if (v.dim != dim) reinit (v.dim, true); - if (dim!=0) + if (val!=0) std::copy (v.begin(), v.end(), begin()); return *this; @@ -546,7 +546,7 @@ Vector::operator = (const Vector& v) { if (v.size() != dim) reinit (v.size(), true); - if (dim!=0) + if (val!=0) std::copy (v.begin(), v.end(), begin()); return *this; @@ -557,7 +557,7 @@ Vector::operator = (const Vector& v) template void Vector::print (const char* format) const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); if (!format) format = " %5.2f"; for (unsigned int j=0;j::print (std::ostream &out, const bool scientific, const bool across) const { - Assert (dim!=0, ExcEmptyVector()); + Assert (val!=0, ExcEmptyVector()); out.precision (precision); if (scientific) diff --git a/deal.II/lac/source/sparsity_pattern.cc b/deal.II/lac/source/sparsity_pattern.cc index 5fb54c8615..0e8ab7a1f4 100644 --- a/deal.II/lac/source/sparsity_pattern.cc +++ b/deal.II/lac/source/sparsity_pattern.cc @@ -257,13 +257,13 @@ SparsityPattern::reinit (const unsigned int m, cols = n; // delete empty matrices - if ((m==0) || (n==0)) + if (m==0) { if (rowstart) delete[] rowstart; if (colnums) delete[] colnums; - rowstart = 0; - colnums = 0; - max_vec_len = max_dim = rows = cols = 0; + rowstart = new unsigned int[0]; + colnums = new unsigned int[0]; + max_vec_len = max_dim = 0; // if dimension is zero: ignore // max_per_row max_row_length = 0; @@ -532,7 +532,7 @@ SparsityPattern::empty () const // know at how many places I missed // something in adding it, so I try to // be cautious. wb) - if ((rowstart==0) || (rows==0) || (cols==0)) + if (rowstart==0) { Assert (rowstart==0, ExcInternalError()); Assert (rows==0, ExcInternalError()); -- 2.39.5