26 #ifndef OOMPH_SUM_OF_MATRICES_H
27 #define OOMPH_SUM_OF_MATRICES_H
40 using namespace StringConversion;
58 this->build(mesh_pt, dof_index);
65 this->build(lookup_array, length);
75 int result = unsafe_main_to_added(
main);
81 " not found in lookup.";
88 std::string err =
"Something crazy went wrong here.";
102 std::map<unsigned, unsigned>::const_iterator it =
103 Main_to_added_mapping.find(
unsigned(
main));
106 if (it == main_to_added_mapping_pt()->
end())
120 return Added_to_main_mapping[added];
125 void build(
const Mesh* mesh_pt,
const unsigned& dof_index)
127 construct_added_to_main_mapping(mesh_pt, dof_index);
128 construct_reverse_mapping();
133 void build(
const int* lookup_array,
const unsigned& length)
138 for (
unsigned j = 0;
j < length;
j++)
140 if (lookup_array[
j] < 0)
142 std::string err =
"negative entry in lookup array!";
150 Added_to_main_mapping.assign(lookup_array, lookup_array + length);
151 construct_reverse_mapping();
157 const unsigned ni = bem_lookup.size();
158 Added_to_main_mapping.assign(ni, -1);
160 for (
unsigned i = 0;
i < ni;
i++)
162 Added_to_main_mapping[
i] = bem_lookup[
i]->eqn_number(dof_index);
165 construct_reverse_mapping();
171 Added_to_main_mapping.assign(
n, 0);
172 for (
unsigned j = 0;
j <
n;
j++)
174 Added_to_main_mapping[
j] =
j;
176 construct_reverse_mapping();
186 return &Added_to_main_mapping;
192 return &Main_to_added_mapping;
198 const unsigned& dof_index)
201 Added_to_main_mapping.resize(mesh_pt->
nnode());
202 for (
unsigned nd = 0, nnode = mesh_pt->
nnode(); nd < nnode; nd++)
212 if (Added_to_main_mapping.size() == 0)
214 std::ostringstream error_msg;
215 error_msg <<
"Must set up Added_to_main_mapping first.";
222 Main_to_added_mapping.clear();
225 for (
unsigned j = 0;
j < Added_to_main_mapping.size();
j++)
227 Main_to_added_mapping.insert(
228 std::make_pair(Added_to_main_mapping[
j],
j));
261 public Matrix<double, SumOfMatrices>
292 Should_delete_added_matrix(0),
293 Should_delete_main_matrix(0)
299 : Main_matrix_pt(main_matrix_pt),
303 Should_delete_added_matrix(0),
304 Should_delete_main_matrix(0)
318 for (
unsigned i_matrix = 0; i_matrix < Added_matrix_pt.size(); i_matrix++)
320 if (Should_delete_added_matrix[i_matrix] == 1)
322 delete Added_matrix_pt[i_matrix];
326 if (Should_delete_main_matrix)
328 delete Main_matrix_pt;
335 return Main_matrix_pt;
339 return Main_matrix_pt;
346 Should_delete_main_matrix =
true;
355 int last_row = this->nrow() - 1;
356 int last_col = this->ncol() - 1;
358 double last_value = operator()(last_row, last_col);
360 if (last_value == 0.0)
362 outfile << last_row <<
" " << last_col <<
" " << 0.0 << std::endl;
371 for (
unsigned long i = 0;
i < nrow();
i++)
373 for (
unsigned long j = 0;
j < ncol();
j++)
375 double entry = operator()(
i,
j);
379 outfile <<
i <<
" " <<
j <<
" " << entry << std::endl;
397 for (
int i = 0;
i <
int(nrow());
i++)
399 for (
int j = 0;
j <
int(ncol());
j++)
401 double entry = operator()(
i,
j);
407 values.push_back(entry);
418 bool should_delete_matrix =
false)
423 added_matrix_pt_in->
nrow())
426 "Row mapping size should be less than or equal to nrow (less than if "
427 "it is a sparse matrix and there are some empty rows).",
434 added_matrix_pt_in->
ncol())
437 "Col mapping size should be less than or equal to ncol (less than if "
438 "it is a sparse matrix and there are some empty cols).",
443 #ifdef RANGE_CHECKING
449 *std::max_element(rowmap_pt->begin(), rowmap_pt->end());
450 if (max_row > main_matrix_pt()->nrow())
453 "Trying to add a matrix with a mapping which specifices";
454 err +=
" a max row of " +
to_string(max_row) +
" but the main matrix ";
455 err +=
"only has " +
to_string(main_matrix_pt()->nrow()) +
" rows!";
465 *std::max_element(colmap_pt->begin(), colmap_pt->end());
466 if (max_col > main_matrix_pt()->ncol())
469 "Trying to add a matrix with a mapping which specifices";
470 err +=
" a max col of " +
to_string(max_col) +
" but the main matrix ";
471 err +=
"only has " +
to_string(main_matrix_pt()->ncol()) +
" cols!";
477 Added_matrix_pt.push_back(added_matrix_pt_in);
478 Row_map_pt.push_back(main_to_added_rows_pt);
479 Col_map_pt.push_back(main_to_added_cols_pt);
480 Should_delete_added_matrix.push_back(
unsigned(should_delete_matrix));
487 return Added_matrix_pt[
i];
493 return Row_map_pt[
i];
497 return Col_map_pt[
i];
501 inline unsigned long nrow()
const
504 if (Main_matrix_pt == 0)
511 return Main_matrix_pt->
nrow();
515 inline unsigned long ncol()
const
518 if (Main_matrix_pt == 0)
525 return Main_matrix_pt->
ncol();
531 return Added_matrix_pt.size();
540 double&
entry(
const unsigned long&
i,
const unsigned long&
j)
const
543 "Broken write to entry: it does not make sense to write to a sum, you "
544 "must write to one of the component matrices.",
552 double operator()(
const unsigned long&
i,
const unsigned long&
j)
const
555 double sum = main_matrix_pt()->operator()(
i,
j);
556 for (
unsigned i_matrix = 0; i_matrix < n_added_matrix(); i_matrix++)
558 int li = Row_map_pt[i_matrix]->unsafe_main_to_added(
i);
559 int lj = Col_map_pt[i_matrix]->unsafe_main_to_added(
j);
562 if ((li != -1) && (lj != -1))
564 sum += added_matrix_pt(i_matrix)->operator()(li, lj);
576 std::ostringstream error_msg;
577 error_msg <<
"Function not yet implemented.";
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
int main(int argc, char *argv[])
Definition: T_protectiveWall.cpp:194
Definition: sum_of_matrices.h:47
AddedMainNumberingLookup(const Mesh *mesh_pt, const unsigned &dof_index)
Definition: sum_of_matrices.h:56
const Vector< unsigned > * added_to_main_mapping_pt() const
Const access function for mapping.
Definition: sum_of_matrices.h:184
unsigned main_to_added(const int &main) const
Definition: sum_of_matrices.h:73
AddedMainNumberingLookup()
Default constructor.
Definition: sum_of_matrices.h:50
void construct_reverse_mapping()
Set up the main to added mapping using the added to main mapping.
Definition: sum_of_matrices.h:209
AddedMainNumberingLookup(const int *lookup_array, const unsigned &length)
Definition: sum_of_matrices.h:63
unsigned added_to_main(const unsigned &added) const
Definition: sum_of_matrices.h:118
Vector< unsigned > Added_to_main_mapping
Definition: sum_of_matrices.h:234
AddedMainNumberingLookup(const AddedMainNumberingLookup &dummy)=delete
Inaccessible copy constructor.
int unsafe_main_to_added(const int &main) const
Definition: sum_of_matrices.h:99
void build(const Mesh *mesh_pt, const unsigned &dof_index)
Definition: sum_of_matrices.h:125
void operator=(const AddedMainNumberingLookup &dummy)=delete
Inaccessible assignment operator.
void build_identity_map(const unsigned &n)
Construct an identity map (mostly for testing).
Definition: sum_of_matrices.h:169
void construct_added_to_main_mapping(const Mesh *mesh_pt, const unsigned &dof_index)
Set up the lookup from added matrix row/col to main matrix.
Definition: sum_of_matrices.h:197
const std::map< unsigned, unsigned > * main_to_added_mapping_pt() const
Const access function for mapping.
Definition: sum_of_matrices.h:190
void build(const Vector< const Node * > &bem_lookup, const unsigned &dof_index)
Construct lookup using node vector.
Definition: sum_of_matrices.h:155
std::map< unsigned, unsigned > Main_to_added_mapping
Definition: sum_of_matrices.h:241
~AddedMainNumberingLookup()
Destructor.
Definition: sum_of_matrices.h:69
void build(const int *lookup_array, const unsigned &length)
Definition: sum_of_matrices.h:133
long & eqn_number(const unsigned &i)
Return the equation number of the i-th stored variable.
Definition: nodes.h:367
Definition: matrices.h:261
virtual unsigned long ncol() const =0
Return the number of columns of the matrix.
virtual unsigned long nrow() const =0
Return the number of rows of the matrix.
Definition: double_vector.h:58
Definition: matrices.h:74
unsigned long nnode() const
Return number of nodes in the mesh.
Definition: mesh.h:596
Node *& node_pt(const unsigned long &n)
Return pointer to global node n.
Definition: mesh.h:436
Definition: oomph_definitions.h:222
Definition: sum_of_matrices.h:262
virtual void multiply_transpose(const DoubleVector &x, DoubleVector &soln) const
Definition: sum_of_matrices.h:573
SumOfMatrices(const SumOfMatrices &matrix)=delete
Broken copy constructor.
void output_bottom_right_zero_helper(std::ostream &outfile) const
Definition: sum_of_matrices.h:353
SumOfMatrices(DoubleMatrixBase *main_matrix_pt)
Constructor taking a pointer to the main matrix as input.
Definition: sum_of_matrices.h:298
unsigned n_added_matrix() const
Return the number of added matrices in the sum.
Definition: sum_of_matrices.h:529
DoubleMatrixBase * added_matrix_pt(const unsigned &i) const
Definition: sum_of_matrices.h:485
const AddedMainNumberingLookup * row_map_pt(const unsigned &i) const
Access to the maps.
Definition: sum_of_matrices.h:491
unsigned long nrow() const
Return the number of rows of the main matrix.
Definition: sum_of_matrices.h:501
SumOfMatrices()
Default constructor.
Definition: sum_of_matrices.h:287
Vector< DoubleMatrixBase * > Added_matrix_pt
List of pointers to the matrices that are added to the main matrix.
Definition: sum_of_matrices.h:268
Vector< const AddedMainNumberingLookup * > Col_map_pt
Definition: sum_of_matrices.h:276
double & entry(const unsigned long &i, const unsigned long &j) const
Definition: sum_of_matrices.h:540
void set_delete_main_matrix()
Definition: sum_of_matrices.h:344
const DoubleMatrixBase * main_matrix_pt() const
Access to the main matrix.
Definition: sum_of_matrices.h:333
double operator()(const unsigned long &i, const unsigned long &j) const
Definition: sum_of_matrices.h:552
void add_matrix(DoubleMatrixBase *added_matrix_pt_in, const AddedMainNumberingLookup *main_to_added_rows_pt, const AddedMainNumberingLookup *main_to_added_cols_pt, bool should_delete_matrix=false)
Definition: sum_of_matrices.h:415
void operator=(const SumOfMatrices &)=delete
Broken assignment operator.
Vector< const AddedMainNumberingLookup * > Row_map_pt
Definition: sum_of_matrices.h:272
Vector< unsigned > Should_delete_added_matrix
Should we delete the sub matrices when destructor is called?
Definition: sum_of_matrices.h:279
void get_as_indices(Vector< int > &row, Vector< int > &col, Vector< double > &values)
Definition: sum_of_matrices.h:389
const AddedMainNumberingLookup * col_map_pt(const unsigned &i) const
Definition: sum_of_matrices.h:495
unsigned long ncol() const
Return the number of columns of the main matrix.
Definition: sum_of_matrices.h:515
bool Should_delete_main_matrix
Definition: sum_of_matrices.h:283
~SumOfMatrices()
Definition: sum_of_matrices.h:316
void sparse_indexed_output_helper(std::ostream &outfile) const
Definition: sum_of_matrices.h:369
DoubleMatrixBase * Main_matrix_pt
Pointer to the matrix which we are adding the others to.
Definition: sum_of_matrices.h:265
DoubleMatrixBase *& main_matrix_pt()
Definition: sum_of_matrices.h:337
Definition: oomph-lib/src/generic/Vector.h:58
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
std::string to_string(T object, unsigned float_precision=8)
Definition: oomph_utilities.h:189
void multiply(const CRDoubleMatrix *matrix, const DoubleVector &x, DoubleVector &soln)
Definition: trilinos_helpers.cc:657
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
list x
Definition: plotDoE.py:28
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2