3 #if RECONSTRUCTION == PARABOLIC || RECONSTRUCTION == WENO3
11 #if CHAR_LIMITING == YES
27 double nup=1.0, num=-1.0, nu[
NVAR];
29 double *vc, *vp, *vm, **L, **R, *lambda;
36 #if CHAR_LIMITING == NO
41 for (i = beg; i <=
end; i++){
57 #if CHAR_LIMITING == NO
60 for (k =
NFLX; k <
NVAR; k++) lambda[k] = vc[V1];
63 for (k = 0; k <
NVAR; k++) nu[k] = dtdx*lambda[k];
69 for (nv = NVAR; nv--; ) {
70 dvp[nv] = vp[nv] - vc[nv];
71 dvm[nv] = vm[nv] - vc[nv];
90 for (nv =
NFLX; nv--; ) vp[nv] = vm[nv] = vc[nv];
92 nup =
MAX(nu[1], 0.0); num =
MIN(nu[0], 0.0);
93 for (nv =
NFLX; nv--; ){
94 dwh = vp[nv] - vm[nv];
95 d2w = vp[nv] + vm[nv] - 2.0*vc[nv];
96 vp[nv] -= 0.5*nup*(dwh + d2w*(3.0 - 2.0*nup));
97 vm[nv] -= 0.5*num*(dwh - d2w*(3.0 + 2.0*num));
110 for (k = 0; k <
NFLX; k++){
111 dwh = dwp[
k] - dwm[
k];
112 d2w = dwp[
k] + dwm[
k];
115 Spp = dwp[
k] - 0.5*nu[
k]*(dwh + d2w*(3.0 - 2.0*nu[
k]));
117 Spp = - 0.5*nu[
k]*(dwh + d2w*(3.0 - 2.0*nu[
k]));
119 Spp = -0.5*(nu[
k]-nup)*(dwh + 3.0*d2w) + (nu[
k]*nu[
k] - nup*nup)*d2w;
121 for (nv = NFLX; nv--; ) vp[nv] += Spp*R[nv][k];
124 Smm = dwm[
k] - 0.5*nu[
k]*(dwh - d2w*(3.0 + 2.0*nu[
k]));
126 Smm = - 0.5*nu[
k]*(dwh - d2w*(3.0 + 2.0*nu[
k]));
128 Smm = -0.5*(nu[
k]-num)*(dwh - 3.0*d2w) + (nu[
k]*nu[
k] - num*num)*d2w;
130 for (nv = NFLX; nv--; ) vm[nv] += Smm*R[nv][k];
138 for (nv = NFLX; nv--; ){
139 dwh = 0.5*
g_dt*src[
i][nv];
149 if (nu[NFLX] >= 0.0) {
150 for (k = NFLX; k <
NVAR; k++){
151 dwh = dwp[
k] - dwm[
k];
152 d2w = dwp[
k] + dwm[
k];
153 vp[
k] -= 0.5*nu[
k]*(dwh + d2w*(3.0 - 2.0*nu[
k]));
156 for (k = NFLX; k <
NVAR; k++){
157 dwh = dwp[
k] - dwm[
k];
158 d2w = dwp[
k] + dwm[
k];
159 vm[
k] -= 0.5*nu[
k]*(dwh - d2w*(3.0 + 2.0*nu[
k]));
166 for (i = beg-1; i <=
end; i++) {
173 for (i = beg; i <=
end; i++) {
176 for (nv =
NVAR; nv--; ) {
177 state->
vh[
i][nv] = 0.5*(vp[nv] + vm[nv]);
188 #if RECONSTRUCTION == LINEAR
223 double nu_max=1.0, nu_min=-1.0, nu[
NVAR];
224 double *vc, *vp, *vm, **L, **R, *lambda;
226 #if GEOMETRY != CARTESIAN
239 #if GEOMETRY != CARTESIAN
240 dfL = grid[
g_dir].dfL;
241 dfR = grid[
g_dir].dfR;
249 #if CHAR_LIMITING == NO
253 PrimSource (state, beg, end, state->
a2, state->
h, src, grid);
254 for (i = beg; i <=
end; i++){
270 #if CHAR_LIMITING == NO
273 for (k =
NFLX; k <
NVAR; k++) lambda[k] = vc[V1];
276 for (k = 0; k <
NVAR; k++) nu[k] = dtdx*lambda[k];
277 nu_max =
MAX(nu[1], 0.0); nu_min =
MIN(nu[0], 0.0);
284 #if GEOMETRY == CYLINDRICAL || GEOMETRY == POLAR
286 double *xR = grid[
IDIR].
xr;
287 for (k = NVAR; k--; ){
288 betaR[
k] = betaL[
k] = 0.0;
295 nu_max *= (1.0 - betaR[1]);
296 nu_min *= (1.0 + betaL[0]);
298 for (k = NVAR; k--; ) betaR[k] = betaL[k] = 0.0;
307 for (nv = NVAR; nv--; ) dv[nv] = vp[nv] - vm[nv];
324 for (nv =
NFLX; nv--; ) vp[nv] = vm[nv] = vc[nv];
326 for (nv =
NFLX; nv--; ) {
327 #if GEOMETRY == CARTESIAN
328 vp[nv] = vc[nv] + 0.5*dv[nv]*(1.0 - nu_max);
329 vm[nv] = vc[nv] - 0.5*dv[nv]*(1.0 + nu_min);
331 vp[nv] = vc[nv] + dv[nv]*(dfR[
i] - 0.5*nu_max);
332 vm[nv] = vc[nv] + dv[nv]*(dfL[
i] - 0.5*nu_min);
356 nu_max = nu[1]; nu_min = nu[0];
359 for (k = 0; k <
NFLX; k++){
361 #if GEOMETRY != CARTESIAN
362 nu[
k] *= (1.0 - betaR[
k]);
365 dw[
k] *= 0.5*(1.0 - nu[
k]);
369 dw[
k] *= 0.5*(nu_max - nu[
k]);
371 for (nv = 0; nv <
NFLX; nv++) vp[nv] += dw[k]*R[nv][k];
373 #if GEOMETRY != CARTESIAN
374 nu[
k] *= (1.0 + betaL[
k]);
377 dw[
k] *= -0.5*(1.0 + nu[
k]);
381 dw[
k] *= 0.5*(nu_min - nu[
k]);
383 for (nv = 0; nv <
NFLX; nv++) vm[nv] += dw[k]*R[nv][k];
391 for (nv = NFLX; nv--; ) {
392 vp[nv] += 0.5*
g_dt*src[
i][nv];
393 vm[nv] += 0.5*
g_dt*src[
i][nv];
401 for (nv = NFLX; nv <
NVAR; nv++) {
402 #if GEOMETRY == CARTESIAN
403 vp[nv] = vc[nv] + 0.5*dv[nv];
404 vm[nv] = vc[nv] - 0.5*dv[nv];
406 vp[nv] = vc[nv] + dv[nv]*dfR[
i];
407 vm[nv] = vc[nv] + dv[nv]*dfL[
i];
410 if (nu[NFLX] >= 0.0){
411 scrh = -0.5*nu[
NFLX];
412 #if GEOMETRY != CARTESIAN
413 scrh *= (1.0 - betaR[
k]);
415 for (k = NFLX; k <
NVAR; k++) vp[k] += dw[k]*scrh;
417 scrh = -0.5*nu[
NFLX];
418 #if GEOMETRY != CARTESIAN
419 scrh *= (1.0 + betaL[
k]);
421 for (k = NFLX; k <
NVAR; k++) vm[k] += dw[k]*scrh;
431 #if SHOCK_FLATTENING == ONED
432 Flatten (state, beg, end, grid);
440 for (i = beg-1; i <=
end; i++) {
451 for (i = beg; i <=
end; i++){
454 for (nv =
NVAR; nv--; ) {
455 state->
vh[
i][nv] = 0.5*(vp[nv] + vm[nv]);
double ** v
Cell-centered primitive varables at the base time level, v[i] = .
int end
Global end index for the local array.
double ** vh
Primitive state at n+1/2 (only for one step method)
void Flatten(const State_1D *, int, int, Grid *)
void PrimEigenvectors(double *q, double cs2, double h, double *lambda, double **LL, double **RR)
void CheckPrimStates(double **vM, double **vP, double **v0, int beg, int end)
double g_dt
The current integration time step.
double ** vR
Primitive variables to the right of the interface, .
void SoundSpeed2(double **v, double *cs2, double *h, int beg, int end, int pos, Grid *grid)
double ** vp
prim vars at i+1/2 edge, vp[i] = vL(i+1/2)
void CharTracingStep(const State_1D *state, int beg, int end, Grid *grid)
int g_dir
Specifies the current sweep or direction of integration.
int beg
Global start index for the local array.
double ** lambda
Characteristic speed associated to Lp and Rp.
void PrimSource(const State_1D *, int, int, double *, double *, double **, Grid *)
void PrimToChar(double **L, double *v, double *w)
double ** vm
prim vars at i-1/2 edge, vm[i] = vR(i-1/2)
long int NMAX_POINT
Maximum number of points among the three directions, boundaries excluded.
double * bn
Face magentic field, bn = bx(i+1/2)
double ** vL
Primitive variables to the left of the interface, .
double * a2
Sound speed squared.
#define ARRAY_2D(nx, ny, type)
double *** Rp
Left and right primitive eigenvectors.