PLUTO
vec_pot_diff.c
Go to the documentation of this file.
1 /* ///////////////////////////////////////////////////////////////////// */
2 /*!
3  \file
4  \brief Compute magnetic field from vector potential.
5 
6  The function VectorPotentialDiff() computes either staggered or
7  cell-center magnetic field components by suitable central differencing
8  of the vector potential, \f$ \vec{B} = \nabla\times\vec{A} \f$.
9  - In Cartesian geometry:
10  \f[
11  B_x = \pd{A_z}{y} - \pd{A_y}{z} \,,\quad
12  B_y = \pd{A_x}{z} - \pd{A_z}{x} \,,\quad
13  B_z = \pd{A_y}{x} - \pd{A_x}{y}
14  \f]
15 
16  - In cylindrical geometry:
17  \f[
18  B_R = \frac{1}{R}\pd{A_z}{\phi} - \pd{A_\phi}{z} \,,\quad
19  B_z = \frac{1}{R}\left(\pd{(RA_\phi)}{R} - \pd{A_R}{\phi}\right)
20  \f]
21 
22  - In polar geometry:
23  \f[
24  B_R = \frac{1}{R}\pd{A_z}{\phi} - \pd{A_\phi}{z} \,,\quad
25  B_\phi = \pd{A_R}{z} - \pd{A_z}{R} \,,\quad
26  B_z = \frac{1}{R}\pd{(RA_\phi)}{R} - \frac{1}{R}\pd{A_R}{\phi}
27  \f]
28 
29  - In spherical geometry:
30  \f[
31  B_r = \frac{1}{r\sin\theta}\pd{(\sin\theta A_\phi)}{\theta}
32  - \frac{1}{r\sin\theta}\pd{A_\theta}{\phi} \,,\quad
33  B_\theta = \frac{1}{r\sin\theta}\pd{A_r}{\phi}
34  - \frac{1}{r}\pd{(rA_\phi)}{r} \,,\quad
35  B_\phi = \frac{1}{r}\pd{(rA_\theta)}{r}
36  - \frac{1}{r}\pd{A_r}{\theta}
37  \f]
38 
39  For cell-centered MHD vector potential is compute at the cell-center.
40  In the case of staggered MHD, the position of A is edge-centered and
41  it is shown below:
42  \verbatim
43  ______________________
44  / /|
45  / / |
46  / z face / |
47  / Ax |
48  / / |
49  / / Az
50  ----------Ay----------- |
51  | | |
52  | | y |
53  | | face |
54  | | /
55  Az x face Az /
56  | | Ax
57  | | /
58  | | /
59  | |/
60  ----------Ay-----------
61  \endverbatim
62 
63 
64  \authors A. Mignone (mignone@ph.unito.it)\n
65  P. Tzeferacos (petros.tzeferacos@ph.unito.it)
66  \date Sep 24, 2012
67 */
68 /* ///////////////////////////////////////////////////////////////////// */
69 #include "pluto.h"
70 
71 #if PHYSICS == MHD || PHYSICS == RMHD
72 /* ********************************************************************* */
73 void VectorPotentialDiff (double *b, int i, int j, int k, Grid *grid)
74 /*!
75  * Assign face- or cell-centered magnetic field by differentiating
76  * the vector potential.
77  *
78  * \param [out] b array of magnetic field starting at 0,
79  * \f$ B_{x_1} = b[0]\,, B_{x_2} = b[1]\,, B_{x_3} = b[2] \f$
80  * \param [in] i the cell index in the first coordinate direction
81  * \param [in] j the cell index in the first coordinate direction
82  * \param [in] k the cell index in the first coordinate direction
83  * \param [in] grid pointer to an array of Grid structures
84  *
85  *********************************************************************** */
86 {
87  int l_convert;
88  double dx1, x1, x1p, x1m;
89  double dx2, x2, x2p, x2m;
90  double dx3, x3, x3p, x3m;
91  double bx, by, bz, br, bphi, bth;
92  double us_p[256], us_m[256];
93  double r_2;
94  double x1f, x2f, x3f; /* point at which magnetic field is desired */
95 
96  x1 = grid[IDIR].x[i];
97  x2 = grid[JDIR].x[j];
98  x3 = grid[KDIR].x[k];
99 
100  dx1 = grid[IDIR].dx[i];
101  dx2 = grid[JDIR].dx[j];
102  dx3 = grid[KDIR].dx[k];
103 
104  #ifdef STAGGERED_MHD
105  x1p = grid[IDIR].xr[i]; x1m = grid[IDIR].xl[i];
106  x2p = grid[JDIR].xr[j]; x2m = grid[JDIR].xl[j];
107  x3p = grid[KDIR].xr[k]; x3m = grid[KDIR].xl[k];
108  x1f = grid[IDIR].xr[i]; /* for staggered MHD, we compute magnetic */
109  x2f = grid[JDIR].xr[j]; /* field at face centers */
110  x3f = grid[KDIR].xr[k];
111 
112  #else
113  x1p = grid[IDIR].x[i] + dx1; x1m = grid[IDIR].x[i] - dx1;
114  x2p = grid[JDIR].x[j] + dx2; x2m = grid[JDIR].x[j] - dx2;
115  x3p = grid[KDIR].x[k] + dx3; x3m = grid[KDIR].x[k] - dx3;
116  x1f = grid[IDIR].x[i]; /* for cell-centered MHD, we compute magnetic */
117  x2f = grid[JDIR].x[j]; /* field at cell-centers */
118  x3f = grid[KDIR].x[k];
119 
120  dx1 = 2.*grid[IDIR].dx[i]; /* redefine the spacing between cell-centers */
121  dx2 = 2.*grid[JDIR].dx[j];
122  dx3 = 2.*grid[KDIR].dx[k];
123  #endif
124 
125  #if GEOMETRY == CARTESIAN
126 
127  /* ---- assign bx at i_f, j, k ---- */
128 
129  Init (us_p, x1f, x2p, x3);
130  Init (us_m, x1f, x2m, x3);
131 
132  bx = (us_p[AX3] - us_m[AX3])/dx2;
133 
134  #if DIMENSIONS == 3
135  Init (us_p, x1f, x2, x3p);
136  Init (us_m, x1f, x2, x3m);
137 
138  bx -= (us_p[AX2] - us_m[AX2])/dx3;
139  #endif
140 
141  /* ---- assign by at i, j_f, k ---- */
142 
143  Init (us_p, x1p, x2f, x3);
144  Init (us_m, x1m, x2f, x3);
145 
146  by = -(us_p[AX3] - us_m[AX3])/dx1;
147 
148  #if DIMENSIONS == 3
149  Init (us_p, x1, x2f, x3p);
150  Init (us_m, x1, x2f, x3m);
151 
152  by += (us_p[AX1] - us_m[AX1])/dx3;
153  #endif
154 
155  /* ---- assign bz at i, j, k_f ---- */
156 
157  Init (us_p, x1p, x2, x3f);
158  Init (us_m, x1m, x2, x3f);
159 
160  bz = (us_p[AX2] - us_m[AX2])/dx1;
161 
162  Init (us_p, x1, x2p, x3f);
163  Init (us_m, x1, x2m, x3f);
164 
165  bz -= (us_p[AX1] - us_m[AX1])/dx2;
166 
167  b[0] = bx; b[1] = by; b[2] = bz;
168 
169  #elif GEOMETRY == CYLINDRICAL /* -- only 2D -- */
170 
171  /* ---- assign br at i_f, j, k ---- */
172 
173  Init (us_p, x1f, x2p, x3);
174  Init (us_m, x1f, x2m, x3);
175 
176  br = - (us_p[AX3] - us_m[AX3])/dx2;
177 
178  /* ---- assign bz at i, j_f, k ---- */
179 
180  Init (us_p, x1p, x2f, x3);
181  Init (us_m, x1m, x2f, x3);
182 
183  bz = (x1p*us_p[AX3] - x1m*us_m[AX3])/(x1*dx1);
184 
185  /* ---- assign bphi at i, j, k ---- */ /* -- Only non STAG-- */
186 
187  #ifdef STAGGERED_MHD
188  bphi = 0.0;
189  #else
190  Init (us_p, x1, x2p, x3);
191  Init (us_m, x1, x2m, x3);
192 
193  bphi = (us_p[AX1] - us_m[AX1])/dx2;
194 
195  Init (us_p, x1p, x2, x3);
196  Init (us_m, x1m, x2, x3);
197 
198  bphi -= (us_p[AX2] - us_m[AX2])/dx1;
199  #endif
200 
201  b[0] = br; b[1] = bz; b[2] = bphi;
202 
203  #elif GEOMETRY == POLAR
204 
205  /* ---- assign br at i_f, j, k ---- */
206 
207  Init (us_p, x1f, x2p, x3);
208  Init (us_m, x1f, x2m, x3);
209 
210  br = (us_p[AX3] - us_m[AX3])/(x1f*dx2);
211 
212  Init (us_p, x1f, x2, x3p);
213  Init (us_m, x1f, x2, x3m);
214 
215  br -= (us_p[AX2] - us_m[AX2])/dx3;
216 
217  /* ---- assign bphi at i, j_f, k ---- */
218 
219  Init (us_p, x1p, x2f, x3);
220  Init (us_m, x1m, x2f, x3);
221 
222  bphi = -(us_p[AX3] - us_m[AX3])/dx1;
223 
224  #if DIMENSIONS == 3
225  Init (us_p, x1, x2f, x3p);
226  Init (us_m, x1, x2f, x3m);
227 
228  bphi += (us_p[AX1] - us_m[AX1])/dx3;
229  #endif
230 
231  /* ---- assign bz at i, j, k_f ---- */
232 
233  Init (us_p, x1p, x2, x3f);
234  Init (us_m, x1m, x2, x3f);
235 
236  bz = (x1p*us_p[AX2] - x1m*us_m[AX2])/(x1*dx1);
237 
238  Init (us_p, x1, x2p, x3f);
239  Init (us_m, x1, x2m, x3f);
240 
241  bz -= (us_p[AX1] - us_m[AX1])/(x1*dx2);
242 
243  b[0] = br; b[1] = bphi; b[2] = bz;
244 
245  #elif GEOMETRY == SPHERICAL
246 
247  /* ---- assign br at i_f, j, k ---- */
248 
249  Init (us_p, x1f, x2p, x3);
250  Init (us_m, x1f, x2m, x3);
251 
252  br = (sin(x2p)*us_p[AX3] - sin(x2m)*us_m[AX3])/(x1f*(cos(x2m) - cos(x2p)));
253 
254  #if DIMENSIONS == 3
255  Init (us_p, x1f, x2, x3p);
256  Init (us_m, x1f, x2, x3m);
257 
258  br -= 1.0/(x1f*sin(x2)*dx3)*(us_p[AX2] - us_m[AX2]);
259  #endif
260 
261  /* ---- assign btheta at i, j_f, k ---- */
262 
263  Init (us_p, x1p, x2f, x3);
264  Init (us_m, x1m, x2f, x3);
265 
266  bth = - (x1p*us_p[AX3] - x1m*us_m[AX3])/(x1*dx1);
267 
268  #if DIMENSIONS == 3
269  Init (us_p, x1, x2f, x3p);
270  Init (us_m, x1, x2f, x3m);
271 
272  bth += (us_p[AX1] - us_m[AX1])/(x1*sin(x2f)*dx3);
273  #endif
274 
275  /* ---- assign bphi at i, j, k_f ---- */
276 
277  bphi = 0.0;
278 
279  Init (us_p, x1p, x2, x3f);
280  Init (us_m, x1m, x2, x3f);
281 
282  bphi = (x1p*us_p[AX2] - x1m*us_m[AX2])/(x1*dx1);
283 
284  Init (us_p, x1, x2p, x3f);
285  Init (us_m, x1, x2m, x3f);
286 
287  bphi -= (us_p[AX1] - us_m[AX1])/(x1*dx2);
288 
289  b[0] = br; b[1] = bth; b[2] = bphi;
290 
291  #endif
292 
293 }
294 #endif /* PHYSICS == MHD || PHYSICS == RMHD */
double * xr
Definition: structs.h:81
#define AX2
Definition: mod_defs.h:86
double * dx
Definition: structs.h:83
#define KDIR
Definition: pluto.h:195
double * xl
Definition: structs.h:82
#define IDIR
Definition: pluto.h:193
Definition: structs.h:78
#define AX3
Definition: mod_defs.h:87
int j
Definition: analysis.c:2
int k
Definition: analysis.c:2
double * x
Definition: structs.h:80
PLUTO main header file.
void Init(double *, double, double, double)
Definition: init.c:17
int i
Definition: analysis.c:2
#define AX1
Definition: mod_defs.h:85
void VectorPotentialDiff(double *, int, int, int, Grid *)
#define JDIR
Definition: pluto.h:194