vector_concatenation.cc File Reference
#include "generic.h"

Functions

template<typename myType >
void construct_vector (myType given_array[], unsigned given_arraysize, Vector< myType > &result_vector)
 
template<typename myType >
void output_vector (Vector< myType > &given_vector)
 
void create_vector_ascend_row (unsigned const nrow, const OomphCommunicator *const comm_pt, bool const distributed, DoubleVector &my_vec)
 
void fill_in_sub_vectors (const OomphCommunicator *const comm_pt, const bool distributed, Vector< unsigned > &dimvector, Vector< DoubleVector > &my_vecs)
 
void create_vectors_to_cat (const unsigned nvectors, unsigned dimarray[], const OomphCommunicator *const comm_pt, Vector< DoubleVector > &my_vecs)
 
int main (int argc, char *argv[])
 

Function Documentation

◆ construct_vector()

template<typename myType >
void construct_vector ( myType  given_array[],
unsigned  given_arraysize,
Vector< myType > &  result_vector 
)
36 {
37  // Clear and reserve the required memory.
38  result_vector.clear();
39  result_vector.reserve(given_arraysize);
40 
41  for (unsigned i = 0; i < given_arraysize; i++)
42  {
43  result_vector.push_back(given_array[i]);
44  }
45 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9

References i.

Referenced by create_vectors_to_cat().

◆ create_vector_ascend_row()

void create_vector_ascend_row ( unsigned const  nrow,
const OomphCommunicator *const  comm_pt,
bool const  distributed,
DoubleVector my_vec 
)
67 {
68  // Clear the block
69  my_vec.clear();
70 
71  // Create the distribution.
72  LinearAlgebraDistribution distri(comm_pt,nrow,distributed);
73 
74  // Build the vector
75  my_vec.build(distri,0.0);
76 
77  // The number of rows this processor is responsible for.
78  unsigned nrow_local = distri.nrow_local();
79 
80  // The first_row will be used as an offset for the values to insert.
81  unsigned first_row = distri.first_row();
82 
83  // Fill in values...
84  for (unsigned row_i = 0; row_i < nrow_local; row_i++)
85  {
86  my_vec[row_i] = first_row + row_i + 1; // Use natural numbers
87  }
88 }
void build(const DoubleVector &old_vector)
Just copys the argument DoubleVector.
Definition: double_vector.cc:35
void clear()
wipes the DoubleVector
Definition: double_vector.h:142
Definition: linear_algebra_distribution.h:64

References oomph::DoubleVector::build(), oomph::DoubleVector::clear(), oomph::LinearAlgebraDistribution::first_row(), and oomph::LinearAlgebraDistribution::nrow_local().

Referenced by fill_in_sub_vectors().

◆ create_vectors_to_cat()

void create_vectors_to_cat ( const unsigned  nvectors,
unsigned  dimarray[],
const OomphCommunicator *const  comm_pt,
Vector< DoubleVector > &  my_vecs 
)
114 {
115  // Convert dimarray into a Vector so it is easier to manage.
116  Vector<unsigned> dimvector;
117  construct_vector(dimarray,nvectors,dimvector);
118 
119  // Fill in each sub DoubleVector using create_double_vector_ascend_row(...)
120  bool distributed = true;
121  fill_in_sub_vectors(comm_pt,distributed,dimvector,my_vecs);
122 }
void fill_in_sub_vectors(const OomphCommunicator *const comm_pt, const bool distributed, Vector< unsigned > &dimvector, Vector< DoubleVector > &my_vecs)
Definition: vector_concatenation.cc:92
void construct_vector(myType given_array[], unsigned given_arraysize, Vector< myType > &result_vector)
Definition: vector_concatenation.cc:34

References construct_vector(), and fill_in_sub_vectors().

Referenced by main().

◆ fill_in_sub_vectors()

void fill_in_sub_vectors ( const OomphCommunicator *const  comm_pt,
const bool  distributed,
Vector< unsigned > &  dimvector,
Vector< DoubleVector > &  my_vecs 
)
96 {
97  unsigned nvectors = my_vecs.size();
98 
99  for (unsigned vec_i = 0; vec_i < nvectors; vec_i++)
100  {
101  unsigned vec_size = dimvector[vec_i];
102  create_vector_ascend_row(vec_size,comm_pt,distributed,
103  my_vecs[vec_i]);
104  }
105 }
void create_vector_ascend_row(unsigned const nrow, const OomphCommunicator *const comm_pt, bool const distributed, DoubleVector &my_vec)
Definition: vector_concatenation.cc:63

References create_vector_ascend_row().

Referenced by create_vectors_to_cat().

◆ main()

int main ( int argc  ,
char argv[] 
)

Driver code: Testing DoubleVectorHelpers::concatenate(...)

We concatenate uniformly distributed DoubleVectors. The vectors v1, v2, and v3 have increasing entries with lengths 7, 5 and 3 as depicted below:

v1 v2 v3 [1 [1 [1 2 2 2 3 3 3] 4 4 5 5] 6 7]

The script validate.sh should run this driver on 1, 2, 3 and 4 cores.

Communication is required and the order of the entries is preserved. We demonstrate this on two cores, p0 and p1: v1 p0 p1 [1 [4 2 5 3] 6 7]

v2 p0 p1 [1 [3 2] 4 5]

v3 p0 p1 [1] [2 3]

Result vector: p0 p1 [1 [1 2 2 3 3 4 4 5 5 6 1 7] 2 3]

171 {
172 #ifdef OOMPH_HAS_MPI
173  // Initialise MPI
174  MPI_Helpers::init(argc,argv);
175 #endif
176 
177  // Get the global oomph-lib communicator
178  const OomphCommunicator* const comm_pt = MPI_Helpers::communicator_pt();
179 
180  // How many vectors to concatenate?
181  unsigned nvectors = 3;
182 
183  // Supply the length of the vectors
184  unsigned dimarray[] = {7,5,3};
185 
186  // The data structure to store the DoubleVectors to concatenate
187  Vector<DoubleVector> in_vector(nvectors);
188 
189  // Create the matrices to concatenate.
190  create_vectors_to_cat(nvectors,dimarray,comm_pt,in_vector);
191 
192  // The result vector.
193  DoubleVector out_vector;
194 
195  // Call the concatenate function.
196  DoubleVectorHelpers::concatenate(in_vector,out_vector);
197 
198  // output the result matrix
199  unsigned my_rank = comm_pt->my_rank();
200  unsigned nproc = comm_pt->nproc();
201 
202  // Output data from out_vector:
203  // nrow()
204  // first_row
205  // nrow_local()
206  // distributed()
207  // values()
208 
209  std::ostringstream out_stream;
210  out_stream << "out_NP" << nproc << "R" << my_rank;
211 
212  std::ofstream out_file;
213  out_file.open(out_stream.str().c_str());
214 
215  double* out_values = out_vector.values_pt();
216  unsigned out_nrow_local = out_vector.nrow_local();
217 
218  out_file << out_vector.nrow() << "\n";
219  out_file << out_vector.first_row() << "\n";
220  out_file << out_nrow_local << "\n";
221  out_file << out_vector.distributed() << "\n";
222 
223  for (unsigned val_i = 0; val_i < out_nrow_local; val_i++)
224  {
225  out_file << out_values[val_i] << "\n";
226  }
227 
228  out_file.close();
229 
230 #ifdef OOMPH_HAS_MPI
231  // finalize MPI
232  MPI_Helpers::finalize();
233 #endif
234  return(EXIT_SUCCESS);
235 } // end_of_main
bool distributed() const
distribution is serial or distributed
Definition: linear_algebra_distribution.h:493
unsigned nrow() const
access function to the number of global rows.
Definition: linear_algebra_distribution.h:463
unsigned nrow_local() const
access function for the num of local rows on this processor.
Definition: linear_algebra_distribution.h:469
unsigned first_row() const
access function for the first row on this processor
Definition: linear_algebra_distribution.h:481
Definition: double_vector.h:58
double * values_pt()
access function to the underlying values
Definition: double_vector.h:254
Definition: communicator.h:54
int my_rank() const
my rank
Definition: communicator.h:176
int nproc() const
number of processors
Definition: communicator.h:157
void concatenate(const Vector< DoubleVector * > &in_vector_pt, DoubleVector &out_vector)
Definition: double_vector.cc:993
void create_vectors_to_cat(const unsigned nvectors, unsigned dimarray[], const OomphCommunicator *const comm_pt, Vector< DoubleVector > &my_vecs)
Definition: vector_concatenation.cc:112

References oomph::MPI_Helpers::communicator_pt(), oomph::DoubleVectorHelpers::concatenate(), create_vectors_to_cat(), oomph::DistributableLinearAlgebraObject::distributed(), oomph::MPI_Helpers::finalize(), oomph::DistributableLinearAlgebraObject::first_row(), oomph::MPI_Helpers::init(), oomph::OomphCommunicator::my_rank(), oomph::OomphCommunicator::nproc(), oomph::DistributableLinearAlgebraObject::nrow(), oomph::DistributableLinearAlgebraObject::nrow_local(), and oomph::DoubleVector::values_pt().

◆ output_vector()

template<typename myType >
void output_vector ( Vector< myType > &  given_vector)
50 {
51  typename Vector<myType>::iterator it;
52 
53  for(it = given_vector.begin(); it != given_vector.end(); ++it)
54  {
55  oomph_info << *it << std::endl;
56  }
57 }
OomphInfo oomph_info
Definition: oomph_definitions.cc:319

References oomph::oomph_info.