PLUTO
eigenv.c
Go to the documentation of this file.
1 #include "pluto.h"
2 
3 /* ********************************************************************* */
4 void MaxSignalSpeed (double **v, double *cs2,
5  double *cmin, double *cmax, int beg, int end)
6 /*
7  *
8  * Defines the maximum and minimum propagation speeds
9  * for the RHD equations.
10  *
11  * Requires: SOUND_SPEED2
12  *
13  *********************************************************************** */
14 {
15  int i;
16  double vx, vt2, vel2;
17  double sroot, *q;
18 
19  for (i = beg; i <= end; i++) {
20 
21  q = v[i];
22 
23  vx = q[VXn];
24  vt2 = EXPAND(0.0, + q[VXt]*q[VXt], + q[VXb]*q[VXb]);
25  vel2 = vx*vx + vt2;
26 
27  sroot = sqrt(cs2[i]*(1.0 - vx*vx - vt2*cs2[i])*(1.0 - vel2));
28 
29  cmax[i] = (vx*(1.0 - cs2[i]) + sroot)/(1.0 - vel2*cs2[i]);
30  cmin[i] = (vx*(1.0 - cs2[i]) - sroot)/(1.0 - vel2*cs2[i]);
31 
32  g_maxMach = MAX(fabs(vx)/sqrt(cs2[i]), g_maxMach);
33  }
34 }
35 
36 /* ******************************************************************** */
37 void PrimEigenvectors (double *q, double cs2, double h, double lambda[],
38  double **LL, double **RR)
39 /*
40  *
41  * Provide eigenvectors eigenvalues of the relativistic
42  * equations in primitive form.
43  *
44  *
45  * INPUT:
46  *
47  * q: a vector of primitive quantities
48  * cs2: sound speed
49  * h: enthalpy
50  *
51  * OUTPUT:
52  *
53  * lambda: returns a vector containing the eigenvalues
54  * LL,RR : return matrices containing the left and right
55  * eigenvectors; the column of RR are the right
56  * eigenvectors, while the row of LL are the left
57  * eigenvectors.
58  *
59  * NOTE: only non-zero components of LL and RR are computed;
60  * RR and LL must be initialized to zero outside.
61  *
62  *********************************************************************** */
63 {
64  int nv, kk,ii,jj, ll;
65  real cs, g, g2, g3, eta;
66  real D, g2_1d;
67  real a,b, r2, r3, r4;
68  real u, v, w, rp,rm, v2tan;
69 #if CHECK_EIGENVECTORS == YES
70  real Aw1[NFLX], Aw0[NFLX], AA[NFLX][NFLX];
71 #endif
72 
73  #if RECONSTRUCT_4VEL
74 
75  /* --------------------------------------------
76  compute Lorentz factor
77  -------------------------------------------- */
78 
79  g = EXPAND(q[VXn]*q[VXn], + q[VXt]*q[VXt], + q[VXb]*q[VXb]);
80  g = sqrt(1.0 + g);
81  EXPAND(u = q[VXn]/g; ,
82  v = q[VXt]/g; ,
83  w = q[VXb]/g;)
84  #else
85  EXPAND(u = q[VXn]; ,
86  v = q[VXt]; ,
87  w = q[VXb];)
88  #endif
89 
90 /* u,v,w are the three dimensional velocities */
91 
92  cs = sqrt(cs2);
93  v2tan = EXPAND(0.0, + v*v, + w*w);
94  eta = sqrt(1.0 - u*u - cs2*v2tan);
95  g2_1d = 1.0/(1.0 - u*u);
96  g2 = u*u + v2tan;
97  a = 1.0 - g2*cs2;
98  g2 = 1.0/(1.0 - g2);
99  g = sqrt(g2);
100  D = q[RHO]*g; /* Lab - Density */
101  rm = u*(1.0 - cs2) - cs*eta/g;
102  rp = u*(1.0 - cs2) + cs*eta/g;
103 
104 /* Define eigenvalues */
105 
106  lambda[0] = rm/a;
107  lambda[1] = rp/a;
108  for (kk = 2; kk < NFLX; kk++) lambda[kk] = u;
109 
110 /* --------------------------------------------------
111  Equivalent to
112 
113  rp = -cs*(g*eta*u + cs)/(g*D*(1.0 - u*u));
114  rm = cs*(g*eta*u - cs)/(g*D*(1.0 - u*u));
115  -------------------------------------------------- */
116 
117  rp = cs*rp/(q[RHO]*(u*cs - g*eta));
118  rm = cs*rm/(q[RHO]*(u*cs + g*eta));
119 
120  a = cs*eta/D;
121  b = h*cs2;
122 
123  #if RECONSTRUCT_4VEL == NO
124 
125  /* ======================================================
126  RIGHT EIGENVECTORS, for three-vel
127  ====================================================== */
128 
129  /* lambda = u - c */
130 
131  RR[RHO][0] = 1.0;
132  EXPAND(RR[VXn][0] = -a; ,
133  RR[VXt][0] = v*rm; ,
134  RR[VXb][0] = w*rm;)
135  RR[PRS][0] = b;
136 
137  /* lambda = u + c */
138 
139  RR[RHO][1] = 1.0;
140  EXPAND(RR[VXn][1] = a; ,
141  RR[VXt][1] = v*rp; ,
142  RR[VXb][1] = w*rp;)
143  RR[PRS][1] = b;
144 
145  /* lambda = u */
146 
147  EXPAND(RR[RHO][2] = 1.0; ,
148  RR[VXt][3] = 1.0; ,
149  RR[VXb][4] = 1.0;)
150 
151  /* ===================================================
152  LEFT EIGENVECTORS
153  =================================================== */
154 
155  a = 0.5/a;
156  b = 0.5/b;
157 
158  /* lambda = u - c */
159 
160  LL[0][VXn] = -a;
161  LL[0][PRS] = b;
162 
163  /* lambda = u + c */
164 
165  LL[1][VXn] = a;
166  LL[1][PRS] = b;
167 
168  /* lambda = u */
169 
170  LL[2][RHO] = 1.0;
171  LL[2][PRS] = -2.0*b;
172 
173  #if COMPONENTS > 1
174 
175  /* lambda = u */
176 
177  LL[3][VXn] = u*v*g2_1d;
178  LL[3][VXt] = 1.0;
179  LL[3][PRS] = v*g2_1d/(g2*q[RHO]*h);
180 
181  #endif
182  #if COMPONENTS > 2
183 
184  /* lambda = u */
185 
186  LL[4][VXn] = u*w*g2_1d;
187  LL[4][VXb] = 1.0;
188  LL[4][PRS] = w*g2_1d/(g2*q[RHO]*h);
189 
190  #endif
191 
192  #elif RECONSTRUCT_4VEL == YES
193 
194 /* ======================================================
195  RIGHT EIGENVECTORS for four-vel
196  ====================================================== */
197 
198  g3 = g2*g;
199 
200 /* lambda = u - c */
201 
202  EXPAND(r2 = -(g + g3*u*u)*a + g3*u*rm*v2tan; ,
203  r3 = v*(-g3*u*a + rm*(g + g3*v2tan)); ,
204  r4 = w*(-g3*u*a + rm*(g + g3*v2tan)); )
205 
206  RR[RHO][0] = 1.0;
207  EXPAND(RR[VXn][0] = r2; ,
208  RR[VXt][0] = r3; ,
209  RR[VXb][0] = r4;)
210  RR[ENG][0] = b;
211 
212 /* lambda = u + c */
213 
214  EXPAND(r2 = (g + g3*u*u)*a + g3*u*rp*v2tan; ,
215  r3 = v*(g3*u*a + rp*(g + g3*v2tan)); ,
216  r4 = w*(g3*u*a + rp*(g + g3*v2tan)); )
217 
218  RR[RHO][1] = 1.0;
219  EXPAND(RR[VXn][1] = r2; ,
220  RR[VXt][1] = r3; ,
221  RR[VXb][1] = r4;)
222  RR[ENG][1] = b;
223 
224 /* lambda = u */
225 
226  RR[RHO][2] = 1.0;
227 
228  #if COMPONENTS > 1
229 
230 /* lambda = u */
231 
232  EXPAND(RR[VXn][3] = g3*u*v; ,
233  RR[VXt][3] = g + g3*v*v; ,
234  RR[VXb][3] = g3*v*w;)
235 
236  #endif
237  #if COMPONENTS > 2
238 
239 /* lambda = u */
240 
241  RR[VXn][4] = g3*u*w;
242  RR[VXt][4] = g3*v*w;
243  RR[VXb][4] = g + g3*w*w;
244 
245  #endif
246 
247 
248 /* ===================================================
249  LEFT EIGENVECTORS
250  =================================================== */
251 
252 /* lambda = u - c */
253 
254  EXPAND(LL[0][VXn] =-0.5*(1.0 - u*u)/a/g; ,
255  LL[0][VXt] = 0.5*u*v/a/g; ,
256  LL[0][VXb] = 0.5*u*w/a/g;)
257  LL[0][ENG] = 0.5/b;
258 
259 /* lambda = u + c */
260 
261  EXPAND(LL[1][VXn] = 0.5*(1.0 - u*u)/a/g; ,
262  LL[1][VXt] = -0.5*u*v/a/g; ,
263  LL[1][VXb] = -0.5*u*w/a/g;)
264  LL[1][ENG] = 0.5/b;
265 
266 /* lambda = u */
267 
268  LL[2][RHO] = 1.0;
269  LL[2][ENG] =-1.0/b;
270 
271  #if COMPONENTS > 1
272 
273 /* lambda = u */
274 
275  EXPAND(LL[3][VXn] = -0.5*v*(rp - rm)/a/g/g2_1d - u*v/g; ,
276  LL[3][VXt] = 0.5*v*v*(rp - rm)*u/a/g + (1.0 - v*v)/g; ,
277  LL[3][VXb] = 0.5*v*(rp - rm)*u*w/a/g - v*w/g;)
278  LL[3][ENG] = -0.5*v*(rm + rp)/b;
279  #endif
280  #if COMPONENTS > 2
281 
282 /* lambda = u */
283 
284  LL[4][VXn] = -0.5*w*(rp - rm)/a/g/g2_1d - u*w/g;
285  LL[4][VXt] = 0.5*v*(rp - rm)*u*w/a/g - v*w/g;
286  LL[4][VXb] = 0.5*w*w*(rp - rm)*u/a/g + (1.0 - w*w)/g;
287  LL[4][ENG] = -0.5*w*(rp + rm)/b;
288 
289  #endif
290  #endif
291 
292 /* -----------------------------------------
293  Check eigenvectors consistency
294  ----------------------------------------- */
295 
296 #if CHECK_EIGENVECTORS == YES
297 
298  for (ii = 0; ii <NFLX; ii++){
299  for (jj = 0; jj <NFLX; jj++){
300  AA[ii][jj] = 0.0;
301  for (kk = 0; kk <NFLX; kk++){
302  for (ll = 0; ll <NFLX; ll++){
303  AA[ii][jj] += RR[ii][kk]*(kk==ll)*lambda[kk]*LL[ll][jj];
304  }}
305  }}
306 
307  PRIM_RHS (q, q, cs2, h, Aw0);
308  for (ii = 0; ii <NFLX; ii++){
309  Aw1[ii] = 0.0;
310  for (jj = 0; jj <NFLX; jj++){
311  Aw1[ii] += AA[ii][jj]*q[jj];
312  }
313  }
314 
315  a = 0.0;
316  for (ii = 0; ii <NFLX; ii++){
317  a += fabs(Aw1[ii] - Aw0[ii]);
318  }
319 
320  if (a > 1.e-1) {
321  print ("! Eigenvectors not consistent in EIGENV%12.6e\n",a);
322  for (ii = 0; ii < NFLX; ii++){
323  for (jj = 0; jj < NFLX; jj++){
324  print ("%12.6e ",AA[ii][jj]);
325  }
326  print("\n");
327  }
328 
329 
330  print ("Aw0: ");
331  for (ii = 0; ii < NFLX; ii++){
332  print ("%12.6e , ",Aw0[ii]);
333  }
334  print ("\nAw1: ");
335  for (ii = 0; ii < NFLX; ii++){
336  print ("%12.6e , ",Aw1[ii]);
337  }
338  QUIT_PLUTO(1);
339  }
340 
341 /* Check eigenvectors orthonormality */
342 
343  for (ii = 0; ii <NFLX;ii++){
344  for (jj = 0; jj <NFLX;jj++){
345  a = 0.0;
346  for (kk = 0; kk <NFLX;kk++){
347  a += LL[kk][ii]*RR[jj][kk];
348  }
349  if (ii==jj && fabs(a-1.0)>1.e-8) {
350  print ("! Eigenvectors not orthogonal! %d %d %12.6e \n",ii,jj,a);
351  print ("NSweep: %d\n",g_dir);
352  QUIT_PLUTO(1);
353  }
354  if(ii!=jj && fabs(a)>1.e-8) {
355  print ("! Eigenvectors not orthogonal (2) %d %d %12.6e !\n",ii,jj,a);
356  print ("NSweep: %d\n",g_dir);
357  QUIT_PLUTO(1);
358  }
359  }
360  }
361 
362 #endif
363 }
364 
365 
366 /* ***************************************************************** */
367 void PrimToChar (double **L, double *v, double *w)
368 /*
369  *
370  * Compute the matrix-vector product between the
371  * the L matrix (containing primitive left eigenvectors)
372  * and the vector v.
373  * For efficiency purpose, multiplication is done
374  * explicitly, so that only nonzero entries
375  * of the left primitive eigenvectors are considered.
376  *
377  *
378  ****************************************************************** */
379 {
380  int nv;
381 
382  #if RECONSTRUCT_4VEL == NO
383 
384  w[0] = L[0][VXn]*v[VXn] + L[0][PRS]*v[PRS];
385  w[1] = L[1][VXn]*v[VXn] + L[1][PRS]*v[PRS];
386  EXPAND( w[2] = v[RHO] + L[2][PRS]*v[PRS]; ,
387  w[3] = L[3][VXn]*v[VXn] + v[VXt] + L[3][PRS]*v[PRS]; ,
388  w[4] = L[4][VXn]*v[VXn] + v[VXb] + L[4][PRS]*v[PRS];)
389 
390  #elif RECONSTRUCT_4VEL == YES
391 
392  w[0] = EXPAND( L[0][VXn]*v[VXn],
393  + L[0][VXt]*v[VXt],
394  + L[0][VXb]*v[VXb]) + L[0][PRS]*v[PRS];
395  w[1] = EXPAND( L[1][VXn]*v[VXn],
396  + L[1][VXt]*v[VXt],
397  + L[1][VXb]*v[VXb]) + L[1][PRS]*v[PRS];;
398 
399  w[2] = v[RHO] + L[2][PRS]*v[PRS];
400 
401  #if COMPONENTS > 1
402  w[3] = EXPAND( L[3][VXn]*v[VXn],
403  + L[3][VXt]*v[VXt],
404  + L[3][VXb]*v[VXb]) + L[3][PRS]*v[PRS];
405 
406  #if COMPONENTS == 3
407  w[4] = L[4][VXn]*v[VXn],
408  L[4][VXt]*v[VXt],
409  L[4][VXb]*v[VXb] + L[4][PRS]*v[PRS];
410  #endif
411  #endif
412 
413  #endif
414 
415 /* -----------------------------------------------
416  For passive scalars, the characteristic
417  variable is equal to the primitive one,
418  since l = r = (0,..., 1 , 0 ,....)
419  ----------------------------------------------- */
420 
421 #if NSCL > 0
422  NSCL_LOOP(nv) w[nv] = v[nv];
423 #endif
424 }
static double a
Definition: init.c:135
#define MAX(a, b)
Definition: macros.h:101
#define NSCL_LOOP(n)
Definition: pluto.h:616
double real
Definition: pluto.h:488
void PrimEigenvectors(double *q, double cs2, double h, double *lambda, double **LL, double **RR)
Definition: eigenv.c:91
#define RHO
Definition: mod_defs.h:19
#define YES
Definition: pluto.h:25
static double *** eta[3]
Definition: res_functions.c:94
double v[NVAR]
Definition: eos.h:106
int VXb
Definition: globals.h:73
double g_maxMach
The maximum Mach number computed during integration.
Definition: globals.h:119
#define NFLX
Definition: mod_defs.h:32
int g_dir
Specifies the current sweep or direction of integration.
Definition: globals.h:86
list vel2
Definition: Sph_disk.py:39
int VXt
Definition: globals.h:73
void print(const char *fmt,...)
Definition: amrPluto.cpp:497
void PrimToChar(double **L, double *v, double *w)
Definition: eigenv.c:593
int VXn
Definition: globals.h:73
#define COMPONENTS
Definition: definitions_01.h:3
PLUTO main header file.
int i
Definition: analysis.c:2
#define RECONSTRUCT_4VEL
When set to YES, reconstruct 4-velocity rather than 3-velocity (only for RHD and RMHD physics modules...
Definition: pluto.h:349
void MaxSignalSpeed(double **v, double *cs2, double *cmin, double *cmax, int beg, int end)
Definition: eigenv.c:34
static Runtime q
#define QUIT_PLUTO(e_code)
Definition: macros.h:125