38 #define ROE_AVERAGE YES
39 #define CHECK_ROE_MATRIX NO
43 double *cmax,
Grid *grid)
61 double delta, delta_inv, gmm1, gmm1_inv;
62 #if ROE_AVERAGE == YES
65 double *ql, *qr, *uL, *uR;
66 static double **fL, **fR, *pL, *pR, *a2L, *a2R;
68 double bmin, bmax, scrh1;
72 delta_inv = 1.0/delta;
87 for (i =
NFLX; i--; ) {
88 for (j =
NFLX; j--; ) {
99 Flux (state->
uL, state->
vL, a2L, fL, pL, beg, end);
100 Flux (state->
uR, state->
vR, a2R, fR, pR, beg, end);
102 for (i = beg; i <= end; i++) {
107 #if SHOCK_FLATTENING == MULTID
121 &bmin - i, &bmax - i, i, i);
122 a =
MAX(fabs(bmin), fabs(bmax));
124 bmin =
MIN(0.0, bmin);
125 bmax =
MAX(0.0, bmax);
126 scrh = 1.0/(bmax - bmin);
127 for (nv =
NFLX; nv--; ){
128 state->
flux[
i][nv] = bmin*bmax*(uR[nv] - uL[nv])
129 + bmax*fL[i][nv] - bmin*fR[i][nv];
132 state->
press[
i] = (bmax*pL[
i] - bmin*pR[
i])*scrh;
142 for (nv =
NFLX; nv--; ) dv[nv] = qr[nv] - ql[nv];
144 #if ROE_AVERAGE == YES
145 s = sqrt(qr[
RHO]/ql[
RHO]);
150 EXPAND(um[
VX1] = s*ql[
VX1] + c*qr[
VX1]; ,
157 hl = 0.5*(EXPAND(ql[VX1]*ql[VX1], + ql[VX2]*ql[VX2], + ql[VX3]*ql[VX3]));
158 hl += a2L[
i]*gmm1_inv;
160 hr = 0.5*(EXPAND(qr[VX1]*qr[VX1], + qr[VX2]*qr[VX2], + qr[VX3]*qr[VX3]));
161 hr += a2R[
i]*gmm1_inv;
178 a2 = gmm1*(h - 0.5*
vel2);
182 for (nv =
NFLX; nv--; ) um[nv] = 0.5*(ql[nv] + qr[nv]);
187 vel2 = EXPAND(um[VX1]*um[VX1], + um[VX2]*um[VX2], + um[VX3]*um[VX3]);
188 h = 0.5*vel2 + a2/gmm1;
192 #if EOS == ISOTHERMAL
193 a2 = 0.5*(a2L[
i] + a2R[
i]);
205 lambda[nn] = um[
VXn] -
a;
207 eta[nn] = 0.5/a2*(dv[PRS] - dv[
VXn]*um[
RHO]*
a);
208 #elif EOS == ISOTHERMAL
213 EXPAND(Rc[
MXn][nn] = um[
VXn] - a; ,
217 Rc[ENG][nn] = h - um[
VXn]*a;
223 lambda[nn] = um[
VXn] +
a;
225 eta[nn] = 0.5/a2*(dv[PRS] + dv[
VXn]*um[
RHO]*
a);
226 #elif EOS == ISOTHERMAL
231 EXPAND(Rc[
MXn][nn] = um[
VXn] + a; ,
235 Rc[ENG][nn] = h + um[
VXn]*a;
242 lambda[nn] = um[
VXn];
243 eta[nn] = dv[
RHO] - dv[PRS]/a2;
245 EXPAND(Rc[
MX1][nn] = um[VX1]; ,
248 Rc[ENG][nn] = 0.5*vel2;
256 lambda[nn] = um[
VXn];
257 eta[nn] = um[
RHO]*dv[
VXt];
260 Rc[ENG][nn] = um[
VXt];
269 lambda[nn] = um[
VXn];
270 eta[nn] = um[
RHO]*dv[
VXb];
273 Rc[ENG][nn] = um[
VXb];
279 cmax[
i] = fabs(um[
VXn]) +
a;
292 scrh = fabs(ql[PRS] - qr[PRS]);
293 scrh /=
MIN(ql[PRS],qr[PRS]);
294 #elif EOS == ISOTHERMAL
295 scrh = fabs(ql[RHO] - qr[RHO]);
296 scrh /=
MIN(ql[RHO],qr[RHO]);
299 if (scrh > 0.5 && (qr[VXn] < ql[VXn])){
300 bmin =
MIN(0.0, lambda[0]);
301 bmax =
MAX(0.0, lambda[1]);
302 scrh1 = 1.0/(bmax - bmin);
303 for (nv =
NFLX; nv--; ){
304 state->
flux[
i][nv] = bmin*bmax*(uR[nv] - uL[nv])
305 + bmax*fL[i][nv] - bmin*fR[i][nv];
306 state->
flux[
i][nv] *= scrh1;
308 state->
press[
i] = (bmax*pL[
i] - bmin*pR[
i])*scrh1;
313 #if CHECK_ROE_MATRIX == YES
314 for (nv = 0; nv <
NFLX; nv++){
316 for (k = 0; k <
NFLX; k++){
317 for (j = 0; j <
NFLX; j++){
318 um[nv] += Rc[nv][
k]*(k==
j)*lambda[k]*eta[j];
321 for (nv = 0; nv <
NFLX; nv++){
322 scrh = fR[
i][nv] - fL[
i][nv] - um[nv];
323 if (nv ==
MXn) scrh += pR[
i] - pL[
i];
324 if (fabs(scrh) > 1.e-6){
325 print (
"! Matrix condition not satisfied %d, %12.6e\n", nv, scrh);
337 for (nv = NFLX; nv--; ) alambda[nv] = fabs(lambda[nv]);
341 if (alambda[0] <= delta) {
342 alambda[0] = 0.5*lambda[0]*lambda[0]/delta + 0.5*delta;
344 if (alambda[1] <= delta) {
345 alambda[1] = 0.5*lambda[1]*lambda[1]/delta + 0.5*delta;
348 for (nv = NFLX; nv--; ) {
349 state->
flux[
i][nv] = fL[
i][nv] + fR[
i][nv];
350 for (k = NFLX; k-- ; ) {
351 state->
flux[
i][nv] -= alambda[
k]*eta[
k]*Rc[nv][
k];
353 state->
flux[
i][nv] *= 0.5;
355 state->
press[
i] = 0.5*(pL[
i] + pR[
i]);
359 #undef CHECK_ROE_MATRIX
double ** flux
upwind flux computed with the Riemann solver
void Flux(double **u, double **w, double *a2, double **fx, double *p, int beg, int end)
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 g_maxMach
The maximum Mach number computed during integration.
void print(const char *fmt,...)
double ** uR
same as vR, in conservative vars
#define ARRAY_1D(nx, type)
void Show(double **, int)
long int NMAX_POINT
Maximum number of points among the three directions, boundaries excluded.
void HLL_Speed(double **vL, double **vR, double *a2L, double *a2R, double *SL, double *SR, int beg, int end)
double ** vL
Primitive variables to the left of the interface, .
double * press
Upwind pressure term computed with the Riemann solver.
#define FLAG_HLL
Use HLL Riemann solver.
#define ARRAY_2D(nx, ny, type)
void Roe_Solver(const State_1D *state, int beg, int end, double *cmax, Grid *grid)
double ** uL
same as vL, in conservative vars