Compute interface states using characteristic tracing step.
Tasks are numbered below.
1) Compute eigenvectors and eigenvalues if not yet defined.
2) Obtain characteristic variable increments dwp and dwm.
3) Initialize vp and vm to the reference state. Since this is somewhat arbitrary we use the value of CHTR_REF_STATE to select one of the following cases:
Passive scalars use always CHTR_REF_STATE == 2.
4) Compute left and right states in primitive variables. This step also depends on the value of CHTR_REF_STATE and include:
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++) {
221 NVAR_LOOP(nv) 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 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)
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)
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.