Source code for spacepy.pybats.dipole
#!/usr/bin/env python
'''
Some functions for the generation of a dipole field.
Copyright 2010 Los Alamos National Security, LLC.
'''
import numpy as np
import math
import pylab as plt
[docs]
def b_mag(x,y):
'''
For a position *x*, *y* in units of planetary radius, return the
strength of the dipole magnetic field in nanoTesla.
'''
r = np.sqrt(x**2 + y**2)
cos = y/r
return 30400 * np.sqrt(1+3*cos**2)/r**3
[docs]
def b_hat(x, y):
'''
For given parameters, return two arrays, x and y, corresponding
to the x and y components of b_hat for a dipole field. Plotting these
two matrices using MatPlotLib's quiver function will create a beautiful
dipole field for tracing and other stuff.
'''
xgrid, ygrid = np.meshgrid(x,y)
r = np.sqrt(xgrid**2 + ygrid**2)
cos = ygrid/r
sin = xgrid/r
denom = np.sqrt(1.0 + 3.0*cos**2)
b_r = 2.0 * cos / denom
b_theta = sin / denom
b_x = b_r*sin + b_theta*cos
b_y = b_r*cos - b_theta*sin
return(b_x, b_y)
[docs]
def b_line(x, y, npoints=30):
'''For a starting X, Y point return x and y vectors that trace the dipole
field line that passes through the given point.'''
npoints = float(npoints)
r = np.sqrt(x**2 + y**2)
try:
theta = np.arctan(x/y)
except ZeroDivisionError:
theta = math.pi/2.0
R = r/(np.sin(theta)**2)
if x<0:
theta = np.arange(math.pi, 2.0*math.pi, math.pi/npoints)
else:
theta = np.arange(0, math.pi, math.pi/npoints)
r_vec = R * np.sin(theta)**2
x_out = r_vec * np.sin(theta)
y_out = r_vec * np.cos(theta)
return (x_out, y_out)
[docs]
def test():
'''
A quick test of the dipole field functions.
'''
x = np.arange(-100.0, 101.0, 5.0)
y = np.arange(-100.0, 101.0, 5.0)
x_vec, y_vec = b_hat(x,y)
fig = plt.figure(figsize=(10,8))
ax1 = plt.subplot('111')
ax1.quiver(x,y, x_vec, y_vec)
for i in range(-120, 121, 10):
(x,y) = b_line(float(i), 0.0, 100)
ax1.plot(x, y, 'b')
for theta in np.arange(math.pi/2.0, 3.0*math.pi/2.0, math.pi/100.0):
x = np.sin(theta)
y = np.cos(theta)
(x,y) = b_line(x, y, 100)
ax1.plot(x, y,'r')
ax1.set_xlim( [-100, 100] )
ax1.set_ylim( [-100, 100] )
plt.title('Unit vectors for an arbitrary dipole field')
fig.show()
if __name__ == '__main__':
test()