vector_matrix.h
Go to the documentation of this file.
1// LIC// ====================================================================
2// LIC// This file forms part of oomph-lib, the object-oriented,
3// LIC// multi-physics finite-element library, available
4// LIC// at http://www.oomph-lib.org.
5// LIC//
6// LIC// Copyright (C) 2006-2022 Matthias Heil and Andrew Hazel
7// LIC//
8// LIC// This library is free software; you can redistribute it and/or
9// LIC// modify it under the terms of the GNU Lesser General Public
10// LIC// License as published by the Free Software Foundation; either
11// LIC// version 2.1 of the License, or (at your option) any later version.
12// LIC//
13// LIC// This library is distributed in the hope that it will be useful,
14// LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16// LIC// Lesser General Public License for more details.
17// LIC//
18// LIC// You should have received a copy of the GNU Lesser General Public
19// LIC// License along with this library; if not, write to the Free Software
20// LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21// LIC// 02110-1301 USA.
22// LIC//
23// LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24// LIC//
25// LIC//====================================================================
26#ifndef OOMPH_VECTOR_MATRIX_HEADER
27#define OOMPH_VECTOR_MATRIX_HEADER
28
29
30// Config header generated by autoconfig
31#ifdef HAVE_CONFIG_H
32#include <oomph-lib-config.h>
33#endif
34
35
36#ifdef OOMPH_HAS_MPI
37#include "mpi.h"
38#endif
39
40// oomph-lib headers
41#include "Vector.h"
42#include "oomph_utilities.h"
43
44namespace oomph
45{
46 //================================================================
47 /// VectorMatrix is a generalised, STL-map-based, matrix based on a Vector
48 /// of Vectors.
49 ///
50 /// Example of usage:
51 /// \code
52 ///
53 /// // Assume we have a Vector of pointers to objects:
54 /// VectorMatrix<int> vector_matrix(4,5,-1);
55 ///
56 /// // This is a 4 by 5 matrix with all entries set to -1.
57 ///
58 /// std::cout << vector_matrix[3][3] << " "
59 // << vector_matrix.nrow() << " "
60 // << vector_matrix.col() << std::endl;
61 ///
62 /// // Output:
63 /// // -1 4 5
64 ///
65 /// vector_matrix[3][3] = 42;
66 ///
67 /// std::cout << vector_matrix[3][3] << " "
68 /// << vector_matrix.nrow() << " "
69 /// << vector_matrix.col() << std::endl;
70 ///
71 /// // Output:
72 /// // 42 4 5
73 ///
74 /// \endcode
75 ///
76 //================================================================
77 template<class VALUE_TYPE>
79 {
80 public:
81 /// Default constructor - constructs an empty matrix.
83 {
84 Vector_matrix.resize(0);
85 }
86
87 /// Constructor - constructs an n by m matrix with value val.
88 VectorMatrix(const unsigned& n, const unsigned& m, const VALUE_TYPE& val)
89 {
90 this->build_vectors_and_value(n, m, val);
91 }
92
93 /// Constructor - constructs an n by m matrix, the value is defined
94 /// by the default initialisation of VALUE_TYPE.
95 VectorMatrix(const unsigned& n, const unsigned& m)
96 {
97 this->build_vectors(n, m);
98 }
99
100 /// Default virtual destructor
102 {
103 this->clear();
104 }
105
106 /// returns the number of rows. This is the outer Vector size.
107 const unsigned nrow() const
108 {
109#ifdef PARANOID
110 // Inner vector size consistency check: All inner vectors must be the same
111 // size. Although the size of the inner vectors are not directly used to
112 // calculate the nrow(), we perform this check here in case the user has
113 // done something dodgy.
114
115 const unsigned para_nrow = Vector_matrix.size();
116
117 if (para_nrow > 0)
118 {
119 // There is at least one inner vector
120 unsigned inner_vector0_size = Vector_matrix[0].size();
121
122 for (unsigned row_i = 0; row_i < para_nrow; row_i++)
123 {
124 unsigned current_inner_vector_size = Vector_matrix[row_i].size();
125 if (current_inner_vector_size != inner_vector0_size)
126 {
127 std::ostringstream err_msg;
128 err_msg << "The size of the inner vectors are not consistent.\n"
129 << "Vector_matrix[0].size() is " << inner_vector0_size
130 << "\n"
131 << "Vector_matrix[" << row_i << "] is "
132 << current_inner_vector_size << "\n";
133 throw OomphLibError(
134 err_msg.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
135 }
136 }
137 }
138#endif
139
140 return Vector_matrix.size();
141 }
142
143 /// return the number of columns. This is the size of the first inner
144 /// vectors, or returns 0 if the outer vector is of size 0
145 /// (this->nrow() is 0).
146 const unsigned ncol() const
147 {
148#ifdef PARANOID
149 // Inner vector size consistency check: All inner vectors must be the same
150 // size.
151
152 const unsigned para_nrow = this->nrow();
153 if (para_nrow > 0)
154 {
155 // There is at least one inner vector
156 unsigned inner_vector0_size = Vector_matrix[0].size();
157
158 for (unsigned row_i = 0; row_i < para_nrow; row_i++)
159 {
160 unsigned current_inner_vector_size = Vector_matrix[row_i].size();
161 if (current_inner_vector_size != inner_vector0_size)
162 {
163 std::ostringstream err_msg;
164 err_msg << "The size of the inner vectors are not consistent.\n"
165 << "Vector_matrix[0].size() is " << inner_vector0_size
166 << "\n"
167 << "Vector_matrix[" << row_i << "] is "
168 << current_inner_vector_size << "\n";
169 throw OomphLibError(
170 err_msg.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
171 }
172 }
173 }
174#endif
175
176 if (this->nrow() == 0)
177 {
178 return 0;
179 }
180 else
181 {
182 return Vector_matrix[0].size();
183 }
184 }
185
186 /// [] access function to the i-th inner vector.
188 {
189 return Vector_matrix[i];
190 }
191
192 /// [] access function to the i-th inner vector const version
193 const Vector<VALUE_TYPE>& operator[](const size_t i) const
194 {
195 return Vector_matrix[i];
196 }
197
198
199 /// Clears the outer vector. Calling Vector::clear() will invoke the
200 /// destructor of all the inner Vectors.
201 void clear()
202 {
203 Vector_matrix.clear();
204 }
205
206 /// Resize the existing VectorMatrix.
207 /// WARNING: This invokes the resize function in std::vector, as such, only
208 /// new values are assigned, old values as kept.
209 /// e.g. if vec = [2,2,2], then vec.resize(5,3) gives
210 /// vec = [2, 2, 2, 3, 3].
211 void resize(const size_t& n, const size_t& m, VALUE_TYPE val = VALUE_TYPE())
212 {
213 Vector_matrix.resize(n);
214 for (unsigned i = 0; i < n; i++)
215 {
216 Vector_matrix[i].resize(m, val);
217 }
218 }
219
220 /// Any elements held in the container before the call are destroyed
221 /// and replaced by newly constructed elements (no assignments of elements
222 /// take place).
223 /// This causes an automatic reallocation of the allocated storage space if
224 /// -and only if- the new vector size surpasses the current vector capacity.
225 /// This invokes std::assign on both the outer vector and the inner vectors.
226 void assign(const size_t& n, const size_t& m, const VALUE_TYPE& val)
227 {
228 Vector_matrix.assign(n, Vector<VALUE_TYPE>(m, val));
229 }
230
231
232 protected:
233 /// Builds an n by m VectorMatrix with default VALUE_TYPE.
234 void build_vectors(const unsigned& n, const unsigned& m)
235 {
236 Vector_matrix.resize(n, Vector<VALUE_TYPE>(m));
237 }
238
239 /// Build an m by n VectorMatrix with VALUE_TYPE val.
240 void build_vectors_and_value(const unsigned& n,
241 const unsigned& m,
242 const VALUE_TYPE& val)
243 {
244 Vector_matrix.resize(n, Vector<VALUE_TYPE>(m, val));
245 }
246
247 /// Here's the generalised matrix structure: A Vector of Vector to
248 /// templated by VALUE_TYPE.
250 };
251
252} // namespace oomph
253
254#endif
cstr elem_len * i
Definition: cfortran.h:603
An OomphLibError object which should be thrown when an run-time error is encountered....
VectorMatrix is a generalised, STL-map-based, matrix based on a Vector of Vectors.
Definition: vector_matrix.h:79
void build_vectors(const unsigned &n, const unsigned &m)
Builds an n by m VectorMatrix with default VALUE_TYPE.
void build_vectors_and_value(const unsigned &n, const unsigned &m, const VALUE_TYPE &val)
Build an m by n VectorMatrix with VALUE_TYPE val.
Vector< Vector< VALUE_TYPE > > Vector_matrix
Here's the generalised matrix structure: A Vector of Vector to templated by VALUE_TYPE.
const Vector< VALUE_TYPE > & operator[](const size_t i) const
[] access function to the i-th inner vector const version
void assign(const size_t &n, const size_t &m, const VALUE_TYPE &val)
Any elements held in the container before the call are destroyed and replaced by newly constructed el...
virtual ~VectorMatrix()
Default virtual destructor.
const unsigned ncol() const
return the number of columns. This is the size of the first inner vectors, or returns 0 if the outer ...
void resize(const size_t &n, const size_t &m, VALUE_TYPE val=VALUE_TYPE())
Resize the existing VectorMatrix. WARNING: This invokes the resize function in std::vector,...
const unsigned nrow() const
returns the number of rows. This is the outer Vector size.
VectorMatrix(const unsigned &n, const unsigned &m, const VALUE_TYPE &val)
Constructor - constructs an n by m matrix with value val.
Definition: vector_matrix.h:88
void clear()
Clears the outer vector. Calling Vector::clear() will invoke the destructor of all the inner Vectors.
Vector< VALUE_TYPE > & operator[](const size_t i)
[] access function to the i-th inner vector.
VectorMatrix()
Default constructor - constructs an empty matrix.
Definition: vector_matrix.h:82
VectorMatrix(const unsigned &n, const unsigned &m)
Constructor - constructs an n by m matrix, the value is defined by the default initialisation of VALU...
Definition: vector_matrix.h:95
A slight extension to the standard template vector class so that we can include "graceful" array rang...
Definition: Vector.h:58
//////////////////////////////////////////////////////////////////// ////////////////////////////////...