irfpy.util.streamline
¶
Tracing a field to make a stream line
Code author: Yoshifumi Futaana
Any vector field, \(\mathbf{B}(x, y, z)\), is traced from a given point \((x_0, y_0, z_0)\).
See also the sample script at streamline_sample
.
- class irfpy.util.streamline.SimpleTracing(initpos, vector_field, dt)[source]¶
Bases:
object
Simple tracing
The differential equations are
\[dx = Bx(x, y, z) dt dy = By(x, y, z) dt dz = Bz(x, y, z) dt \]For numerical calculation, we use Runge-Kutta 4.
\[r_{i+1} = r_i + \frac{\Delta t}{6}(k_1 + 2k_2 + 2k_3 + k_4)\]where r denotes (x, y, z). Each coefficients are
\[k_1 = B(r_i) k_2 = B(r_i + \frac{\Delta t}{2}k_1) k_3 = B(r_i + \frac{\Delta t}{2}k_2) k_4 = B(r_i + \Delta t k_3)\]If one wants to backward trace, you may instance another object that gives -vector_field in the constructor.
An example is shown.
Assume a vector field as
\[Bx = x By = 0 Bz = \sqrt{x^2+z^2}\]The vector_field should be a function that returns a vector, i.e.,
>>> vfield = lambda p: np.array((p[0], 0, np.sqrt(p[0]**2+p[2]**2)))
The vector_field should take np.array, returning np.array() object.
>>> tracer = SimpleTracing([1, 0, 1], vfield, 0.001) >>> tracer.step_forward() >>> print(tracer.x, tracer.y, tracer.z, tracer.tlist[-1]) 1.0010005001667084 0.0 1.0014150674450009 0.001