Unstruct2D  1.0
Solution of 2-D Euler- and Navier-Stokes Equations on Unstructured Triangular Grids
 All Classes Files Functions Variables Typedefs Enumerations Macros
precond.h
Go to the documentation of this file.
1 //*****************************************************************************
8 //
9 // (c) J. Blazek, CFD Consulting & Analysis, www.cfd-ca.de
10 // Created February 15, 2014
11 // Last modification: July 2, 2014
12 //
13 //=============================================================================
14 //
15 // This program is free software; you can redistribute it and/or
16 // modify it under the terms of the GNU General Public License
17 // as published by the Free Software Foundation; either version 2
18 // of the License, or (at your option) any later version.
19 //
20 // This program is distributed in the hope that it will be useful,
21 // but WITHOUT ANY WARRANTY; without even the implied warranty of
22 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 // GNU General Public License for more details.
24 //
25 // You should have received a copy of the GNU General Public License
26 // along with this program; if not, write to the Free Software
27 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 //
29 //*****************************************************************************
30 
31 #ifndef PRECOND_H_INCLUDED
32 #define PRECOND_H_INCLUDED
33 
34 #include "defs.h"
35 
40 class Precond
41 {
42 public:
43 
44  bool switchedOn;
46  machRef2;
48  // functions
49 
53  {
54  switchedOn = false;
55  preCoeff = 0.15;
56  machRef2 = 0.01;
57  }
58 
59  //***************************************************************************
60 
67  REAL ComputeTheta( REAL gam, REAL c, REAL q2 ) const
68  {
69  REAL c2, mach2, mref2, beta;
70 
71  c2 = c*c;
72  mach2 = q2/c2;
73  mref2 = MAX(MIN(mach2,1.0),preCoeff*machRef2);
74  beta = mref2/(1.0+(gam-1.0)*mref2);
75 
76  return(1.0/(beta*c2));
77  }
78 
79  //***************************************************************************
80 
93  static void Prim2Cons( REAL wvec[], REAL wpvec[], REAL H, REAL theta,
94  REAL rhoT, REAL hp, REAL hT, REAL pmat[5][5] )
95  {
96  pmat[0][0] = theta;
97  pmat[1][0] = theta*wpvec[1];
98  pmat[2][0] = theta*wpvec[2];
99  pmat[3][0] = theta*wpvec[3];
100  pmat[4][0] = theta*H - 1. - wvec[0]*hp;
101 
102  pmat[0][1] = 0.;
103  pmat[1][1] = wvec[0];
104  pmat[2][1] = 0.;
105  pmat[3][1] = 0.;
106  pmat[4][1] = wvec[1];
107 
108  pmat[0][2] = 0.;
109  pmat[1][2] = 0.;
110  pmat[2][2] = wvec[0];
111  pmat[3][2] = 0.;
112  pmat[4][2] = wvec[2];
113 
114  pmat[0][3] = 0.;
115  pmat[1][3] = 0.;
116  pmat[2][3] = 0.;
117  pmat[3][3] = wvec[0];
118  pmat[4][3] = wvec[3];
119 
120  pmat[0][4] = rhoT;
121  pmat[1][4] = rhoT*wpvec[1];
122  pmat[2][4] = rhoT*wpvec[2];
123  pmat[3][4] = rhoT*wpvec[3];
124  pmat[4][4] = rhoT*H + wvec[0]*hT;
125  }
126 
127  //***************************************************************************
128 
142  static void Cons2Prim( REAL wvec[], REAL wpvec[], REAL H, REAL q2,
143  REAL theta, REAL rhoT, REAL hp, REAL hT,
144  REAL pmat[5][5] )
145  {
146  double rrho, Hq2, ra1, d1, d2;
147 
148  rrho = 1./wvec[0];
149  Hq2 = H - q2;
150  ra1 = 1./(wvec[0]*theta*hT + rhoT*(1.-wvec[0]*hp));
151  d1 = rhoT*ra1;
152  d2 = theta*ra1;
153 
154  pmat[0][0] = ra1*(wvec[0]*hT+rhoT*Hq2);
155  pmat[1][0] = -wpvec[1]*rrho;
156  pmat[2][0] = -wpvec[2]*rrho;
157  pmat[3][0] = -wpvec[3]*rrho;
158  pmat[4][0] = ra1*(1.-theta*Hq2-wvec[0]*hp);
159 
160  pmat[0][1] = d1*wpvec[1];
161  pmat[1][1] = rrho;
162  pmat[2][1] = 0.;
163  pmat[3][1] = 0.;
164  pmat[4][1] = -d2*wpvec[1];
165 
166  pmat[0][2] = d1*wpvec[2];
167  pmat[1][2] = 0.;
168  pmat[2][2] = rrho;
169  pmat[3][2] = 0.;
170  pmat[4][2] = -d2*wpvec[2];
171 
172  pmat[0][3] = d1*wpvec[3];
173  pmat[1][3] = 0.;
174  pmat[2][3] = 0.;
175  pmat[3][3] = rrho;
176  pmat[4][3] = -d2*wpvec[3];
177 
178  pmat[0][4] = -d1;
179  pmat[1][4] = 0.;
180  pmat[2][4] = 0.;
181  pmat[3][4] = 0.;
182  pmat[4][4] = d2;
183  }
184 
185  //***************************************************************************
186 
199  static void Eigenvalues( REAL wvec[], REAL wpvec[], REAL V,
200  REAL theta, REAL rhop, REAL rhoT,
201  REAL hp, REAL hT, REAL lam[5][5] )
202  {
203  REAL a1, ra1g, a4, a5, cc2;
204 
205  a1 = wvec[0]*rhop*hT + rhoT*(1.-wvec[0]*hp);
206  ra1g = 1./(wvec[0]*theta*hT + rhoT*(1.-wvec[0]*hp));
207  a4 = a1*ra1g;
208  a5 = wvec[0]*hT*ra1g;
209  cc2 = SQRT(V*V*(a4-1.)*(a4-1.)+4.*a5);
210 
211  lam[0][0] = V;
212  lam[1][0] = 0.;
213  lam[2][0] = 0.;
214  lam[3][0] = 0.;
215  lam[4][0] = 0.;
216 
217  lam[0][1] = 0.;
218  lam[1][1] = V;
219  lam[2][1] = 0.;
220  lam[3][1] = 0.;
221  lam[4][1] = 0.;
222 
223  lam[0][2] = 0.;
224  lam[1][2] = 0.;
225  lam[2][2] = V;
226  lam[3][2] = 0.;
227  lam[4][2] = 0.;
228 
229  lam[0][3] = 0.;
230  lam[1][3] = 0.;
231  lam[2][3] = 0.;
232  lam[3][3] = 0.5*((a4+1.)*V+cc2);
233  lam[4][3] = 0.;
234 
235  lam[0][4] = 0.;
236  lam[1][4] = 0.;
237  lam[2][4] = 0.;
238  lam[3][4] = 0.;
239  lam[4][4] = 0.5*((a4+1.)*V-cc2);
240  }
241 
242  //***************************************************************************
243 
257  static void LeftEigenvec( REAL wvec[], REAL wpvec[], REAL nvec[], REAL V,
258  REAL theta, REAL rhop, REAL rhoT,
259  REAL hp, REAL hT, REAL evl[5][5] )
260  {
261  REAL a1, a1g, ra1g, a4, a5, a6, a7, cc;
262  REAL h1, h2, h3;
263 
264  a1 = wvec[0]*rhop*hT + rhoT*(1.-wvec[0]*hp);
265  a1g = wvec[0]*theta*hT + rhoT*(1.-wvec[0]*hp);
266  ra1g = 1./a1g;
267  a4 = a1*ra1g;
268  a5 = wvec[0]*hT*ra1g;
269  cc = 0.5*SQRT(V*V*(a4-1.)*(a4-1.)+4.*a5);
270  a6 = wvec[0]*a5;
271  a7 = (V*(a4-1.))/(4.*cc);
272  h1 = rhoT*ra1g;
273  h2 = a6/cc;
274  h3 = a6/wpvec[4];
275 
276  evl[0][0] = -h1*nvec[0];
277  evl[1][0] = -h1*nvec[1];
278  evl[2][0] = -h1*nvec[2];
279  evl[3][0] = 0.5 + a7;
280  evl[4][0] = 0.5 - a7;
281 
282  evl[0][1] = 0.;
283  evl[1][1] = -h2*nvec[2];
284  evl[2][1] = h2*nvec[1];
285  evl[3][1] = 0.5*h2*nvec[0];
286  evl[4][1] = -0.5*h2*nvec[0];
287 
288  evl[0][2] = h2*nvec[2];
289  evl[1][2] = 0.;
290  evl[2][2] = -h2*nvec[0];
291  evl[3][2] = 0.5*h2*nvec[1];
292  evl[4][2] = -0.5*h2*nvec[1];
293 
294  evl[0][3] = -h2*nvec[1];
295  evl[1][3] = h2*nvec[0];
296  evl[2][3] = 0.;
297  evl[3][3] = 0.5*h2*nvec[2];
298  evl[4][3] = -0.5*h2*nvec[2];
299 
300  evl[0][4] = -h3*nvec[0];
301  evl[1][4] = -h3*nvec[1];
302  evl[2][4] = -h3*nvec[2];
303  evl[3][4] = 0.;
304  evl[4][4] = 0.;
305  }
306 
307  //***************************************************************************
308 
324  static void RightEigenvec( REAL wvec[], REAL wpvec[], REAL nvec[], REAL V,
325  REAL H, REAL theta, REAL rhop, REAL rhoT,
326  REAL hp, REAL hT, REAL evr[5][5] )
327  {
328  REAL a1, a1g, ra1g, a4, a5, a8, a9, a10, cc;
329  REAL h1, h2, h3;
330 
331  a1 = wvec[0]*rhop*hT + rhoT*(1.-wvec[0]*hp);
332  a1g = wvec[0]*theta*hT + rhoT*(1.-wvec[0]*hp);
333  ra1g = 1./a1g;
334  a4 = a1*ra1g;
335  a5 = wvec[0]*hT*ra1g;
336  cc = 0.5*SQRT(V*V*(a4-1.)*(a4-1.)+4.*a5);
337  a8 = rhoT*wpvec[4]/wvec[0];
338  a9 = -0.5*V*(a4-1.);
339  a10 = a8*H + hT*wpvec[4];
340  h1 = a9 + cc;
341  h2 = a9 - cc;
342  h3 = a1g/(wvec[0]*hT);
343 
344  evr[0][0] = -a8*nvec[0];
345  evr[1][0] = -a8*wpvec[1]*nvec[0];
346  evr[2][0] = cc*nvec[2] - a8*wpvec[2]*nvec[0];
347  evr[3][0] = -cc*nvec[1] - a8*wpvec[3]*nvec[0];
348  evr[4][0] = cc*(wpvec[2]*nvec[2]-wpvec[3]*nvec[1]) - a10*nvec[0];
349 
350  evr[0][1] = -a8*nvec[1];
351  evr[1][1] = -cc*nvec[2] - a8*wpvec[1]*nvec[1];
352  evr[2][1] = -a8*wpvec[2]*nvec[1];
353  evr[3][1] = cc*nvec[0] - a8*wpvec[3]*nvec[1];
354  evr[4][1] = cc*(wpvec[3]*nvec[0]-wpvec[1]*nvec[2]) - a10*nvec[1];
355 
356  evr[0][2] = -a8*nvec[2];
357  evr[1][2] = cc*nvec[1] - a8*wpvec[1]*nvec[2];
358  evr[2][2] = -cc*nvec[0] - a8*wpvec[2]*nvec[2];
359  evr[3][2] = -a8*wpvec[3]*nvec[2];
360  evr[4][2] = cc*(wpvec[1]*nvec[1]-wpvec[2]*nvec[0]) - a10*nvec[2];
361 
362  evr[0][3] = h3;
363  evr[1][3] = wpvec[1] + h1*nvec[0];
364  evr[2][3] = wpvec[2] + h1*nvec[1];
365  evr[3][3] = wpvec[3] + h1*nvec[2];
366  evr[4][3] = H + h1*V;
367 
368  evr[0][4] = h3;
369  evr[1][4] = wpvec[1] + h2*nvec[0];
370  evr[2][4] = wpvec[2] + h2*nvec[1];
371  evr[3][4] = wpvec[3] + h2*nvec[2];
372  evr[4][4] = H + h2*V;
373 
374  evr[0][0] *= h3;
375  evr[0][1] *= h3;
376  evr[0][2] *= h3;
377 
378  evr[1][0] *= h3;
379  evr[1][1] *= h3;
380  evr[1][2] *= h3;
381  evr[1][3] *= h3;
382  evr[1][4] *= h3;
383 
384  evr[2][0] *= h3;
385  evr[2][1] *= h3;
386  evr[2][2] *= h3;
387  evr[2][3] *= h3;
388  evr[2][4] *= h3;
389 
390  evr[3][0] *= h3;
391  evr[3][1] *= h3;
392  evr[3][2] *= h3;
393  evr[3][3] *= h3;
394  evr[3][4] *= h3;
395 
396  evr[4][0] *= h3;
397  evr[4][1] *= h3;
398  evr[4][2] *= h3;
399  evr[4][3] *= h3;
400  evr[4][4] *= h3;
401  }
402 
403  //***************************************************************************
404 
420  static void MatprodTp1_P1( REAL wvec[], REAL wpvec[], REAL nvec[], REAL V,
421  REAL H, REAL theta, REAL rhop, REAL rhoT,
422  REAL hp, REAL hT, REAL q2, REAL mat[5][5] )
423  {
424  REAL a1, a1g, ra1g, a4, a5, a5rp, a5c, a5c5, a5rt2, a7, cc, a14, a15, a15rt,
425  a16, a16rt, a17, a17rt, h0, rhoT2, vc;
426 
427  a1 = wvec[0]*rhop*hT + rhoT*(1.-wvec[0]*hp);
428  a1g = wvec[0]*theta*hT + rhoT*(1.-wvec[0]*hp);
429  ra1g = 1./a1g;
430  a4 = a1*ra1g;
431  a5 = wvec[0]*hT*ra1g;
432  cc = 0.5*SQRT(V*V*(a4-1.)*(a4-1.)+4.*a5);
433  a7 = V*(a4-1.)/(4.*cc);
434  h0 = (a5*wvec[0])/(a1*wpvec[4]);
435  a5rp = rhop*h0;
436  a5c = a5/cc;
437  a5c5 = 0.5*a5c;
438  rhoT2 = (rhoT*rhoT)/(a1*a1g);
439  a5rt2 = a5rp - rhoT2;
440  a14 = h0*(1.-rhop*(H-q2)-wvec[0]*hp);
441  a15 = (H-q2)*rhoT + wvec[0]*hT;
442  a15rt = rhoT*a15/(a1*a1g);
443  a16 = (0.5+a7)/a1;
444  a16rt = a16*rhoT;
445  a17 = (0.5-a7)/a1;
446  a17rt = a17*rhoT;
447  vc = nvec[0]*wpvec[1] + nvec[1]*wpvec[2] + nvec[2]*wpvec[3];
448 
449  mat[0][0] = a5c*(nvec[1]*wpvec[3]-nvec[2]*wpvec[2]) - nvec[0]*(a14+a15rt);
450  mat[0][1] = (wpvec[1]*nvec[0])*a5rt2;
451  mat[0][2] = (wpvec[2]*nvec[0])*a5rt2 + a5c*nvec[2];
452  mat[0][3] = (wpvec[3]*nvec[0])*a5rt2 - a5c*nvec[1];
453  mat[0][4] = -nvec[0]*a5rt2;
454 
455  mat[1][0] = a5c*(nvec[2]*wpvec[1]-nvec[0]*wpvec[3]) - nvec[1]*(a14+a15rt);
456  mat[1][1] = (wpvec[1]*nvec[1])*a5rt2 - a5c*nvec[2];
457  mat[1][2] = (wpvec[2]*nvec[1])*a5rt2;
458  mat[1][3] = (wpvec[3]*nvec[1])*a5rt2 + a5c*nvec[0];
459  mat[1][4] = -nvec[1]*a5rt2;
460 
461  mat[2][0] = a5c*(nvec[0]*wpvec[2]-nvec[1]*wpvec[1]) - nvec[2]*(a14+a15rt);
462  mat[2][1] = (wpvec[1]*nvec[2])*a5rt2 + a5c*nvec[1];
463  mat[2][2] = (wpvec[2]*nvec[2])*a5rt2 - a5c*nvec[0];
464  mat[2][3] = (wpvec[3]*nvec[2])*a5rt2;
465  mat[2][4] = -nvec[2]*a5rt2;
466 
467  mat[3][0] = a15*a16 - a5c5*vc;
468  mat[3][1] = a16rt*wpvec[1] + a5c5*nvec[0];
469  mat[3][2] = a16rt*wpvec[2] + a5c5*nvec[1];
470  mat[3][3] = a16rt*wpvec[3] + a5c5*nvec[2];
471  mat[3][4] = -a16rt;
472 
473  mat[4][0] = a15*a17 + a5c5*vc;
474  mat[4][1] = a17rt*wpvec[1] - a5c5*nvec[0];
475  mat[4][2] = a17rt*wpvec[2] - a5c5*nvec[1];
476  mat[4][3] = a17rt*wpvec[3] - a5c5*nvec[2];
477  mat[4][4] = -a17rt;
478  }
479 
480  //***************************************************************************
481 
492  static void MatrixTimesInverse( REAL wpvec[], REAL q2, REAL amat[5][5],
493  REAL bmat[5][5], REAL cmat[5][5] )
494  {
495  REAL a1, a2, a3, a4, a5;
496 
497  a1 = amat[0][0]*bmat[0][0] + amat[0][4]*bmat[4][0];
498  a2 = amat[0][0]*bmat[0][1] + amat[0][4]*bmat[4][1];
499  a3 = amat[0][0]*bmat[0][2] + amat[0][4]*bmat[4][2];
500  a4 = amat[0][0]*bmat[0][3] + amat[0][4]*bmat[4][3];
501  a5 = amat[0][0]*bmat[0][4] + amat[0][4]*bmat[4][4];
502 
503  cmat[0][0] = a1;
504  cmat[1][0] = wpvec[1]*a1 - wpvec[1];
505  cmat[2][0] = wpvec[2]*a1 - wpvec[2];
506  cmat[3][0] = wpvec[3]*a1 - wpvec[3];
507  cmat[4][0] = amat[4][0]*bmat[0][0] + amat[4][4]*bmat[4][0] - q2;
508 
509  cmat[0][1] = a2;
510  cmat[1][1] = wpvec[1]*a2 + 1.;
511  cmat[2][1] = wpvec[2]*a2;
512  cmat[3][1] = wpvec[3]*a2;
513  cmat[4][1] = amat[4][0]*bmat[0][1] + amat[4][4]*bmat[4][1] + wpvec[1];
514 
515  cmat[0][2] = a3;
516  cmat[1][2] = wpvec[1]*a3;
517  cmat[2][2] = wpvec[2]*a3 + 1.;
518  cmat[3][2] = wpvec[3]*a3;
519  cmat[4][2] = amat[4][0]*bmat[0][2] + amat[4][4]*bmat[4][2] + wpvec[2];
520 
521  cmat[0][3] = a4;
522  cmat[1][3] = wpvec[1]*a4;
523  cmat[2][3] = wpvec[2]*a4;
524  cmat[3][3] = wpvec[3]*a4 + 1.;
525  cmat[4][3] = amat[4][0]*bmat[0][3] + amat[4][4]*bmat[4][3] + wpvec[3];
526 
527  cmat[0][4] = a5;
528  cmat[1][4] = wpvec[1]*a5;
529  cmat[2][4] = wpvec[2]*a5;
530  cmat[3][4] = wpvec[3]*a5;
531  cmat[4][4] = amat[4][0]*bmat[0][4] + amat[4][4]*bmat[4][4];
532  }
533 
534  //***************************************************************************
535 
542  static void MatVecProd5( REAL a[5][5], REAL v[], REAL c[] )
543  {
544  c[0] = a[0][0]*v[0] + a[0][1]*v[1] + a[0][2]*v[2] +
545  a[0][3]*v[3] + a[0][4]*v[4];
546  c[1] = a[1][0]*v[0] + a[1][1]*v[1] + a[1][2]*v[2] +
547  a[1][3]*v[3] + a[1][4]*v[4];
548  c[2] = a[2][0]*v[0] + a[2][1]*v[1] + a[2][2]*v[2] +
549  a[2][3]*v[3] + a[2][4]*v[4];
550  c[3] = a[3][0]*v[0] + a[3][1]*v[1] + a[3][2]*v[2] +
551  a[3][3]*v[3] + a[3][4]*v[4];
552  c[4] = a[4][0]*v[0] + a[4][1]*v[1] + a[4][2]*v[2] +
553  a[4][3]*v[3] + a[4][4]*v[4];
554  }
555 
556 private:
557 
558  Precond( const Precond &precond ); // override default copy constructor
559  Precond & operator = (const Precond &precond); // and assignment operator
560 };
561 
562 #endif // PRECOND_H_INCLUDED
REAL ComputeTheta(REAL gam, REAL c, REAL q2) const
Definition: precond.h:67
static void MatprodTp1_P1(REAL wvec[], REAL wpvec[], REAL nvec[], REAL V, REAL H, REAL theta, REAL rhop, REAL rhoT, REAL hp, REAL hT, REAL q2, REAL mat[5][5])
Definition: precond.h:420
REAL machRef2
Definition: precond.h:45
static void Prim2Cons(REAL wvec[], REAL wpvec[], REAL H, REAL theta, REAL rhoT, REAL hp, REAL hT, REAL pmat[5][5])
Definition: precond.h:93
Precond()
Definition: precond.h:52
static void MatrixTimesInverse(REAL wpvec[], REAL q2, REAL amat[5][5], REAL bmat[5][5], REAL cmat[5][5])
Definition: precond.h:492
static void MatVecProd5(REAL a[5][5], REAL v[], REAL c[])
Definition: precond.h:542
Definition: precond.h:40
static void RightEigenvec(REAL wvec[], REAL wpvec[], REAL nvec[], REAL V, REAL H, REAL theta, REAL rhop, REAL rhoT, REAL hp, REAL hT, REAL evr[5][5])
Definition: precond.h:324
static void Cons2Prim(REAL wvec[], REAL wpvec[], REAL H, REAL q2, REAL theta, REAL rhoT, REAL hp, REAL hT, REAL pmat[5][5])
Definition: precond.h:142
static void Eigenvalues(REAL wvec[], REAL wpvec[], REAL V, REAL theta, REAL rhop, REAL rhoT, REAL hp, REAL hT, REAL lam[5][5])
Definition: precond.h:199
REAL preCoeff
Definition: precond.h:45
double REAL
Definition: defs.h:58
bool switchedOn
Definition: precond.h:44
static void LeftEigenvec(REAL wvec[], REAL wpvec[], REAL nvec[], REAL V, REAL theta, REAL rhop, REAL rhoT, REAL hp, REAL hT, REAL evl[5][5])
Definition: precond.h:257