PLUTO
fd_reconstruct.c
Go to the documentation of this file.
1 #include"pluto.h"
2 
3 /* *********************************************************************** */
4 double MP5_Reconstruct(double *F, double dx, int j)
5 /*
6  *
7  *
8  *
9  *
10  *
11  *
12  ************************************************************************* */
13 {
14  double f, d2, d2p, d2m;
15  double dMMm, dMMp;
16  double scrh1,scrh2, fmin, fmax;
17  double fAV, fMD, fLC, fUL, fMP;
18  static double alpha = 4.0, epsm = 1.e-12;
19 
20  f = 2.0*F[j-2] - 13.0*F[j-1] + 47.0*F[j] + 27.0*F[j+1] - 3.0*F[j+2];
21  f /= 60.0;
22 
23  fMP = F[j] + MINMOD(F[j+1]-F[j],alpha*(F[j]-F[j-1]));
24 
25  if ((f - F[j])*(f - fMP) <= epsm) return f;
26 
27  d2m = F[j-2] + F[j ] - 2.0*F[j-1]; /* -- Eq. (2.19) -- */
28  d2 = F[j-1] + F[j+1] - 2.0*F[j];
29  d2p = F[j ] + F[j+2] - 2.0*F[j+1]; /* -- Eq. (2.19) -- */
30 
31  scrh1 = MINMOD(4.0*d2 - d2p, 4.0*d2p - d2);
32  scrh2 = MINMOD(d2, d2p);
33  dMMp = MINMOD(scrh1,scrh2); /* -- Eq. (2.27) -- */
34 
35  scrh1 = MINMOD(4.0*d2m - d2, 4.0*d2 - d2m);
36  scrh2 = MINMOD(d2, d2m);
37  dMMm = MINMOD(scrh1,scrh2); /* -- Eq. (2.27) -- */
38 
39  fUL = F[j] + alpha*(F[j] - F[j-1]); /* -- Eq. (2.8) -- */
40  fAV = 0.5*(F[j] + F[j+1]); /* -- Eq. (2.16) -- */
41  fMD = fAV - 0.5*dMMp; /* -- Eq. (2.28) -- */
42  fLC = 0.5*(3.0*F[j] - F[j-1]) + 4.0/3.0*dMMm; /* -- Eq. (2.29) -- */
43 
44  scrh1 = MIN(F[j], F[j+1]); scrh1 = MIN(scrh1, fMD);
45  scrh2 = MIN(F[j], fUL); scrh2 = MIN(scrh2, fLC);
46  fmin = MAX(scrh1, scrh2); /* -- Eq. (2.24a) -- */
47 
48  scrh1 = MAX(F[j], F[j+1]); scrh1 = MAX(scrh1, fMD);
49  scrh2 = MAX(F[j], fUL); scrh2 = MAX(scrh2, fLC);
50  fmax = MIN(scrh1, scrh2); /* -- Eq. (2.24b) -- */
51 
52  f = Median(f, fmin, fmax); /* -- Eq. (2.26) -- */
53  return f;
54 }
55 
56 /* ************************************************************* */
57 double PPM_Reconstruct (double *v, double dx, int i)
58 /*
59  *
60  *
61  *
62  *************************************************************** */
63 {
64  double dvm2, dvm1, dvp1, dvp2;
65  double dvc, Sm1, Sp1, Sp2, SM;
66  double ap, am, vp, vm;
67 
68  dvm2 = v[i-1] - v[i-2];
69  dvm1 = v[i] - v[i-1];
70  dvp1 = v[i+1] - v[i];
71  dvp2 = v[i+2] - v[i+1];
72 
73  dvc = 0.5*(dvm2 + dvm1);
74  SM = 2.0*MINMOD(dvm2, dvm1);
75  Sm1 = MINMOD(dvc, SM);
76 
77  dvc = 0.5*(dvm1 + dvp1);
78  SM = 2.0*MINMOD(dvm1, dvp1);
79  Sp1 = MINMOD(dvc, SM);
80 
81  dvc = 0.5*(dvp2 + dvp1);
82  SM = 2.0*MINMOD(dvp2, dvp1);
83  Sp2 = MINMOD(dvc, SM);
84 
85  vp = 0.5*(v[i] + v[i+1]) - (Sp2 - Sp1)/6.0;
86  vm = 0.5*(v[i] + v[i-1]) - (Sp1 - Sm1)/6.0;
87 
88  ap = vp - v[i];
89  am = vm - v[i];
90 
91  if (ap*am >= 0.0) {
92  ap = am = 0.0;
93  }else{
94  if (fabs(ap) >= 2.0*fabs(am)) ap = -2.0*am;
95  if (fabs(am) >= 2.0*fabs(ap)) am = -2.0*ap;
96  }
97  vp = v[i] + ap;
98  return vp;
99 /* vm = v[i] + am; */
100 }
101 
102 /* ************************************************************* */
103 double LIMO3_Reconstruct(double *v, double dx, int i)
104 /*
105  *
106  *
107  *
108  *************************************************************** */
109 {
110  double dvp, dvm, r = 1.;
111  double a,b,c,q, th, lim;
112  double eta, psi, eps = 1.e-12;
113 
114  dvp = v[i+1] - v[i];
115  dvm = v[i] - v[i-1];
116 
117  th = dvm/(dvp + 1.e-16);
118 
119  q = (2.0 + th)/3.0;
120  a = MIN(1.5,2.0*th);
121  a = MIN(q,a);
122  b = MAX(-0.5*th,a);
123  c = MIN(q,b);
124  psi = MAX(0.0,c);
125 
126  eta = r*dx;
127  eta = (dvm*dvm + dvp*dvp)/(eta*eta);
128  if ( eta <= 1.0 - eps) {
129  lim = q;
130  }else if (eta >= 1.0 + eps){
131  lim = psi;
132  }else{
133  psi = (1.0 - (eta - 1.0)/eps)*q
134  + (1.0 + (eta - 1.0)/eps)*psi;
135  lim = 0.5*psi;
136  }
137  return (v[i] + 0.5*dvp*lim);
138 }
139 /* *********************************************************************** */
140 double WENOZ_Reconstruct(double *F, double dx, int j)
141 /*
142  *
143  *
144  * Provide interface values F_{i+1/2} using
145  * WENO-Z reconstruction.
146  *
147  *
148  *
149  ************************************************************************* */
150 #define eps 1.e-6
151 {
152  double IS0, IS1, IS2, IS3, IS4, IS5;
153  double a0, a1, a2;
154  double f0, f1, f2;
155  double w0, w1, w2;
156  double sum_a, f;
157  static double thirteen_12 = 13.0/12.0;
158  double b0, b1, b2,t5;
159 
160  a0 = F[j-2] - 2.0*F[j-1] + F[j];
161  a1 = F[j-2] - 4.0*F[j-1] + 3.0*F[j];
162  b0 = thirteen_12*a0*a0 + 0.25*a1*a1;
163 
164  a0 = F[j-1] - 2.0*F[j] + F[j+1];
165  a1 = F[j-1] - F[j+1];
166  b1 = thirteen_12*a0*a0 + 0.25*a1*a1;
167 
168  a0 = F[j] - 2.0*F[j+1] + F[j+2];
169  a1 = 3.0*F[j] - 4.0*F[j+1] + F[j+2];
170  b2 = thirteen_12*a0*a0 + 0.25*a1*a1;
171 
172  t5 = fabs(b0-b2);
173 
174  a0 = 1.0*(1.0 + t5/(b0 + 1.e-40));
175  a1 = 6.0*(1.0 + t5/(b1 + 1.e-40));
176  a2 = 3.0*(1.0 + t5/(b2 + 1.e-40));
177 
178  sum_a = 1.0/(a0 + a1 + a2);
179  w0 = a0*sum_a;
180  w1 = a1*sum_a;
181  w2 = a2*sum_a;
182 
183  f0 = (2.0*F[j-2] - 7.0*F[j-1] + 11.0*F[j]);
184  f1 = ( -F[j-1] + 5.0*F[j] + 2.0*F[j+1]);
185  f2 = (2.0*F[j] + 5.0*F[j+1] - F[j+2]);
186 
187  f = (w0*f0 + w1*f1 + w2*f2)/6.0;
188  return(f);
189 }
190 
191 /* *********************************************************************** */
192 double WENO3_Reconstruct(double *F, double dx, int j)
193 /*
194  *
195  *
196  * Provide interface values F_{i+1/2} using
197  * third-order WENO reconstruction.
198  *
199  *
200  *
201  ************************************************************************* */
202 {
203  double a0, b0, w0, f0, a1, b1, w1, f1;
204  double tau, dx2;
205 
206  dx2 = dx*dx;
207 
208  b0 = F[j+1] - F[j];
209  b1 = F[j-1] - F[j];
210 
211  b0 = b0*b0;
212  b1 = b1*b1;
213 
214 /* -- traditional version -- */
215 
216 /*
217  a0 = eps + b0;
218  a1 = eps + b1;
219 
220  a0 = 2.0/(a0*a0);
221  a1 = 1.0/(a1*a1);
222 */
223 /* -- improved version -- */
224 
225  tau = (F[j+1] - 2.0*F[j] + F[j-1]);
226  tau = tau*tau;
227 
228  a0 = 2.0*(1.0 + tau/(dx2 + b0));
229  a1 = 1.0*(1.0 + tau/(dx2 + b1));
230 
231  w0 = a0/(a0 + a1);
232  w1 = a1/(a0 + a1);
233 
234  f0 = 0.5*( F[j+1] + F[j]);
235  f1 = 0.5*(-F[j-1] + 3.0*F[j]);
236  return (w0*f0 + w1*f1);
237 }
238 #undef eps
239 
240 
241 /* *********************************************************************** */
242 double LIN_Reconstruct(double *F, double dx, int j)
243 /*
244  *
245  *
246  * Provide interface values F_{i+1/2} using
247  * simple slope-limited linear reconstruction.
248  *
249  *
250  *
251  ************************************************************************* */
252 {
253  double dFp, dFm, dF;
254 
255  dFp = F[j+1] - F[j];
256  dFm = F[j] - F[j-1];
257 
258  dF = MINMOD(dFp, dFm);
259  return (F[j] + 0.5*dF);
260 }
261 
262 
263 /* ************************************************************* */
264 double Median (double a, double b, double c)
265 /*
266  *
267  *
268  *
269  *************************************************************** */
270 {
271  return (a + MINMOD(b-a,c-a));
272 }
static double alpha
Definition: init.c:3
static double a
Definition: init.c:135
#define MAX(a, b)
Definition: macros.h:101
double WENO3_Reconstruct(double *F, double dx, int j)
static double *** eta[3]
Definition: res_functions.c:94
double WENOZ_Reconstruct(double *F, double dx, int j)
double v[NVAR]
Definition: eos.h:106
#define MIN(a, b)
Definition: macros.h:104
double MP5_Reconstruct(double *F, double dx, int j)
Definition: fd_reconstruct.c:4
#define eps
int j
Definition: analysis.c:2
double Median(double a, double b, double c)
#define MINMOD(a, b)
Definition: macros.h:112
tuple c
Definition: menu.py:375
PLUTO main header file.
#define w0
Definition: rk_step.c:20
double PPM_Reconstruct(double *v, double dx, int i)
tuple f1
Definition: sod.py:13
int i
Definition: analysis.c:2
double LIMO3_Reconstruct(double *v, double dx, int i)
static Runtime q
double LIN_Reconstruct(double *F, double dx, int j)