62 double r, th, r_1, s_1;
63 double dtdl, dtdV, dt_rdr;
64 double *inv_dl, inv_dl2;
65 double *rp, *A, *du, **vh, *C, **tc_flx;
68 static double **res_flx;
69 static double **dcoeff, ***
T;
70 static double **ViF, **ViS;
74 double max_inv_dtp[3],inv_dtp;
99 #if ADD_RESISTIVITY && (defined STAGGERED_MHD)
108 TOT_LOOP(k,j,i) T[k][j][i] = V[PRS][k][j][i]/V[
RHO][k][j][i];
110 tc_flx = state.tc_flux;
113 max_inv_dtp[0] = max_inv_dtp[1] = max_inv_dtp[2] = 0.0;
122 #if ADD_RESISTIVITY && !(defined STAGGERED_MHD)
143 ITOT_LOOP (i) for (nv =
NVAR; nv--; ) vh[i][nv] = V[nv][k][j][i];
145 for (nv = NVAR; nv--; ) dvm[nv] = vh[1][nv] - vh[0][nv];
147 for (nv = NVAR; nv--; ) {
148 dvp[nv] = vh[i+1][nv] - vh[
i][nv];
150 state.
vp[
i][nv] = vh[
i][nv] + 0.5*dvl;
151 state.
vm[
i][nv] = vh[
i][nv] - 0.5*dvl;
165 inv_dl2 = 0.5*inv_dl[
i]*inv_dl[
i];
167 C[
MX1] = (dcoeff[i-1][
MX1] + dcoeff[
i][
MX1])*inv_dl2;
170 EXPAND(C[
BX1] = (dcoeff[i-1][
BX1] + dcoeff[i][
BX1])*inv_dl2; ,
171 C[
BX2] = (dcoeff[i-1][
BX2] + dcoeff[
i][
BX2])*inv_dl2; ,
172 C[
BX3] = (dcoeff[i-1][
BX3] + dcoeff[
i][
BX3])*inv_dl2;)
175 C[ENG] = (dcoeff[i-1][ENG] + dcoeff[i][ENG])*inv_dl2;
176 inv_dtp = dcoeff[
i][ENG]*inv_dl[
i]*inv_dl[
i];
204 r_1 = 1.0/grid[
IDIR].
x[
i];
205 #if GEOMETRY == CARTESIAN
206 EXPAND(du[
MX1] = (ViF[i][
MX1] - ViF[i-1][
MX1])*dtdl + dt*ViS[i][
MX1];,
207 du[
MX2] = (ViF[
i][
MX2] - ViF[i-1][
MX2])*dtdl + dt*ViS[i][
MX2];,
208 du[
MX3] = (ViF[
i][
MX3] - ViF[i-1][
MX3])*dtdl + dt*ViS[i][
MX3];)
210 du[ENG] += (ViF[i][ENG] - ViF[i - 1][ENG])*dtdl;
212 #elif GEOMETRY == CYLINDRICAL
213 EXPAND(du[
MX1] = (A[i]*ViF[i][
MX1] - A[i-1]*ViF[i-1][
MX1])*dtdV
215 du[
MX2] = (A[
i]*ViF[
i][
MX2] - A[i-1]*ViF[i-1][
MX2])*dtdV
217 du[
MX3] = (A[
i]*A[
i]*ViF[
i][
MX3] - A[i-1]*A[i-1]*ViF[i-1][
MX3])*r_1*dtdV;)
219 du[ENG] += (A[i]*ViF[i][ENG] - A[i-1]*ViF[i-1][ENG])*dtdV;
221 #elif GEOMETRY == POLAR
222 EXPAND(du[
MX1] = (A[i]*ViF[i][
MX1] - A[i-1]*ViF[i-1][
MX1])*dtdV
224 du[
MX2] = (A[
i]*A[
i]*ViF[
i][
MX2] - A[i-1]*A[i-1]*ViF[i-1][
MX2])*r_1*dtdV; ,
225 du[
MX3] = (A[
i]*ViF[
i][
MX3] - A[i-1]*ViF[i-1][
MX3])*dtdV
228 du[ENG] += (A[i]*ViF[i][ENG] - A[i-1]*ViF[i-1][ENG])*dtdV;
230 #elif GEOMETRY == SPHERICAL
231 EXPAND(du[
MX1] = (A[i]*ViF[i][
MX1] - A[i-1]*ViF[i-1][
MX1])*dtdV
233 du[
MX2] = (A[
i]*ViF[
i][
MX2] - A[i-1]*ViF[i-1][
MX2])*dtdV
235 du[
MX3] = (rp[
i]*A[
i]*ViF[
i][
MX3] - rp[i-1]*A[i-1]*ViF[i-1][
MX3])*r_1*dtdV;)
237 du[ENG] += (A[i]*ViF[i][ENG] - A[i-1]*ViF[i-1][ENG])*dtdV;
247 #if GEOMETRY == CARTESIAN
250 du[
BX2] = -(res_flx[
i][
BX2] - res_flx[i-1][
BX2])*dtdl; ,
251 du[
BX3] = -(res_flx[
i][
BX3] - res_flx[i-1][
BX3])*dtdl; )
253 du[ENG] += -(res_flx[i][ENG] - res_flx[i-1][ENG])*dtdl;
256 #elif GEOMETRY == CYLINDRICAL
259 du[
BX2] = -(A[
i]*res_flx[
i][
BX2] - A[i-1]*res_flx[i-1][
BX2])*dtdV; ,
260 du[
BX3] = -(res_flx[
i][
BX3] - res_flx[i-1][
BX3])*dtdl;)
262 du[ENG] += -(A[i]*res_flx[i][ENG] - A[i-1]*res_flx[i-1][ENG])*dtdV;
265 #elif GEOMETRY == POLAR
268 du[
BX2] = -(res_flx[
i][
BX2] - res_flx[i-1][
BX2])*dtdl; ,
269 du[
BX3] = -(A[
i]*res_flx[
i][
BX3] - A[i-1]*res_flx[i-1][
BX3])*dtdV; )
271 du[ENG] += -(A[i]*res_flx[i][ENG] - A[i-1]*res_flx[i-1][ENG])*dtdV;
274 #elif GEOMETRY == SPHERICAL
278 du[
BX2] = -(rp[
i]*res_flx[
i][
BX2] - rp[i-1]*res_flx[i-1][
BX2])*dt_rdr; ,
279 du[
BX3] = -(rp[
i]*res_flx[
i][
BX3] - rp[i-1]*res_flx[i-1][
BX3])*dt_rdr; )
281 du[ENG] += -(A[i]*res_flx[i][ENG] - A[i-1]*res_flx[i-1][ENG])*dtdV;
291 #if GEOMETRY == CARTESIAN
292 du[ENG] += (tc_flx[
i][ENG] - tc_flx[i-1][ENG])*dtdl;
294 du[ENG] += (A[
i]*tc_flx[
i][ENG] - A[i-1]*tc_flx[i-1][ENG])*dtdV;
307 #if ADD_RESISTIVITY && !(defined STAGGERED_MHD)
327 JTOT_LOOP (j) for (nv = NVAR; nv--; ) vh[j][nv] = V[nv][k][j][i];
329 for (nv = NVAR; nv--; ) dvm[nv] = vh[1][nv] - vh[0][nv];
330 for(j = 1; j <
NX2_TOT-1; j++){
331 for (nv = NVAR; nv--; ) {
332 dvp[nv] = vh[j+1][nv] - vh[
j][nv];
334 state.
vp[
j][nv] = vh[
j][nv] + 0.5*dvl;
335 state.
vm[
j][nv] = vh[
j][nv] - 0.5*dvl;
349 inv_dl2 = 0.5*inv_dl[
j]*inv_dl[
j];
351 C[
MX1] += (dcoeff[j-1][
MX1] + dcoeff[
j][
MX1])*inv_dl2;
354 EXPAND(C[
BX1] += (dcoeff[j-1][
BX1] + dcoeff[j][
BX1])*inv_dl2; ,
355 C[
BX2] += (dcoeff[j-1][
BX2] + dcoeff[
j][
BX2])*inv_dl2; ,
356 C[
BX3] += (dcoeff[j-1][
BX3] + dcoeff[
j][
BX3])*inv_dl2;)
359 C[ENG] += (dcoeff[j-1][ENG] + dcoeff[j][ENG])*inv_dl2;
361 inv_dtp = dcoeff[
j][ENG]*inv_dl[
j]*inv_dl[
j];
378 #if GEOMETRY == POLAR || GEOMETRY == SPHERICAL
388 s_1 = 1.0/sin(grid[
JDIR].x[j]);
389 #if GEOMETRY != SPHERICAL
390 EXPAND(du[
MX1] += (ViF[j][
MX1] - ViF[j-1][
MX1])*dtdl + dt*ViS[j][
MX1];,
391 du[
MX2] += (ViF[
j][
MX2] - ViF[j-1][
MX2])*dtdl + dt*ViS[j][
MX2];,
392 du[
MX3] += (ViF[
j][
MX3] - ViF[j-1][
MX3])*dtdl + dt*ViS[j][
MX3];)
394 du[ENG] += (ViF[j][ENG] - ViF[j-1][ENG])*dtdl;
396 #elif GEOMETRY == SPHERICAL
397 EXPAND(du[
MX1] += (A[j]*ViF[j][
MX1] - A[j-1]*ViF[j-1][
MX1])*dtdV
399 du[
MX2] += (A[
j]*ViF[
j][
MX2] - A[j-1]*ViF[j-1][
MX2])*dtdV
401 du[
MX3] += (A[
j]*A[
j]*ViF[
j][
MX3] - A[j-1]*A[j-1]*ViF[j-1][
MX3])*s_1*dtdV;)
403 du[ENG] += (A[j]*ViF[j][ENG] - A[j-1]*ViF[j-1][ENG])*dtdV;
413 #if GEOMETRY != SPHERICAL
415 du[
BX1] -= (res_flx[j][
BX1] - res_flx[j-1][
BX1])*dtdl; ,
417 du[
BX3] -= (res_flx[
j][
BX3] - res_flx[j-1][
BX3])*dtdl; )
419 du[ENG] -= (res_flx[j][ENG] - res_flx[j-1][ENG])*dtdl;
421 #elif GEOMETRY == SPHERICAL
423 du[
BX1] -= (A[j]*res_flx[j][
BX1] - A[j-1]*res_flx[j-1][
BX1])*dtdV; ,
425 du[
BX3] -= (res_flx[
j][
BX3] - res_flx[j-1][
BX3])*dtdl;)
427 du[ENG] -= (A[j]*res_flx[j][ENG] - A[j-1]*res_flx[j-1][ENG])*dtdV;
437 #if GEOMETRY != SPHERICAL
438 du[ENG] += (tc_flx[
j][ENG] - tc_flx[j-1][ENG])*dtdl;
440 du[ENG] += (A[
j]*tc_flx[
j][ENG] - A[j-1]*tc_flx[j-1][ENG])*dtdV;
455 #if ADD_RESISTIVITY && !(defined STAGGERED_MHD)
475 KTOT_LOOP (k) for (nv = NVAR; nv--; ) vh[k][nv] = V[nv][k][j][i];
477 for (nv = NVAR; nv--; ) dvm[nv] = vh[1][nv] - vh[0][nv];
479 for (nv = NVAR; nv--; ) {
480 dvp[nv] = vh[k+1][nv]- vh[
k][nv];
482 state.
vp[
k][nv] = vh[
k][nv] + 0.5*dvl;
483 state.
vm[
k][nv] = vh[
k][nv] - 0.5*dvl;
497 inv_dl2 = 0.5*inv_dl[
k]*inv_dl[
k];
499 C[
MX1] += (dcoeff[k-1][
MX1] + dcoeff[
k][
MX1])*inv_dl2;
502 EXPAND(C[
BX1] += (dcoeff[k-1][
BX1] + dcoeff[k][
BX1])*inv_dl2; ,
503 C[
BX2] += (dcoeff[k-1][
BX2] + dcoeff[
k][
BX2])*inv_dl2; ,
504 C[
BX3] += (dcoeff[k-1][
BX3] + dcoeff[
k][
BX3])*inv_dl2;)
507 C[ENG] += (dcoeff[k-1][ENG] + dcoeff[k][ENG])*inv_dl2;
509 inv_dtp = dcoeff[
k][ENG]*inv_dl[
k]*inv_dl[
k];
527 #if GEOMETRY == SPHERICAL
536 du[
MX1] += (ViF[
k][
MX1] - ViF[k-1][
MX1])*dtdl + dt*ViS[k][
MX1];
537 du[
MX2] += (ViF[
k][
MX2] - ViF[k-1][
MX2])*dtdl + dt*ViS[k][
MX2];
538 du[
MX3] += (ViF[
k][
MX3] - ViF[k-1][
MX3])*dtdl + dt*ViS[k][
MX3];
540 du[ENG] += (ViF[
k][ENG] - ViF[k-1][ENG])*dtdl;
549 du[
BX1] -= (res_flx[
k][
BX1] - res_flx[k-1][
BX1])*dtdl;
550 du[
BX2] -= (res_flx[
k][
BX2] - res_flx[k-1][
BX2])*dtdl;
552 du[ENG] -= (res_flx[
k][ENG] - res_flx[k-1][ENG])*dtdl;
561 du[ENG] += (tc_flx[
k][ENG] - tc_flx[k-1][ENG])*dtdl;
582 th =
MAX(th, C_dtp[k][j][i][
MX1]);
585 EXPAND(th =
MAX(th, C_dtp[k][j][i][
BX1]); ,
586 th =
MAX(th, C_dtp[k][j][i][
BX2]); ,
587 th =
MAX(th, C_dtp[k][j][i][
BX3]);)
590 th =
MAX(th, C_dtp[k][j][i][ENG]);
592 #if INTERNAL_BOUNDARY == YES
594 for (nv = NVAR; nv--; ) dU[k][j][i][nv] = 0.0;
#define FLAG_INTERNAL_BOUNDARY
Zone belongs to an internal boundary region and should be excluded from being updated in time...
void ViscousFlux(Data_Arr, double **, double **, double **, int, int, Grid *)
double **** J
Electric current defined as curl(B).
void GetCurrent(const Data *d, int dir, Grid *grid)
void TC_Flux(double ***, const State_1D *, double **, int, int, Grid *)
long int NX2_TOT
Total number of zones in the X2 direction (boundaries included) for the local processor.
int g_intStage
Gives the current integration stage of the time stepping method (predictor = 0, 1st corrector = 1...
double **** Vc
The main four-index data array used for cell-centered primitive variables.
double * GetInverse_dl(const Grid *)
#define ARRAY_3D(nx, ny, nz, type)
unsigned char *** flag
Pointer to a 3D array setting useful integration flags that are retrieved during integration.
void MakeState(State_1D *)
double ** vp
prim vars at i+1/2 edge, vp[i] = vL(i+1/2)
int g_i
x1 grid index when sweeping along the x2 or x3 direction.
#define TOT_LOOP(k, j, i)
int g_dir
Specifies the current sweep or direction of integration.
int g_j
x2 grid index when sweeping along the x1 or x3 direction.
long int NX3_TOT
Total number of zones in the X3 direction (boundaries included) for the local processor.
#define ARRAY_4D(nx, ny, nz, nv, type)
long int IEND
Upper grid index of the computational domain in the the X1 direction for the local processor...
int g_k
x3 grid index when sweeping along the x1 or x2 direction.
double ** vm
prim vars at i-1/2 edge, vm[i] = vR(i-1/2)
D_EXPAND(tot/[n]=(double) grid[IDIR].np_int_glob;, tot/[n]=(double) grid[JDIR].np_int_glob;, tot/[n]=(double) grid[KDIR].np_int_glob;)
long int NMAX_POINT
Maximum number of points among the three directions, boundaries excluded.
long int KBEG
Lower grid index of the computational domain in the the X3 direction for the local processor...
#define ARRAY_2D(nx, ny, type)
long int KEND
Upper grid index of the computational domain in the the X3 direction for the local processor...
long int JBEG
Lower grid index of the computational domain in the the X2 direction for the local processor...
void ResistiveFlux(Data_Arr V, Data_Arr curlB, double **res_flux, double **dcoeff, int beg, int end, Grid *grid)
long int JEND
Upper grid index of the computational domain in the the X2 direction for the local processor...
long int NX1_TOT
Total number of zones in the X1 direction (boundaries included) for the local processor.
long int IBEG
Lower grid index of the computational domain in the the X1 direction for the local processor...
double * A
Right interface area, A[i] = .