66 #if CHAR_LIMITING == NO
80 double dvp, cp, *wp, *hp, **vp;
81 double dvm, cm, *wm, *hm, **vm;
94 #if SHOCK_FLATTENING == MULTID
114 #if PPM_ORDER == 3 || PPM_ORDER == 5
115 for (i = beg; i <= end; i++) {
116 wp = ppm_coeffs.
wp[
i];
117 wm = ppm_coeffs.
wm[
i];
120 vp[
i][nv] = wp[-1]*v[i-1][nv] + wp[0]*v[
i][nv] + wp[1]*v[i+1][nv];
121 vm[
i][nv] = wm[-1]*v[i-1][nv] + wm[0]*v[
i][nv] + wm[1]*v[i+1][nv];
123 vp[
i][nv] = wp[-2]*v[i-2][nv] + wp[-1]*v[i-1][nv] +
124 wp[ 0]*v[
i][nv] + wp[ 1]*v[i+1][nv] + wp[ 2]*v[i+2][nv];
126 vm[
i][nv] = wm[-2]*v[i-2][nv] + wm[-1]*v[i-1][nv] + wm[0]*v[
i][nv]
127 + wm[ 1]*v[i+1][nv] + wm[ 2]*v[i+2][nv];
129 dvp = vp[
i][nv] - v[
i][nv];
130 dvm = vm[
i][nv] - v[
i][nv];
132 dv = v[i+1][nv] - v[
i][nv];
133 vp[
i][nv] = v[
i][nv] +
MINMOD(dvp, dv);
135 dv = v[
i][nv] - v[i-1][nv];
136 vm[
i][nv] = v[
i][nv] +
MINMOD(dvm, -dv);
140 for (i = beg-1; i <= end; i++) {
141 wp = ppm_coeffs.
wp[
i];
143 vp[
i][nv] = wp[-1]*v[i-1][nv] + wp[0]*v[
i][nv]
144 + wp[ 1]*v[i+1][nv] + wp[2]*v[i+2][nv];
146 dv = v[i+1][nv] - v[
i][nv];
147 dvp = vp[
i][nv] - v[
i][nv];
148 vp[
i][nv] = v[
i][nv] +
MINMOD(dvp, dv);
151 for (i = beg; i <= end; i++)
VAR_LOOP(nv) vm[
i][nv] = vp[i-1][nv];
159 for (i = beg; i <= end; i++) {
160 #if SHOCK_FLATTENING == MULTID
165 dvp = (v[i+1][nv] - v[
i][nv])*wp[i];
166 dvm = (v[
i][nv] - v[i-1][nv])*wm[i];
168 vp[
i][nv] = v[
i][nv] + dv*plm_coeffs.
dp[
i];
169 vm[
i][nv] = v[
i][nv] - dv*plm_coeffs.
dm[
i];
171 #if PHYSICS == RHD || PHYSICS == RMHD
181 cm = (hm[
i] + 1.0)/(hp[
i] - 1.0);
182 cp = (hp[
i] + 1.0)/(hm[
i] - 1.0);
185 for (nv = 0; nv <
NVAR; nv++){
186 dvp = vp[
i][nv] - v[
i][nv];
187 dvm = vm[
i][nv] - v[
i][nv];
189 if (dvp*dvm >= 0.0) dvp = dvm = 0.0;
191 if (fabs(dvp) >= cm*fabs(dvm)) dvp = -cm*dvm;
192 else if (fabs(dvm) >= cp*fabs(dvp)) dvm = -cp*dvp;
194 vp[
i][nv] = v[
i][nv] + dvp;
195 vm[
i][nv] = v[
i][nv] + dvm;
197 #if PHYSICS == RHD || PHYSICS == RMHD
206 #if SHOCK_FLATTENING == YES
207 Flatten (state, beg, end, grid);
215 for (i = beg-1; i <= end; i++) {
224 #if TIME_STEPPING == CHARACTERISTIC_TRACING
249 #if CHAR_LIMITING == YES
257 #define PARABOLIC_LIM 1
264 int i,
j,
k, nv, S=1;
265 double dtdx, dx, dx2;
266 double dp, cp, dvp[
NVAR], dwp[
NVAR], dwp1[
NVAR], *wp, *hp, **vp;
267 double dm, cm, dvm[
NVAR], dwm[
NVAR], dwm1[
NVAR], *wm, *hm, **vm;
268 double dv, **v, **L, **R, *lambda;
269 double tau, a0, a1,
w0, w1;
270 static double **dvF, **vppm4;
292 #if SHOCK_FLATTENING == MULTID
304 #if RECONSTRUCTION == PARABOLIC
309 for (i = beg-S; i <= end+S-1; i++){
317 #if RECONSTRUCTION == PARABOLIC && PPM_ORDER != 4
318 print1 (
"! States(): characteristic PPM interpolation requires PPM_ORDER = 4\n");
321 for (i = beg-1; i <= end; i++) {
322 wp = ppm_coeffs.
wp[
i];
324 vppm4[
i][nv] = wp[-1]*v[i-1][nv] + wp[0]*v[
i][nv]
325 + wp[ 1]*v[i+1][nv] + wp[2]*v[i+2][nv];
333 for (i = beg; i <= end; i++){
349 for (k =
NFLX; k <
NVAR; k++) lambda[k] = v[i][
VXn];
352 #if SHOCK_FLATTENING == MULTID
354 for (nv = 0; nv <
NVAR; nv++){
355 dp = dvF[
i][nv] *plm_coeffs.
wp[
i];
356 dm = dvF[i-1][nv]*plm_coeffs.
wm[
i];
358 vp[
i][nv] = v[
i][nv] + dv*plm_coeffs.
dp[
i];
359 vm[
i][nv] = v[
i][nv] - dv*plm_coeffs.
dm[
i];
361 #if PHYSICS == RHD || PHYSICS == RMHD
373 #if RECONSTRUCTION == WENO3
380 for (k = 0; k <
NVAR; k++){
381 tau = (dwp1[
k] - dwm1[
k]);
384 a0 = 1.0 + tau/(dx2 + dwp1[
k]*dwp1[
k]);
385 a1 = 1.0 + tau/(dx2 + dwm1[
k]*dwm1[
k]);
387 dwp[
k] = (a0*dwp1[
k] + 0.5*a1*dwm1[
k])/(2.0*a0 + a1);
388 dwm[
k] = -(a1*dwm1[
k] + 0.5*a0*dwp1[
k])/(2.0*a1 + a0);
393 #if RECONSTRUCTION == PARABOLIC
398 dvp[nv] = vppm4[
i][nv] - v[
i][nv];
399 dvm[nv] = vppm4[i-1][nv] - v[
i][nv];
413 for (k = 0; k <
NVAR; k++){
414 dwp[
k] =
MINMOD(dwp[k], dwp1[k]);
415 dwm[
k] =
MINMOD(dwm[k], -dwm1[k]);
420 cm = (hm[
i] + 1.0)/(hp[
i] - 1.0);
421 cp = (hp[
i] + 1.0)/(hm[
i] - 1.0);
425 #if PARABOLIC_LIM == 0 || PARABOLIC_LIM == 2
426 for (k = 0; k <
NVAR; k++){
427 if (dwp[k]*dwm[k] >= 0.0) dwm[
k] = dwp[
k] = 0.0;
429 if (fabs(dwp[k]) >= cm*fabs(dwm[k])) dwp[k] = -cm*dwm[k];
430 else if (fabs(dwm[k]) >= cp*fabs(dwp[k])) dwm[k] = -cp*dwp[k];
444 for (nv = 0; nv <
NFLX; nv++) {
446 for (k = 0; k <
NFLX; k++){
447 dp += dwp[
k]*R[nv][
k];
448 dm += dwm[
k]*R[nv][
k];
454 for (nv = NFLX; nv <
NVAR; nv++){
465 for (nv = 0; nv <
NVAR; nv++) {
466 #if PARABOLIC_LIM == 1 || PARABOLIC_LIM == 2
467 if (dvp[nv]*dvm[nv] >= 0.0) dvp[nv] = dvm[nv] = 0.0;
469 if (fabs(dvp[nv]) >= cm*fabs(dvm[nv])) dvp[nv] = -cm*dvm[nv];
470 else if (fabs(dvm[nv]) >= cp*fabs(dvp[nv])) dvm[nv] = -cp*dvp[nv];
473 vp[
i][nv] = v[
i][nv] + dvp[nv];
474 vm[
i][nv] = v[
i][nv] + dvm[nv];
483 if (vp[i][
RHO] < 0.0 || vm[i][
RHO] < 0.0) {
490 if (vp[i][PRS] < 0.0 || vm[i][PRS] < 0.0) {
491 dvp[PRS] = 0.5*(
MINMOD(dvF[i][PRS], dvF[i-1][PRS]));
492 dvm[PRS] = - dvp[PRS];
493 vp[
i][PRS] = v[
i][PRS] + dvp[PRS];
494 vm[
i][PRS] = v[
i][PRS] + dvm[PRS];
498 #if PHYSICS == RHD || PHYSICS == RMHD
509 for (i = beg-1; i <= end; i++) {
518 #if TIME_STEPPING == CHARACTERISTIC_TRACING
double ** v
Cell-centered primitive varables at the base time level, v[i] = .
void VelocityLimiter(double *, double *, double *)
void ConvertTo4vel(double **, int, int)
void Flatten(const State_1D *, int, int, Grid *)
void print1(const char *fmt,...)
void PrimEigenvectors(double *q, double cs2, double h, double *lambda, double **LL, double **RR)
void CharTracingStep(const State_1D *, int, int, Grid *)
void PPM_CoefficientsGet(PPM_Coeffs *ppm_coeffs, int dir)
double g_dt
The current integration time step.
double ** vR
Primitive variables to the right of the interface, .
#define FLAG_MINMOD
Reconstruct using MINMOD limiter.
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)
int g_dir
Specifies the current sweep or direction of integration.
double ** lambda
Characteristic speed associated to Lp and Rp.
void ConvertTo3vel(double **, int, int)
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.
void PrimToCons(double **uprim, double **ucons, int ibeg, int iend)
double * bn
Face magentic field, bn = bx(i+1/2)
double ** um
same as vm, in conservative vars
double ** vL
Primitive variables to the left of the interface, .
double * a2
Sound speed squared.
double ** up
same as vp, in conservative vars
#define ARRAY_2D(nx, ny, type)
void States(const State_1D *state, int beg, int end, Grid *grid)
double *** Rp
Left and right primitive eigenvectors.
#define QUIT_PLUTO(e_code)