matrix_multiply_test.cc File Reference
#include <iostream>
#include "generic.h"
#include "navier_stokes.h"
#include "meshes/simple_rectangular_quadmesh.h"

Classes

class  RectangularDrivenCavityProblem< ELEMENT >
 Driven cavity problem in rectangular domain. More...
 

Namespaces

 Global_Variables
 Namespace for physical parameters.
 

Functions

int main ()
 

Function Documentation

◆ main()

int main ( )

///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// Driver for RectangularDrivenCavity test problem – test drive with two different types of element.

251 {
252  // build the problems and
253  typedef QCrouzeixRaviartElement<2> ELEMENT;
254 
259  problem1_pt->actions_before_newton_solve();
260 
265  problem2_pt->actions_before_newton_solve();
266 
267  // get Jacobians
268  DoubleVector residual;
269  CRDoubleMatrix* CR_matrix1_pt = new CRDoubleMatrix;
270  CRDoubleMatrix* CR_matrix2_pt = new CRDoubleMatrix;
271  CCDoubleMatrix* CC_matrix1_pt = new CCDoubleMatrix;
272  CCDoubleMatrix* CC_matrix2_pt = new CCDoubleMatrix;
273  problem1_pt->get_jacobian(residual,*CR_matrix1_pt);
274  residual.clear();
275  problem1_pt->get_jacobian(residual,*CR_matrix2_pt);
276  residual.clear();
277  problem1_pt->get_jacobian(residual,*CC_matrix1_pt);
278  residual.clear();
279  problem1_pt->get_jacobian(residual,*CC_matrix2_pt);
280  residual.clear();
281 
282  DenseDoubleMatrix* D_matrix1_pt = new DenseDoubleMatrix;
283  DenseDoubleMatrix* D_matrix2_pt = new DenseDoubleMatrix;
284  problem2_pt->get_jacobian(residual,*D_matrix1_pt);
285  problem2_pt->get_jacobian(residual,*D_matrix2_pt);
286 
287  // test matrix-matrix multiplication
288  CRDoubleMatrix* CR_result1_pt = new CRDoubleMatrix;
289  CRDoubleMatrix* CR_result2_pt = new CRDoubleMatrix;
290  CRDoubleMatrix* CR_result3_pt = new CRDoubleMatrix;
291  CCDoubleMatrix* CC_result1_pt = new CCDoubleMatrix;
292  CCDoubleMatrix* CC_result2_pt = new CCDoubleMatrix;
293  CCDoubleMatrix* CC_result3_pt = new CCDoubleMatrix;
294  DenseDoubleMatrix* D_result_pt = new DenseDoubleMatrix;
295 
296  cout << "Running through matrix-matrix multiplication methods" << endl;
297  cout << "----------------------------------------------------" << endl;
298 
299  cout << "Multiplying " << CR_matrix1_pt->ncol()
300  << " x " << CR_matrix1_pt->nrow()
301  << " matrix by a " << CR_matrix2_pt->ncol()
302  << " x " << CR_matrix1_pt->nrow()
303  << " matrix" << endl;
304 
305  cout << "CRDoubleMatrix method 1 " << endl;
306  CR_matrix1_pt->serial_matrix_matrix_multiply_method()=1;
307  CR_matrix1_pt->multiply(*CR_matrix2_pt, *CR_result1_pt);
308 
309  cout << "CRDoubleMatrix method 2 " << endl;
310  CR_matrix1_pt->serial_matrix_matrix_multiply_method()=2;
311  CR_matrix1_pt->multiply(*CR_matrix2_pt, *CR_result2_pt);
312 
313  cout << "CRDoubleMatrix method 3 " << endl;
314  CR_matrix1_pt->serial_matrix_matrix_multiply_method()=3;
315  CR_matrix1_pt->multiply(*CR_matrix2_pt, *CR_result3_pt);
316 
317  cout << "CCDoubleMatrix method 1 " << endl;
318  CC_matrix1_pt->matrix_matrix_multiply_method()=1;
319  CC_matrix1_pt->multiply(*CC_matrix2_pt, *CC_result1_pt);
320 
321  cout << "CCDoubleMatrix method 2 " << endl;
322  CC_matrix1_pt->matrix_matrix_multiply_method()=2;
323  CC_matrix1_pt->multiply(*CC_matrix2_pt, *CC_result2_pt);
324 
325  cout << "CCDoubleMatrix method 3 " << endl;
326  CC_matrix1_pt->matrix_matrix_multiply_method()=3;
327  CC_matrix1_pt->multiply(*CC_matrix2_pt, *CC_result3_pt);
328 
329  cout << "Multiplying " << D_matrix1_pt->ncol()
330  << " x " << D_matrix1_pt->nrow()
331  << " matrix by a " << D_matrix2_pt->ncol()
332  << " x " << D_matrix1_pt->nrow()
333  << " matrix" << endl;
334 
335  cout << "DenseDoubleMatrix " << endl;
336  D_matrix1_pt->multiply(*D_matrix2_pt, *D_result_pt);
337 
338  // output matrices
339  bool output = true;
340  if (output)
341  {
342  ofstream file;
343  file.open("CR_matrix1.dat", ios_base::out);
344  CR_matrix1_pt->sparse_indexed_output(file);
345  file.close();
346  file.open("CR_matrix2.dat", ios_base::out);
347  CR_matrix2_pt->sparse_indexed_output(file);
348  file.close();
349 
350  file.open("CR_result1.dat", ios_base::out);
351  CR_result1_pt->sparse_indexed_output(file);
352  file.close();
353  file.open("CR_result2.dat", ios_base::out);
354  CR_result2_pt->sparse_indexed_output(file);
355  file.close();
356  file.open("CR_result3.dat", ios_base::out);
357  CR_result3_pt->sparse_indexed_output(file);
358  file.close();
359 
360  file.open("CC_matrix1.dat", ios_base::out);
361  CC_matrix1_pt->sparse_indexed_output(file);
362  file.close();
363  file.open("CC_matrix2.dat", ios_base::out);
364  CR_matrix2_pt->sparse_indexed_output(file);
365  file.close();
366 
367  file.open("CC_result1.dat", ios_base::out);
368  CC_result1_pt->sparse_indexed_output(file);
369  file.close();
370  file.open("CC_result2.dat", ios_base::out);
371  CC_result2_pt->sparse_indexed_output(file);
372  file.close();
373  file.open("CC_result3.dat", ios_base::out);
374  CC_result3_pt->sparse_indexed_output(file);
375  file.close();
376 
377  file.open("D_matrix1.dat", ios_base::out);
378  D_matrix1_pt->sparse_indexed_output(file);
379  file.close();
380  file.open("D_matrix2.dat", ios_base::out);
381  D_matrix2_pt->sparse_indexed_output(file);
382  file.close();
383  file.open("D_result.dat", ios_base::out);
384  D_result_pt->sparse_indexed_output(file);
385  file.close();
386  }
387 
388  // clear up memory
389  delete problem1_pt;
390  delete problem2_pt;
391 
392  delete CR_matrix1_pt;
393  delete CR_matrix2_pt;
394  delete CR_result1_pt;
395  delete CR_result2_pt;
396  delete CR_result3_pt;
397 
398  delete CC_matrix1_pt;
399  delete CC_matrix2_pt;
400  delete CC_result1_pt;
401  delete CC_result2_pt;
402  delete CC_result3_pt;
403 
404  delete D_matrix1_pt;
405  delete D_matrix2_pt;
406  delete D_result_pt;
407 
408 } // end_of_main
Driven cavity problem in rectangular domain.
Definition: linear_solvers/driven_cavity.cc:77
void actions_before_newton_solve()
Definition: linear_solvers/driven_cavity.cc:127
A class for compressed column matrices that store doubles.
Definition: matrices.h:2791
unsigned & matrix_matrix_multiply_method()
Definition: matrices.h:2886
void multiply(const DoubleVector &x, DoubleVector &soln) const
Multiply the matrix by the vector x: soln=Ax.
Definition: matrices.cc:622
Definition: matrices.h:888
unsigned long ncol() const
Return the number of columns of the matrix.
Definition: matrices.h:1008
void multiply(const DoubleVector &x, DoubleVector &soln) const
Multiply the matrix by the vector x: soln=Ax.
Definition: matrices.cc:1782
unsigned & serial_matrix_matrix_multiply_method()
Definition: matrices.h:1159
unsigned long nrow() const
Return the number of rows of the matrix.
Definition: matrices.h:1002
Definition: matrices.h:1271
void multiply(const DoubleVector &x, DoubleVector &soln) const
Multiply the matrix by the vector x: soln=Ax.
Definition: matrices.cc:294
unsigned long nrow() const
Return the number of rows of the matrix.
Definition: matrices.h:1295
unsigned long ncol() const
Return the number of columns of the matrix.
Definition: matrices.h:1301
Definition: double_vector.h:58
void clear()
wipes the DoubleVector
Definition: double_vector.h:142
void sparse_indexed_output(std::ostream &outfile, const unsigned &precision=0, const bool &output_bottom_right_zero=false) const
Definition: matrices.h:182
virtual void get_jacobian(DoubleVector &residuals, DenseDoubleMatrix &jacobian)
Definition: problem.cc:3890
Definition: navier_stokes_elements.h:1749
unsigned Nx
Number of elements in x direction.
Definition: sparse_assemble_test.cc:55
unsigned Ny
Number of elements in x direction.
Definition: sparse_assemble_test.cc:58
void output(std::ostream &outfile, const unsigned &nplot)
Overload output function.
Definition: overloaded_element_body.h:490
std::ofstream out("Result.txt")

References RectangularDrivenCavityProblem< ELEMENT >::actions_before_newton_solve(), oomph::DoubleVector::clear(), oomph::Problem::get_jacobian(), oomph::CCDoubleMatrix::matrix_matrix_multiply_method(), oomph::CRDoubleMatrix::multiply(), oomph::DenseDoubleMatrix::multiply(), oomph::CCDoubleMatrix::multiply(), oomph::CRDoubleMatrix::ncol(), oomph::DenseDoubleMatrix::ncol(), oomph::CRDoubleMatrix::nrow(), oomph::DenseDoubleMatrix::nrow(), Global_Variables::Nx, Global_Variables::Ny, out(), output(), oomph::CRDoubleMatrix::serial_matrix_matrix_multiply_method(), and oomph::Matrix< T, MATRIX_TYPE >::sparse_indexed_output().