22{
23 cout << "\n";
24 cout << "=== EVP: Temporal spectra of the Orr-Sommerfeld eqn =\n";
25 cout << "=== with a matrix problem assembled by hand.\n";
26 cout << "\n";
27
28
29
30 const std::size_t nodes( 301 );
31
32 const std::size_t N( 2 * nodes );
33
34 const double left = -1.0;
35 const double right = 1.0;
36
37 const double d = ( right - left ) / ( nodes - 1 );
38
39
42
43
44 const double alpha ( 1.02 );
45 const double Re ( 5772.2 );
47
48
49 a( 0, 0 ) = 1.0;
50 a( 1, 0 ) = -1.5 / d;
51 a( 1, 2 ) = 2.0 / d;
52 a( 1, 4 ) = -0.5 / d;
53
54 for ( std::size_t i = 1; i <= nodes - 2; ++i )
55 {
56
57 const double y = left + i * d;
58
59 const double U = ( 1.0 - y * y );
60 const double Udd = -2.0;
61
62
63 std::size_t row = 2 * i;
64 a( row, row ) = -2.0 / ( d * d ) - alpha * alpha;
65 a( row, row - 2 ) = 1.0 / ( d * d );
66 a( row, row + 2 ) = 1.0 / ( d * d );
67 a( row, row + 1 ) = -1.0;
68
69 row += 1;
70
71 a( row, row ) = -2.0 / ( d * d ) - alpha * alpha - I * alpha * Re *
U;
72 a( row, row - 2 ) = 1.0 / ( d * d );
73 a( row, row + 2 ) = 1.0 / ( d * d );
75
76 b( row, row ) = - I *
alpha *
Re;
77 }
78
79 a( N - 2, N - 2 ) = 1.5 / d;
80 a( N - 2, N - 4 ) = -2.0 / d;
81 a( N - 2, N - 6 ) = 0.5 / d;
82 a( N - 1, N - 2 ) = 1.0;
83
86
87 try
88 {
89 system.eigensolve();
90 }
91 catch (const std::runtime_error &error )
92 {
93 cout << " \033[1;31;48m * FAILED THROUGH EXCEPTION BEING RAISED \033[0m\n";
94 return 1;
95 }
96
97 system.set_shift(
D_complex( 0.0, -0.1 ) );
98 system.tag_eigenvalues_upper( + 1 );
99 lambdas = system.get_tagged_eigenvalues();
100
101 double min_growth_rate( lambdas[ 0 ].
imag() );
102
103 const double tol = 1.e-3;
104
105 std::string dirname("./DATA");
106 mkdir( dirname.c_str(), S_IRWXU );
108 spectrum.push_ptr( &lambdas, "evs" );
109 spectrum.update();
110 if ( std::abs( min_growth_rate ) < tol )
111 {
112 cout << "\033[1;32;48m * PASSED \033[0m\n";
113 return 0;
114 }
115
116 cout << "\033[1;31;48m * FAILED \033[0m\n";
117 cout << " Final error = " << min_growth_rate << "\n";
118 return 1;
119}
A linear Nth-order generalised eigensystem class.
A matrix class that constructs a DENSE matrix as a row major std::vector of DenseVectors.
An DenseVector class – a dense vector object.
double Udd(double y)
Globally define the base flow curvature.
double Re
Globally define the Reynolds number and wavenumber.
DenseVector< double > imag(const DenseVector< D_complex > &X)
Return a double DENSE vector containing the imaginary part of a complex DENSE vector.
std::complex< double > D_complex
A complex double precision number using std::complex.