Visualize the field created by a pair of Helmoltz coils

Python source code: visualize_field.py

import numpy as np
from scipy import stats
from mayavi import mlab
# "import" our data from our previous script (the import actually runs
# the script and computes B)
from compute_field import B, X, Y, Z
###############################################################################
# Data massaging
# Reshape the data to put it in a form that can be fed in Mayavi
Bx = B[:, 0]
By = B[:, 1]
Bz = B[:, 2]
Bx = np.reshape(Bx, X.shape)
By = np.reshape(By, X.shape)
Bz = np.reshape(Bz, X.shape)
Bnorm = np.sqrt(Bx**2 + By**2 + Bz**2)
# Threshold, to avoid the very high values
Bmax = stats.scoreatpercentile(Bnorm.ravel(), 99)
Bx[Bnorm > Bmax] = Bmax * (Bx / Bnorm)[Bnorm > Bmax]
By[Bnorm > Bmax] = Bmax * (By / Bnorm)[Bnorm > Bmax]
Bz[Bnorm > Bmax] = Bmax * (Bz / Bnorm)[Bnorm > Bmax]
Bnorm[Bnorm > Bmax] = Bmax
###############################################################################
# Visualization proper
# Create a mayavi figure black on white
mlab.figure(bgcolor=(0., 0., 0.), fgcolor=(1., 1., 1.), size=(640, 480))
# Create a vector_field: a data source that we can slice and dice
field = mlab.pipeline.vector_field(X, Y, Z, Bx, By, Bz,
scalars=Bnorm,
name='B field')
# Plot the vectors
vectors = mlab.pipeline.vectors(field,
scale_factor=abs(X[0, 0, 0] - X[1, 1, 1]),
colormap='hot')
mlab.axes()
# Mask 7 data points out of 8
vectors.glyph.mask_input_points = True
vectors.glyph.mask_points.on_ratio = 8
mlab.pipeline.vector_cut_plane(field, scale_factor=.1, colormap='hot')
# Add an iso_surface of the norm of the field
mlab.pipeline.iso_surface(mlab.pipeline.extract_vector_norm(field),
contours=[0.1*Bmax, 0.4*Bmax],
opacity=0.5, transparent=True)
mlab.view(28, 84, 0.71)
mlab.savefig('visualize_field.png')