26{
27
28 cout << "\n";
29 cout << "=== Matrix: Example linear banded solver ============\n";
30 cout << "\n";
31
33
34 const double tol = 1.e-10;
35
36
37
38
39 const unsigned offdiag = 2;
40
41 const unsigned N = 511;
42 const double D = 12 * ( 1. / ( N - 1 ) ) * ( 1. / ( N - 1 ) );
43
53
54 cout << " Using dense matrix solver : " << N << "x" << N << " system \n";
55 cout << " Using the LAPACK LU dense routine\n";
57
58 try
59 {
60 dense_system.solve();
61 }
62 catch ( const std::runtime_error &error )
63 {
64 cout << " \033[1;31;48m * FAILED THROUGH EXCEPTION BEING RAISED \033[0m\n";
65 return 1;
66 }
67
68 cout << " * Not checking.\n";
69 cout << "\n";
70 cout << " Comparing the banded matrix solver solution : ";
71 cout << N << "x" << 2 * AB.noffdiag() + 1 << " system \n";
72
73 cout << " Using the LAPACK LU banded routine\n";
75
76 try
77 {
78 banded_system.solve();
79 }
80 catch ( const std::runtime_error &error )
81 {
82 cout << " \033[1;31;48m * FAILED THROUGH EXCEPTION BEING RAISED \033[0m\n";
83 return 1;
84 }
85
86 BB.sub( BD );
87 if ( std::abs( BB.two_norm() ) > tol )
88 {
90 cout << " \033[1;31;48m * Banded solver does not give same result as dense solver \033[0m\n";
91 }
92 else
93 {
94 cout << " Banded solver agrees with the dense solver.\n";
95 }
96
97
98
99
100
101 if ( failed )
102 {
103 cout << "\033[1;31;48m * FAILED \033[0m\n";
104 return 1;
105 }
106 else
107 {
108 cout << "\033[1;32;48m * PASSED \033[0m\n";
109 return 0;
110 }
111}
A linear system class for vector right-hand sides.
A matrix class that constructs a BANDED matrix.
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.
An DenseVector class – a dense vector object.
void fill_band(CppNoddy::Sequential_Matrix_base< _Type > &A, const int &offset, const _Type &value)
Fill a diagonal band of a matrix.