CppNoddy  0.92
Loading...
Searching...
No Matches
Functions
MatrixBandedSolves.cpp File Reference

Example of a simple "banded" inear solver using $ 2 \times 2 $ matrix problem is solved. More...

#include <cassert>
#include <Timer.h>
#include <Types.h>
#include <Utility.h>
#include <DenseLinearSystem.h>
#include <BandedLinearSystem.h>
#include "../Utils_Fill.h"

Go to the source code of this file.

Functions

int main ()
 

Detailed Description

Example of a simple "banded" inear solver using $ 2 \times 2 $ matrix problem is solved.

Then a penta-diagonal problem is solved using the dense, banded and sparse containers. The native linear Gaussian elimination solvers are used unless the PETSC_D/Z compiler options are used, in which case the linear solver phase calls the PETSc library as appropriate.

Definition in file MatrixBandedSolves.cpp.

Function Documentation

◆ main()

int main ( )

Definition at line 24 of file MatrixBandedSolves.cpp.

25{
26
27 cout << "\n";
28 cout << "=== Matrix: Example linear banded solver ============\n";
29 cout << "\n";
30
31 bool failed = false;
32 // tolerance for the test
33 const double tol = 1.e-10;
34
35 //
36 // SOLVE A BANDED REAL SYSTEM using LAPACK or native
37 //
38 const unsigned offdiag = 2;
39 // N = size of some of the larger tests
40 const unsigned N = 511;
41 const double D = 12 * ( 1. / ( N - 1 ) ) * ( 1. / ( N - 1 ) );
42 //
43 BandedMatrix<double> AB( N, offdiag, 0.0 );
44 DenseVector<double> BB( N, D );
45 //
46 Utils_Fill::fill_band( AB, 0, -30.0 );
47 Utils_Fill::fill_band( AB, -1, 16.0 );
48 Utils_Fill::fill_band( AB, 1, 16.0 );
49 Utils_Fill::fill_band( AB, -2, -1.0 );
50 Utils_Fill::fill_band( AB, 2, -1.0 );
51
52 DenseMatrix<double> AD( AB );
53 DenseVector<double> BD( BB );
54
55 cout << " Using dense matrix solver : " << N << "x" << N << " system \n";
56 cout << " Using the native dense routine\n";
57 DenseLinearSystem<double> dense_system( &AD, &BD, "native" );
58
59 try
60 {
61 dense_system.solve();
62 }
63 catch (const std::runtime_error &error )
64 {
65 cout << " \033[1;31;48m * FAILED THROUGH EXCEPTION BEING RAISED \033[0m\n";
66 return 1;
67 }
68
69 cout << " * Not checking.\n";
70 cout << "\n";
71 cout << " Comparing the banded matrix solver solution : ";
72 cout << N << "x" << 2 * AB.noffdiag() + 1 << " system \n";
73
74 cout << " Using the native banded routine\n";
75 BandedLinearSystem<double> banded_system( &AB, &BB, "native" );
76
77 try
78 {
79 banded_system.solve();
80 }
81 catch ( const std::runtime_error &error )
82 {
83 cout << " \033[1;31;48m * FAILED THROUGH EXCEPTION BEING RAISED \033[0m\n";
84 return 1;
85 }
86
87 BB.sub( BD );
88 if ( std::abs( BB.two_norm() ) > tol )
89 {
90 failed = true;
91 cout << " \033[1;31;48m * Banded solver does not give same result as dense solver \033[0m\n";
92 }
93 else
94 {
95 cout << " Banded solver agrees with the dense solver.\n";
96 }
97
98
99 //
100 // CONCLUDING PASS/FAIL
101 //
102 if ( failed )
103 {
104 cout << "\033[1;31;48m * FAILED \033[0m\n";
105 return 1;
106 }
107 else
108 {
109 cout << "\033[1;32;48m * PASSED \033[0m\n";
110 return 0;
111 }
112
113}
A linear system class for vector right-hand sides.
A matrix class that constructs a BANDED matrix.
Definition: BandedMatrix.h:16
A linear system class for vector right-hand sides.
A matrix class that constructs a DENSE matrix as a row major std::vector of DenseVectors.
Definition: DenseMatrix.h:25
An DenseVector class – a dense vector object.
Definition: DenseVector.h:34
void fill_band(CppNoddy::Sequential_Matrix_base< _Type > &A, const int &offset, const _Type &value)
Fill a diagonal band of a matrix.
Definition: Utils_Fill.h:34

References Utils_Fill::fill_band(), CppNoddy::BandedMatrix< _Type >::noffdiag(), CppNoddy::BandedLinearSystem< _Type >::solve(), CppNoddy::DenseLinearSystem< _Type >::solve(), CppNoddy::DenseVector< _Type >::sub(), and CppNoddy::DenseVector< _Type >::two_norm().

© 2012

R.E. Hewitt