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.