Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
hessenberg.h
Go to the documentation of this file.
1/** @file hessenberg.h
2 */
3/**
4# A solver for Hessenberg systems
5
6An [Hessenberg
7matrix](https://en.wikipedia.org/wiki/Hessenberg_matrix) is an "almost
8triangular" matrix i.e. the sum of a triangular matrix and a
9tridiagonal matrix.
10
11The function below solves \f$Hx=b\f$ where \f$H\f$ is an upper Hessenberg
12matrix of rank \f$n\f$. The right-hand side \f$b\f$ is given as vector \f$x\f$ and
13is replaced by the solution. \f$H\f$ is given as a one dimensional array
14where each matrix element is indexed as \f$H_{ij} = H[in+j]\f$.
15
16## References
17
18~~~bib
19@book{henry1994,
20 title={The shifted Hessenberg system solve computation},
21 author={Henry, Greg},
22 year={1994},
23 publisher={Cornell Theory Center, Cornell University},
24 url={https://pdfs.semanticscholar.org/df75/8d16317f246ac4049a1569b6f56510a4add7.pdf}
25}
26~~~
27*/
28
29static inline void givens (double x, double y, double * c, double * s)
30{
31#if 0
32 #define sign2(a,b) ((b) > 0. ? ((a) > 0. ? (a) : -(a)) : ((a) > 0. ? -(a) : (a)))
33
34 if (x == 0. && y == 0.)
35 *c = 1., *s = 0.;
36 else if (fabs(y) > fabs(x)) {
37 double t = x/y;
38 x = sqrt(1. + t*t);
39 *s = - sign2(1./x, y);
40 *c = t*(*s);
41 }
42 else {
43 double t = y/x;
44 y = sqrt2(1. + t*t);
45 *c = sign2(1./y, x);
46 *s = - t*(*c);
47 }
48#else
49 double t = sqrt (sq(x) + sq(y));
50 *c = x/t, *s = -y/t;
51#endif
52}
53
54void solve_hessenberg (double H[nl*nl], double x[nl])
55{
56 double v[nl], c[nl], s[nl]; v[0] = 1.;
57 for (int i = 0; i < nl; i++)
58 v[i] = H[nl*(i + 1) - 1];
59 for (int k = nl - 1; k >= 1; k--) {
60 double a = H[k*nl + k - 1];
61 givens (v[k], a, &c[k], &s[k]);
62 x[k] /= c[k]*v[k] - s[k]*a;
63 double ykck = x[k]*c[k], yksk = x[k]*s[k];
64 for (int l = 0; l <= k - 2; l++) {
65 a = H[l*nl + k - 1];
66 x[l] -= ykck*v[l] - yksk*a;
67 v[l] = c[k]*a + s[k]*v[l];
68 }
69 a = H[(k - 1)*nl + k - 1];
70 x[k-1] -= ykck*v[k-1] - yksk*a;
71 v[k-1] = c[k]*a + s[k]*v[k-1];
72 }
73 double tau1 = x[0]/v[0];
74 for (int k = 1; k < nl; k++) {
75 double tau2 = x[k];
76 x[k-1] = c[k]*tau1 - s[k]*tau2;
77 tau1 = c[k]*tau2 + s[k]*tau1;
78 }
79 x[nl-1] = tau1;
80}
const vector a
Definition all-mach.h:59
define k
define l
int y
Definition common.h:76
int x
Definition common.h:76
static int sign2(number x)
Definition common.h:14
static number sq(number x)
Definition common.h:11
scalar s
Definition embed-tree.h:56
double v[2]
Definition embed.h:383
scalar int i
Definition embed.h:74
double t
Definition events.h:24
void solve_hessenberg(double H[nl *nl], double x[nl])
Definition hessenberg.h:54
static void givens(double x, double y, double *c, double *s)
Definition hessenberg.h:29
int nl
Definition layers.h:9
scalar c
Definition vof.h:57