94 static double ***
eta[3];
110 static int first_call = 1;
111 double *dx1, *dx2, *dx3;
112 double *r, *rp, *th, *thp;
113 double ***Bx1, ***Bx2, ***Bx3;
114 double ***Jx1, ***Jx2, ***Jx3;
115 double dx1_Bx2 = 0.0, dx2_Bx1 = 0.0;
116 double dx2_Bx3 = 0.0, dx3_Bx2 = 0.0;
117 double dx1_Bx3 = 0.0, dx3_Bx1 = 0.0;
118 double d12, d21, d13, d31, d23, d32;
120 static double ***a23Bx3, ***a13Bx3, ***a12Bx2;
140 #if DIMENSIONS == 2 && COMPONENTS == 3
144 EXPAND(Bx1 = d->
Vc[
BX1]; ,
167 #if GEOMETRY == CYLINDRICAL && COMPONENTS == 3
169 #elif GEOMETRY == POLAR && COMPONENTS >= 2
171 #elif GEOMETRY == SPHERICAL
184 #if GEOMETRY == CYLINDRICAL
189 #elif GEOMETRY == POLAR
194 #elif GEOMETRY == SPHERICAL
199 a12Bx2[
k][
j][
i] = Bx2[
k][
j][
i]*r[
i]; ,
200 a13Bx3[
k][
j][
i] = Bx3[
k][
j][
i]*r[
i];
201 a23Bx3[
k][
j][
i] = Bx3[
k][
j][
i]*sin(th[j]); )
219 for (k = 0; k <
NX3_TOT-KOFFSET; k++){
220 for (j = 0; j <
NX2_TOT-JOFFSET; j++){
221 for (i = 0; i <
NX1_TOT-IOFFSET; i++){
224 d21 = d23 = 1.0/dx2[
j]; ,
225 d31 = d32 = 1.0/dx3[
k];)
229 d13 = 2.0/(fabs(r[i+1])*r[i+1] - fabs(r[i])*r[
i]);
230 #elif GEOMETRY == POLAR
233 d12 = 2.0/(fabs(r[i+1])*r[i+1] - fabs(r[i])*r[
i]);
234 #elif GEOMETRY == SPHERICAL
236 d21 /= rp[
i]; d23 /= r[
i]*sin(thp[j]); ,
237 d32 /= r[
i]*sin(thp[j]); d31 /= rp[
i]*sin(th[j]);)
246 ComputeStaggeredEta(d, grid);
268 d12 = d13 = 1.0/dx1[
i];
269 d21 = d23 = 1.0/dx2[
j];
270 d31 = d32 = 1.0/dx3[
k];
272 #if GEOMETRY == CYLINDRICAL
274 d13 = 2.0/(fabs(r[i+1])*r[i+1] - fabs(r[i])*r[
i]);
275 #elif GEOMETRY == POLAR
276 d23 = d21 = 1.0/(rp[
i]*dx2[
j]);
277 d12 = 2.0/(fabs(r[i+1])*r[i+1] - fabs(r[i])*r[
i]);
278 #elif GEOMETRY == SPHERICAL
279 h3 = rp[
i]*sin(th[j]);
281 D_EXPAND(d12 = 1.0/(rp[i]*dx1[i]); d13 = 1.0/(rp[
i]*dx1[
i]); ,
282 d21 = 1.0/(rp[
i]*dx2[
j]); d23 = 1.0/(h3*dx2[
j]); ,
283 d32 = 1.0/(h3*dx3[
k]); d31 = 1.0/(h3*dx3[
k]);)
289 Jx1[
k][
j][
i] = (dx2_Bx3 - dx3_Bx2);
292 dx1_Bx3 =
FDIFF_X1(a13Bx3,k,j,i)*d13;
293 Jx2[
k][
j][
i] = (dx3_Bx1 - dx1_Bx3);
296 dx1_Bx2 =
FDIFF_X1(a12Bx2,k,j,i)*d12;
298 Jx3[
k][
j][
i] = (dx1_Bx2 - dx2_Bx1);
301 }
else if (dir ==
JDIR){
312 d12 = d13 = 1.0/dx1[
i];
313 d21 = d23 = 1.0/dx2[
j];
314 d31 = d32 = 1.0/dx3[
k];
316 #if GEOMETRY == CYLINDRICAL
318 d13 = 1.0/(r[
i]*dx1[
i]);
319 #elif GEOMETRY == POLAR
320 d23 = d21 = 1.0/(r[
i]*dx2[
j]);
321 d12 = 1.0/(r[
i]*dx1[
i]);
322 #elif GEOMETRY == SPHERICAL
323 h3 = r[
i]*sin(thp[j]);
327 D_EXPAND(d12 = 1.0/(r[i]*dx1[i]); d13 = 1.0/(r[
i]*dx1[
i]); ,
328 d21 = 1.0/(r[
i]*dx2[
j]); d23 = 1.0/(h3*dx2[
j]); ,
329 d32 = 1.0/(h3*dx3[
k]); d31 = 1.0/(h3*dx3[
k]);)
333 dx2_Bx3 =
FDIFF_X2(a23Bx3,k,j,i)*d23;
335 Jx1[
k][
j][
i] = (dx2_Bx3 - dx3_Bx2);
339 Jx2[
k][
j][
i] = (dx3_Bx1 - dx1_Bx3);
343 Jx3[
k][
j][
i] = (dx1_Bx2 - dx2_Bx1);
346 }
else if (dir ==
KDIR) {
357 d12 = d13 = 1.0/dx1[
i];
358 d21 = d23 = 1.0/dx2[
j];
359 d31 = d32 = 1.0/dx3[
k];
361 #if GEOMETRY == POLAR
362 d23 = d21 = 1.0/(rp[
i]*dx2[
j]);
363 d12 = 1.0/(rp[
i]*dx1[
i]);
364 #elif GEOMETRY == SPHERICAL
365 h3 = r[
i]*sin(th[j]);
367 D_EXPAND(d12 = 1.0/(r[i]*dx1[i]); d13 = 1.0/(r[
i]*dx1[
i]); ,
368 d21 = 1.0/(r[
i]*dx2[
j]); d23 = 1.0/(h3*dx2[
j]); ,
369 d32 = 1.0/(h3*dx3[
k]); d31 = 1.0/(h3*dx3[
k]);)
375 Jx1[
k][
j][
i] = (dx2_Bx3 - dx3_Bx2);
379 Jx2[
k][
j][
i] = (dx3_Bx1 - dx1_Bx3);
383 Jx3[
k][
j][
i] = (dx1_Bx2 - dx2_Bx1);
392 void ComputeStaggeredEta(
const Data *d,
Grid *grid)
406 double Js[3], etas[3], vs[
NVAR];
407 double ***Jx1, ***Jx2, ***Jx3;
408 double *x1, *x2, *x3;
409 double *x1r, *x2r, *x3r;
421 for (k = 0; k <
NX3_TOT-KOFFSET; k++){
422 for (j = 0; j <
NX2_TOT-JOFFSET; j++){
423 for (i = 0; i <
NX1_TOT-IOFFSET; i++){
436 #elif COMPONENTS == 3
462 if (k > 0 || KOFFSET == 0){
double **** Vs
The main four-index data array used for face-centered staggered magnetic fields.
#define FDIFF_X2(b, k, j, i)
int jb
Lower corner index in the x2 direction.
double **** J
Electric current defined as curl(B).
void GetCurrent(const Data *d, int dir, Grid *grid)
#define FDIFF_X1(b, k, j, i)
#define AVERAGE_YZ(q, k, j, i)
#define CDIFF_X2(b, k, j, i)
#define BOX_LOOP(B, k, j, i)
long int NX2_TOT
Total number of zones in the X2 direction (boundaries included) for the local processor.
double **** Vc
The main four-index data array used for cell-centered primitive variables.
int kb
Lower corner index in the x3 direction.
#define ARRAY_3D(nx, ny, nz, type)
int ib
Lower corner index in the x1 direction.
#define FDIFF_X3(b, k, j, i)
#define TOT_LOOP(k, j, i)
long int NX3_TOT
Total number of zones in the X3 direction (boundaries included) for the local processor.
#define AVERAGE_XY(q, k, j, i)
void Resistive_eta(double *v, double x1, double x2, double x3, double *J, double *eta)
#define CDIFF_X1(b, k, j, i)
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;)
int ie
Upper corner index in the x1 direction.
int ke
Upper corner index in the x3 direction.
int je
Upper corner index in the x2 direction.
#define AVERAGE_XZ(q, k, j, i)
#define CDIFF_X3(b, k, j, i)
long int NX1_TOT
Total number of zones in the X1 direction (boundaries included) for the local processor.