Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
lambda2.h
Go to the documentation of this file.
1/** @file lambda2.h
2 */
3static void eigsrt (double d[dimension],
4 double v[dimension][dimension])
5{
6 int k, j, i;
7 double p;
8
9 for (i = 0; i < dimension - 1; i++) {
10 p = d[k = i];
11
12 for (j = i + 1; j < dimension; j++)
13 if (d[j] >= p)
14 p = d[k = j];
15 if (k != i) {
16 d[k] = d[i];
17 d[i] = p;
18 for (j = 0; j < dimension; j++) {
19 p = v[j][i];
20 v[j][i] = v[j][k];
21 v[j][k] = p;
22 }
23 }
24 }
25}
26
27#define ROTATE(a,i,j,k,l) {\
28 g=a[i][j];h=a[k][l];a[i][j]=g-s*(h+g*tau);a[k][l]=h+s*(g-h*tau);}
29
30/**
31 * eigenvalues:
32 * @a: a symmetric matrix.
33 * @d: a vector.
34 * @v: another matrix.
35 *
36 * Fills @d (resp. @v) with the eigenvalues (resp. eigenvectors) of
37 * matrix @a.
38 */
40 double d[dimension],
41 double v[dimension][dimension])
42{
43 int j, iq, ip, i;
44 double tresh, theta, tau, t, sm, s, h, g, c, b[dimension], z[dimension];
45
46 for (ip = 0; ip < dimension; ip++) {
47 for (iq = 0; iq < dimension; iq++)
48 v[ip][iq] = 0.0;
49 v[ip][ip] = 1.0;
50 }
51
52 for (ip = 0; ip < dimension; ip++) {
53 b[ip] = d[ip] = a[ip][ip];
54 z[ip] = 0.0;
55 }
56
57 for (i = 1; i <= 50; i++) {
58 sm = 0.0;
59 for (ip = 0; ip < dimension - 1; ip++) {
60 for (iq = ip + 1; iq < dimension; iq++)
61 sm += fabs (a[ip][iq]);
62 }
63 if (sm == 0.0) {
64 eigsrt (d, v);
65 return;
66 }
67 if (i < 4)
69 else
70 tresh = 0.0;
71 for (ip = 0; ip < dimension - 1; ip++) {
72 for (iq = ip + 1; iq < dimension; iq++) {
73 g = 100.0*fabs (a[ip][iq]);
74 if (i > 4 && fabs(d[ip]) + g == fabs(d[ip]) &&
75 fabs(d[iq]) + g == fabs(d[iq]))
76 a[ip][iq] = 0.0;
77 else if (fabs (a[ip][iq]) > tresh) {
78 h = d[iq] - d[ip];
79 if (fabs(h) + g == fabs(h))
80 t = a[ip][iq]/h;
81 else {
82 theta = 0.5*h/a[ip][iq];
83 t = 1.0/(fabs (theta) + sqrt (1.0 + theta*theta));
84 if (theta < 0.0) t = -t;
85 }
86 c = 1.0/sqrt (1 + t*t);
87 s = t*c;
88 tau = s/(1.0 + c);
89 h = t*a[ip][iq];
90 z[ip] -= h;
91 z[iq] += h;
92 d[ip] -= h;
93 d[iq] += h;
94 a[ip][iq] = 0.0;
95 for (j = 0; j <= ip - 1; j++)
96 ROTATE (a, j, ip, j, iq);
97 for (j = ip + 1; j <= iq - 1; j++)
98 ROTATE (a, ip, j, j, iq);
99 for (j = iq + 1; j < dimension; j++)
100 ROTATE(a, ip, j, iq, j);
101 for (j = 0; j < dimension; j++)
102 ROTATE(v, j, ip, j, iq);
103 }
104 }
105 }
106 for (ip = 0; ip < dimension; ip++) {
107 b[ip] += z[ip];
108 d[ip] = b[ip];
109 z[ip] = 0.0;
110 }
111 }
112 /* Too many iterations */
113 for (i = 0; i < dimension; i++) {
114 for (j = 0; j < dimension; j++)
115 fprintf (stderr, "%10.3g ", a[i][j]);
116 fprintf (stderr, "\n");
117 }
118 assert (false);
119}
120
121void lambda2 (const vector u, scalar l2)
122{
123 for (int _i = 0; _i < _N; _i++) /* foreach */ {
124 double JJ[dimension][dimension];
125 scalar s = u.x;
126 int i = 0;
127 for (int _d = 0; _d < dimension; _d++)
128 JJ[0][i++] = center_gradient (s);
129 s = u.y; i = 0;
130 for (int _d = 0; _d < dimension; _d++)
131 JJ[1][i++] = center_gradient (s);
132 s = u.z; i = 0;
133 for (int _d = 0; _d < dimension; _d++)
134 JJ[2][i++] = center_gradient (s);
135 double S2O2[dimension][dimension];
136 for (int i = 0; i < dimension; i++)
137 for (int j = 0; j < dimension; j++) {
138 S2O2[i][j] = 0.;
139 for (int k = 0; k < dimension; k++)
140 S2O2[i][j] += JJ[i][k]*JJ[k][j] + JJ[k][i]*JJ[j][k];
141 }
144 l2[] = lambda[1]/2.;
145 }
146}
#define u
Definition advection.h:30
vector g[]
We store the combined pressure gradient and acceleration field in g*.
Definition all-mach.h:65
const vector a
Definition all-mach.h:59
scalar h[]
Definition atmosphere.h:6
#define dimension
Definition bitree.h:3
define k
int x
Definition common.h:76
int z
Definition common.h:76
#define center_gradient(a)
Definition common.h:407
#define p
Definition tree.h:320
#define assert(a)
Definition config.h:107
scalar s
Definition embed-tree.h:56
*cs[i, 0, 0] a *[i -1, 0, 0] j
Definition embed.h:88
double v[2]
Definition embed.h:383
double d[2]
Definition embed.h:383
scalar int i
Definition embed.h:74
double t
Definition events.h:24
#define ROTATE(a, i, j, k, l)
Definition lambda2.h:27
void eigenvalues(double a[2][2], double d[2], double v[2][2])
eigenvalues: : a symmetric matrix.
Definition lambda2.h:39
static void eigsrt(double d[2], double v[2][2])
Definition lambda2.h:3
size *double * b
def _i
Definition stencils.h:405
scalar lambda2[]
Definition thermal.h:117
double theta
This is the generalised minmod limiter.
Definition utils.h:223
#define lambda
scalar c
Definition vof.h:57