24 #if RECONSTRUCTION == PARABOLIC || RECONSTRUCTION == WENO3 || RECONSTRUCTION == LimO3
35 #if CHAR_LIMITING == YES
36 #ifndef CHTR_REF_STATE
37 #define CHTR_REF_STATE 2
40 #ifndef CHTR_REF_STATE
41 #define CHTR_REF_STATE 3
64 double nup=1.0, num=-1.0, nu[
NFLX];
66 double *vc, *vp, *vm, **L, **R, *lambda;
73 #if CHAR_LIMITING == NO
78 for (i = beg; i <=
end; i++){
94 #if CHAR_LIMITING == NO
97 for (k = 0; k <
NFLX; k++) nu[k] = dtdx*lambda[k];
103 for (nv =
NVAR; nv--; ) {
104 dvp[nv] = vp[nv] - vc[nv];
105 dvm[nv] = vm[nv] - vc[nv];
126 #if CHTR_REF_STATE == 1
127 for (nv = NFLX; nv--; ) vp[nv] = vm[nv] = vc[nv];
128 #elif CHTR_REF_STATE == 3
129 nup =
MAX(nu[1], 0.0); num =
MIN(nu[0], 0.0);
130 for (nv = NFLX; nv--; ){
131 dwh = vp[nv] - vm[nv];
132 d2w = vp[nv] + vm[nv] - 2.0*vc[nv];
133 vp[nv] -= 0.5*nup*(dwh + d2w*(3.0 - 2.0*nup));
134 vm[nv] -= 0.5*num*(dwh - d2w*(3.0 + 2.0*num));
150 for (k = 0; k <
NFLX; k++){
151 dwh = dwp[
k] - dwm[
k];
152 d2w = dwp[
k] + dwm[
k];
154 #if CHTR_REF_STATE == 1
155 Spp = dwp[
k] - 0.5*nu[
k]*(dwh + d2w*(3.0 - 2.0*nu[
k]));
156 #elif CHTR_REF_STATE == 2
157 Spp = - 0.5*nu[
k]*(dwh + d2w*(3.0 - 2.0*nu[
k]));
158 #elif CHTR_REF_STATE == 3
159 Spp = -0.5*(nu[
k]-nup)*(dwh + 3.0*d2w) + (nu[
k]*nu[
k] - nup*nup)*d2w;
161 for (nv = NFLX; nv--; ) vp[nv] += Spp*R[nv][k];
163 #if CHTR_REF_STATE == 1
164 Smm = dwm[
k] - 0.5*nu[
k]*(dwh - d2w*(3.0 + 2.0*nu[
k]));
165 #elif CHTR_REF_STATE == 2
166 Smm = - 0.5*nu[
k]*(dwh - d2w*(3.0 + 2.0*nu[
k]));
167 #elif CHTR_REF_STATE == 3
168 Smm = -0.5*(nu[
k]-num)*(dwh - 3.0*d2w) + (nu[
k]*nu[
k] - num*num)*d2w;
170 for (nv = NFLX; nv--; ) vm[nv] += Smm*R[nv][k];
178 for (nv = NFLX; nv--; ){
179 dwh = 0.5*
g_dt*src[
i][nv];
189 nu[0] = dtdx*vc[
VXn];
191 for (k = NFLX; k <
NVAR; k++){
192 dwh = dwp[
k] - dwm[
k];
193 d2w = dwp[
k] + dwm[
k];
194 vp[
k] -= 0.5*nu[0]*(dwh + d2w*(3.0 - 2.0*nu[0]));
197 for (k = NFLX; k <
NVAR; k++){
198 dwh = dwp[
k] - dwm[
k];
199 d2w = dwp[
k] + dwm[
k];
200 vm[
k] -= 0.5*nu[0]*(dwh - d2w*(3.0 + 2.0*nu[0]));
211 for (i = beg-1; i <=
end; i++) {
218 for (i = beg; i <=
end; i++) {
227 #undef CHTR_REF_STATE
237 #ifndef CHTR_REF_STATE
238 #define CHTR_REF_STATE 3
252 double nu_max=1.0, nu_min=-1.0, nu[
NFLX];
253 double *vc, *vp, *vm, **L, **R, *lambda;
256 #if GEOMETRY != CARTESIAN
267 #if UNIFORM_CARTESIAN_GRID == NO
271 #if CHAR_LIMITING == NO
275 PrimSource (state, beg, end, state->
a2, state->
h, src, grid);
276 for (i = beg; i <=
end; i++){
278 #if UNIFORM_CARTESIAN_GRID == YES
281 dp = plm_coeffs.
dp[
i];
282 dm = plm_coeffs.
dm[
i];
299 #if CHAR_LIMITING == NO
302 for (k = 0; k <
NFLX; k++) nu[k] = dtdx*lambda[k];
303 nu_max =
MAX(nu[1], 0.0); nu_min =
MIN(nu[0], 0.0);
309 #if GEOMETRY == CYLINDRICAL
311 double *xR = grid[
IDIR].
xr;
312 for (k = NFLX; k--; ){
313 betaR[
k] = betaL[
k] = 0.0;
315 betaR[
k] = (nu[
k] > 1.e-12 ? scrh/(6.0*xR[
i] - 3.0*
scrh):0.0);
316 betaL[
k] = (nu[
k] < -1.e-12 ? -scrh/(6.0*xR[i-1] - 3.0*
scrh):0.0);
318 nu_max *= (1.0 - betaR[1]);
319 nu_min *= (1.0 + betaL[0]);
321 for (k = NFLX; k--; ) betaR[k] = betaL[k] = 0.0;
329 for (nv =
NVAR; nv--; ) dv[nv] = vp[nv] - vm[nv];
347 #if CHTR_REF_STATE == 1
348 for (nv = NFLX; nv--; ) vp[nv] = vm[nv] = vc[nv];
349 #elif CHTR_REF_STATE == 3
350 for (nv = NFLX; nv--; ) {
351 #if GEOMETRY == CARTESIAN
352 vp[nv] = vc[nv] + 0.5*dv[nv]*(1.0 - nu_max);
353 vm[nv] = vc[nv] - 0.5*dv[nv]*(1.0 + nu_min);
355 vp[nv] = vc[nv] + dv[nv]*(dp - 0.5*nu_max);
356 vm[nv] = vc[nv] - dv[nv]*(dm + 0.5*nu_min);
380 nu_max = nu[1]; nu_min = nu[0];
383 for (k = 0; k <
NFLX; k++){
385 #if GEOMETRY != CARTESIAN
386 nu[
k] *= (1.0 - betaR[
k]);
388 #if CHTR_REF_STATE == 1
389 dw[
k] *= 0.5*(1.0 - nu[
k]);
390 #elif CHTR_REF_STATE == 2
392 #elif CHTR_REF_STATE == 3
393 dw[
k] *= 0.5*(nu_max - nu[
k]);
395 for (nv = 0; nv <
NFLX; nv++) vp[nv] += dw[k]*R[nv][k];
397 #if GEOMETRY != CARTESIAN
398 nu[
k] *= (1.0 + betaL[
k]);
400 #if CHTR_REF_STATE == 1
401 dw[
k] *= -0.5*(1.0 + nu[
k]);
402 #elif CHTR_REF_STATE == 2
404 #elif CHTR_REF_STATE == 3
405 dw[
k] *= 0.5*(nu_min - nu[
k]);
407 for (nv = 0; nv <
NFLX; nv++) vm[nv] += dw[k]*R[nv][k];
415 for (nv = NFLX; nv--; ) {
416 vp[nv] += 0.5*
g_dt*src[
i][nv];
417 vm[nv] += 0.5*
g_dt*src[
i][nv];
425 for (nv = NFLX; nv <
NVAR; nv++) {
426 #if GEOMETRY == CARTESIAN
427 vp[nv] = vc[nv] + 0.5*dv[nv];
428 vm[nv] = vc[nv] - 0.5*dv[nv];
430 vp[nv] = vc[nv] + dv[nv]*dp;
431 vm[nv] = vc[nv] - dv[nv]*dm;
435 nu[0] = dtdx*vc[
VXn];
436 #if GEOMETRY == CYLINDRICAL
438 double *xR = grid[
IDIR].
xr;
439 betaR[0] = betaL[0] = 0.0;
441 betaR[0] = (nu[0] > 1.e-12 ? scrh/(6.0*xR[
i] - 3.0*
scrh):0.0);
442 betaL[0] = (nu[0] < -1.e-12 ? -scrh/(6.0*xR[i-1] - 3.0*
scrh):0.0);
444 betaR[0] = betaL[0] = 0.0;
450 #if GEOMETRY != CARTESIAN
451 scrh *= (1.0 - betaR[0]);
453 for (k = NFLX; k <
NVAR; k++) vp[k] += dw[k]*scrh;
456 #if GEOMETRY != CARTESIAN
457 scrh *= (1.0 + betaL[0]);
459 for (k = NFLX; k <
NVAR; k++) vm[k] += dw[k]*scrh;
469 #if SHOCK_FLATTENING == ONED
470 Flatten (state, beg, end, grid);
478 for (i = beg-1; i <=
end; i++) {
489 for (i = beg; i <=
end; i++){
492 NVAR_LOOP(nv) state->vh[i][nv] = 0.5*(vp[nv] + vm[nv]);
498 #undef CHTR_REF_STATE
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 ConvertTo3vel(double **, int, int)
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)
void PLM_CoefficientsGet(PLM_Coeffs *plm_coeffs, int dir)
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.