29 #define eps_UCT_CONTACT 1.e-6
30 #define EX(k,j,i) (vz[k][j][i]*By[k][j][i] - vy[k][j][i]*Bz[k][j][i])
31 #define EY(k,j,i) (vx[k][j][i]*Bz[k][j][i] - vz[k][j][i]*Bx[k][j][i])
32 #define EZ(k,j,i) (vy[k][j][i]*Bx[k][j][i] - vx[k][j][i]*By[k][j][i])
110 for (i = beg; i <= end; i++) {
116 #if CT_EMF_AVERAGE == UCT_CONTACT
124 #if CT_EMF_AVERAGE == UCT_HLL
129 #if CT_EMF_AVERAGE == RIEMANN_2D
131 state->dff_flx[
i][
BX2]);
139 for (j = beg; j <= end; j++) {
152 #if CT_EMF_AVERAGE == UCT_HLL
157 #if CT_EMF_AVERAGE == RIEMANN_2D
160 state->dff_flx[
j][
BX1]);
167 for (k = beg; k <= end; k++) {
172 #if CT_EMF_AVERAGE == UCT_CONTACT
179 #if CT_EMF_AVERAGE == UCT_HLL
191 #if CT_EMF_AVERAGE == UCT_HLL
216 double ***vx, ***vy, ***vz;
217 double ***
Bx, ***By, ***Bz;
224 #if RESISTIVITY == SUPER_TIME_STEPPING
230 emf.
ez[
k][
j][
i] = 0.0;
232 CT_AddResistiveEMF(d, grid);
252 #if CT_EMF_AVERAGE == UCT_HLL
263 #if CT_EMF_AVERAGE == ARITHMETIC || CT_EMF_AVERAGE == RIEMANN_2D
267 #elif CT_EMF_AVERAGE == UCT_CONTACT
271 for (k = emf.
kbeg; k <= emf.
kend; k++){
272 for (j = emf.
jbeg; j <= emf.
jend; j++){
273 for (i = emf.
ibeg; i <= emf.
iend; i++){
275 emf.
ex[
k][
j][
i] *= 0.25;
276 emf.
ey[
k][
j][
i] *= 0.25;
278 emf.
ez[
k][
j][
i] *= 0.25;
281 #elif CT_EMF_AVERAGE == UCT_HLL
288 #elif CT_EMF_AVERAGE == UCT0
296 for (k = emf.
kbeg; k <= emf.
kend + KOFFSET; k++){
297 for (j = emf.
jbeg; j <= emf.
jend + JOFFSET; j++){
298 for (i = emf.
ibeg; i <= emf.
iend + IOFFSET; i++){
305 emf.
exj[
k][
j][
i] -= 0.5*(
EX(k,j,i) +
EX(k,j+1,i));
306 emf.
exk[
k][
j][
i] -= 0.5*(
EX(k,j,i) +
EX(k+1,j,i));
308 emf.
eyi[
k][
j][
i] -= 0.5*(
EY(k,j,i) +
EY(k,j,i+1));
309 emf.
eyk[
k][
j][
i] -= 0.5*(
EY(k,j,i) +
EY(k+1,j,i));
313 emf.
ezi[
k][
j][
i] -= 0.5*(
EZ(k,j,i) +
EZ(k,j,i+1));
314 emf.
ezj[
k][
j][
i] -= 0.5*(
EZ(k,j,i) +
EZ(k,j+1,i));
320 print1 (
"! CT_GetEMF: unknown EMF average.\n");
330 #if RESISTIVITY == EXPLICIT
331 CT_AddResistiveEMF(d, grid);
359 #if RESISTIVITY != NO
361 void CT_AddResistiveEMF (
const Data *d,
Grid *grid)
372 double ***vx, ***vy, ***vz;
373 double ***
Bx, ***By, ***Bz;
380 eta = GetStaggeredEta();
382 for (k = emf.
kbeg; k <= emf.
kend; k++){
383 for (j = emf.
jbeg; j <= emf.
jend; j++){
384 for (i = emf.
ibeg; i <= emf.
iend; i++){
420 #undef eps_UCT_CONTACT
void CT_StoreEMF(const State_1D *state, int beg, int end, Grid *grid)
double **** Vs
The main four-index data array used for face-centered staggered magnetic fields.
void CT_GetStagSlopes(const Data_Arr b, EMF *emf, Grid *grid)
double **** J
Electric current defined as curl(B).
double ** flux
upwind flux computed with the Riemann solver
void print1(const char *fmt,...)
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.
EMF * CT_GetEMF(const Data *d, Grid *grid)
double * SR
Rightmost velocity in the Riemann fan at i+1/2.
void CT_EMF_ArithmeticAverage(const EMF *Z1, const double w)
Compute arithmetic average of EMF at cell edges.
#define ARRAY_3D(nx, ny, nz, type)
void CT_EMF_HLL_Solver(const Data *d, const EMF *emf, Grid *grid)
Solve 2D Riemann problem for induction equation.
int g_i
x1 grid index when sweeping along the x2 or x3 direction.
double *** ezi
Ez available at x-faces (i+1/2);.
#define TOT_LOOP(k, j, i)
int g_dir
Specifies the current sweep or direction of integration.
double *** exk
Ex available at z-faces (k+1/2);.
int g_j
x2 grid index when sweeping along the x1 or x3 direction.
double * SL
Leftmost velocity in the Riemann fan at i+1/2.
long int NX3_TOT
Total number of zones in the X3 direction (boundaries included) for the local processor.
void CT_EMF_CMUSCL_Average(const Data *d, const EMF *emf, Grid *grid)
–
int g_k
x3 grid index when sweeping along the x1 or x2 direction.
double *** eyi
Ey available at x-faces (i+1/2);.
void CT_StoreVelSlopes(EMF *emf, const State_1D *state, int beg, int end)
void CT_EMF_IntegrateToCorner(const Data *d, const EMF *emf, Grid *grid)
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;)
double *** eyk
Ey available at z-faces (k+1/2);.
int g_operatorStep
Gives the current operator step.
double *** ezj
Ez available at y-faces (j+1/2);.
double *** exj
Ex available at y-faces (j+1/2);.
#define QUIT_PLUTO(e_code)
long int NX1_TOT
Total number of zones in the X1 direction (boundaries included) for the local processor.