double_vector.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_DOUBLE_VECTOR_CLASS_HEADER
27 #define OOMPH_DOUBLE_VECTOR_CLASS_HEADER
28 
29 // Config header generated by autoconfig
30 #ifdef HAVE_CONFIG_H
31 #include <oomph-lib-config.h>
32 #endif
33 
34 #ifdef OOMPH_HAS_MPI
35 #include "mpi.h"
36 #endif
37 
38 // c++ headers
39 #include <algorithm>
40 #include <ostream>
41 
42 // oomph headers
44 
45 
46 namespace oomph
47 {
48  class CRDoubleMatrix;
49 
50  //=============================================================================
56  //=============================================================================
58  {
59  public:
61  DoubleVector() : Values_pt(0), Internal_values(true), Built(false) {}
62 
66  DoubleVector(const LinearAlgebraDistribution* const& dist_pt,
67  const double& v = 0.0)
68  : Values_pt(0), Internal_values(true), Built(false)
69  {
70  this->build(dist_pt, v);
71  }
72 
76  DoubleVector(const LinearAlgebraDistribution& dist, const double& v = 0.0)
77  : Values_pt(0), Internal_values(true), Built(false)
78  {
79  this->build(dist, v);
80  }
81 
85  {
86  this->clear();
87  }
88 
90  DoubleVector(const DoubleVector& new_vector)
92  Values_pt(0),
93  Internal_values(true),
94  Built(false)
95  {
96  this->build(new_vector);
97  }
98 
100  void operator=(const DoubleVector& old_vector)
101  {
102  this->build(old_vector);
103  }
104 
106  void build(const DoubleVector& old_vector);
107 
110  void build(const LinearAlgebraDistribution& dist, const double& v)
111  {
112  this->build(&dist, v);
113  }
114 
117  void build(const LinearAlgebraDistribution* const& dist_pt,
118  const double& v);
119 
124  {
125  this->build(&dist, v);
126  }
127 
131  void build(const LinearAlgebraDistribution* const& dist_pt,
132  const Vector<double>& v);
133 
135  void initialise(const double& v);
136 
139  void initialise(const Vector<double> v);
140 
142  void clear()
143  {
144  if (Internal_values)
145  {
146  delete[] Values_pt;
147  }
148  Values_pt = 0;
149  this->clear_distribution();
150  Built = false;
151  }
152 
153  // indicates whether this DoubleVector is built
154  bool built() const
155  {
156  return Built;
157  }
158 
167  void set_external_values(const LinearAlgebraDistribution* const& dist_pt,
168  double* external_values,
169  bool delete_external_values)
170  {
171  // clean the memory
172  this->clear();
173 
174  // Set the distribution
175  this->build_distribution(dist_pt);
176  // Say that it's built
177  Built = true;
178 
179  // set the external values
180  set_external_values(external_values, delete_external_values);
181  }
182 
191  void set_external_values(double* external_values,
192  bool delete_external_values)
193  {
194 #ifdef PARANOID
195  // check that this distribution is setup
196  if (!this->distribution_built())
197  {
198  // if this vector does not own the double* values then it cannot be
199  // distributed.
200  // note: this is not stictly necessary - would just need to be careful
201  // with delete[] below.
202  std::ostringstream error_message;
203  error_message << "The distribution of the vector must be setup before "
204  << "external values can be set";
205  throw OomphLibError(error_message.str(),
208  }
209 #endif
210  if (Internal_values)
211  {
212  delete[] Values_pt;
213  }
214  Values_pt = external_values;
215  Internal_values = delete_external_values;
216  }
217 
224  void redistribute(const LinearAlgebraDistribution* const& dist_pt);
225 
227  double& operator[](int i);
228 
230  bool operator==(const DoubleVector& v);
231 
233  void operator+=(const DoubleVector& v);
234 
236  void operator-=(const DoubleVector& v);
237 
239  void operator*=(const double& d);
240 
242  void operator/=(const double& d);
243 
245  const double& operator[](int i) const;
246 
248  friend std::ostream& operator<<(std::ostream& out, const DoubleVector& v);
249 
251  double max() const;
252 
254  double* values_pt()
255  {
256  return Values_pt;
257  }
258 
260  double* values_pt() const
261  {
262  return Values_pt;
263  }
264 
266  void output(std::ostream& outfile, const int& output_precision = -1) const;
267 
269  void output(std::string filename, const int& output_precision = -1) const
270  {
271  // Open file
272  std::ofstream some_file;
273  some_file.open(filename.c_str());
274  output(some_file, output_precision);
275  some_file.close();
276  }
277 
279  void output_local_values(std::ostream& outfile,
280  const int& output_precision = -1) const;
281 
284  const int& output_precision = -1) const
285  {
286  // Open file
287  std::ofstream some_file;
288  some_file.open(filename.c_str());
289  output_local_values(some_file, output_precision);
290  some_file.close();
291  }
292 
295  std::ostream& outfile, const int& output_precision = -1) const;
296 
299  const int& output_precision = -1) const
300  {
301  // Open file
302  std::ofstream some_file;
303  some_file.open(filename.c_str());
304  output_local_values_with_offset(some_file, output_precision);
305  some_file.close();
306  }
307 
309  double dot(const DoubleVector& vec) const;
310 
312  double norm() const;
313 
315  double norm(const CRDoubleMatrix* matrix_pt) const;
316 
317  private:
319  double* Values_pt;
320 
324 
326  bool Built;
327 
328  }; // end of DoubleVector
329 
330  //=================================================================
332  //=================================================================
333  namespace DoubleVectorHelpers
334  {
358  void concatenate(const Vector<DoubleVector*>& in_vector_pt,
359  DoubleVector& out_vector);
360 
373  void concatenate(Vector<DoubleVector>& in_vector, DoubleVector& out_vector);
374 
391  void split(const DoubleVector& in_vector,
392  Vector<DoubleVector*>& out_vector_pt);
393 
406  void split(const DoubleVector& in_vector, Vector<DoubleVector>& out_vector);
407 
445  const Vector<DoubleVector*>& in_vector_pt, DoubleVector& out_vector);
446 
461  DoubleVector& out_vector);
462 
481  void split_without_communication(const DoubleVector& in_vector,
482  Vector<DoubleVector*>& out_vector_pt);
483 
497  void split_without_communication(const DoubleVector& in_vector,
498  Vector<DoubleVector>& out_vector);
499 
500  } // namespace DoubleVectorHelpers
501 
502 } // namespace oomph
503 #endif
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Definition: matrices.h:888
Definition: linear_algebra_distribution.h:435
void clear_distribution()
Definition: linear_algebra_distribution.h:522
bool distribution_built() const
Definition: linear_algebra_distribution.h:500
void build_distribution(const LinearAlgebraDistribution *const dist_pt)
Definition: linear_algebra_distribution.h:507
Definition: double_vector.h:58
void set_external_values(double *external_values, bool delete_external_values)
Definition: double_vector.h:191
void initialise(const double &v)
initialise the whole vector with value v
Definition: double_vector.cc:123
void output_local_values(std::string filename, const int &output_precision=-1) const
output the local contents of the vector
Definition: double_vector.h:283
DoubleVector(const LinearAlgebraDistribution *const &dist_pt, const double &v=0.0)
Definition: double_vector.h:66
void operator+=(const DoubleVector &v)
+= operator with another vector
Definition: double_vector.cc:459
DoubleVector(const LinearAlgebraDistribution &dist, const double &v=0.0)
Definition: double_vector.h:76
void output_local_values(std::ostream &outfile, const int &output_precision=-1) const
output the local contents of the vector
Definition: double_vector.cc:742
void set_external_values(const LinearAlgebraDistribution *const &dist_pt, double *external_values, bool delete_external_values)
Definition: double_vector.h:167
double max() const
returns the maximum coefficient
Definition: double_vector.cc:604
bool operator==(const DoubleVector &v)
== operator
Definition: double_vector.cc:426
~DoubleVector()
Definition: double_vector.h:84
void operator*=(const double &d)
multiply by a double
Definition: double_vector.cc:550
void build(const LinearAlgebraDistribution &dist, const Vector< double > &v)
Definition: double_vector.h:123
friend std::ostream & operator<<(std::ostream &out, const DoubleVector &v)
Ouput operator for DoubleVector.
Definition: double_vector.cc:949
DoubleVector()
Constructor for an uninitialized DoubleVector.
Definition: double_vector.h:61
void build(const DoubleVector &old_vector)
Just copys the argument DoubleVector.
Definition: double_vector.cc:35
double * values_pt()
access function to the underlying values
Definition: double_vector.h:254
void redistribute(const LinearAlgebraDistribution *const &dist_pt)
Definition: double_vector.cc:164
double norm() const
compute the 2 norm of this vector
Definition: double_vector.cc:867
bool Internal_values
Definition: double_vector.h:323
void output(std::ostream &outfile, const int &output_precision=-1) const
output the global contents of the vector
Definition: double_vector.cc:653
void output_local_values_with_offset(std::string filename, const int &output_precision=-1) const
output the local contents of the vector
Definition: double_vector.h:298
bool built() const
Definition: double_vector.h:154
void operator-=(const DoubleVector &v)
-= operator with another vector
Definition: double_vector.cc:504
void output(std::string filename, const int &output_precision=-1) const
output the global contents of the vector
Definition: double_vector.h:269
void operator/=(const double &d)
divide by a double
Definition: double_vector.cc:573
void operator=(const DoubleVector &old_vector)
assignment operator
Definition: double_vector.h:100
bool Built
indicates that the vector has been built and is usable
Definition: double_vector.h:326
double * values_pt() const
access function to the underlying values (const version)
Definition: double_vector.h:260
double * Values_pt
the local vector
Definition: double_vector.h:319
double dot(const DoubleVector &vec) const
compute the dot product of this vector with the vector vec.
Definition: double_vector.cc:805
double & operator[](int i)
[] access function to the (local) values of this vector
Definition: double_vector.cc:408
void build(const LinearAlgebraDistribution &dist, const double &v)
Definition: double_vector.h:110
void clear()
wipes the DoubleVector
Definition: double_vector.h:142
DoubleVector(const DoubleVector &new_vector)
Copy constructor.
Definition: double_vector.h:90
void output_local_values_with_offset(std::ostream &outfile, const int &output_precision=-1) const
output the local contents of the vector
Definition: double_vector.cc:772
Definition: linear_algebra_distribution.h:64
Definition: oomph_definitions.h:222
string filename
Definition: MergeRestartFiles.py:39
void split(const DoubleVector &in_vector, Vector< DoubleVector * > &out_vector_pt)
Definition: double_vector.cc:1413
void concatenate_without_communication(const Vector< DoubleVector * > &in_vector_pt, DoubleVector &out_vector)
Definition: double_vector.cc:1856
void split_without_communication(const DoubleVector &in_vector, Vector< DoubleVector * > &out_vector_pt)
Definition: double_vector.cc:2075
void concatenate(const Vector< DoubleVector * > &in_vector_pt, DoubleVector &out_vector)
Definition: double_vector.cc:993
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ofstream out("Result.txt")