In [1]:
import magpy as mp
To create our model, we need to specify the geometry and material properties of the system. The units and purpose of each property is defined below.
| Name | Description | Units |
|---|---|---|
| Radius | The radius of the spherical particle | m |
| Anisotropy | Magnitude of the anisotropy | J/m$^3$ |
| Anisotropy axis | Unit vector indicating the direction of the anisotropy | - |
| Magnetisation | Saturation magnetisation of every particle in the cluster | A/m |
| Magnetisation direction | Unit vector indicating the initial direction of the magnetisation | - |
| Location | Location of the particle within the cluster | m |
| Damping | The damping constant of every particle in the cluster | - |
| Temperature | The ambient temperature of the cluster (fixed) | K |
Note: radius, anisotropy, anisotropy_axis, magnetisation_direction, and location vary for each particle and must be specified as a list.
In [2]:
single_particle = mp.Model(
radius = [12e-9],
anisotropy = [4e4],
anisotropy_axis = [[0., 0., 1.]],
magnetisation_direction = [[1., 0., 0.]],
location = [[0., 0., 0.]],
damping = 0.1,
temperature = 300.,
magnetisation = 400e3
)
A simulation in magpy consists of simulating the magnetisation vector of the particle in time. In the model above we specified the initial magnetisation vector along the $x$-axis and the anisotropy along the $z$-axis. Since it is energetically favourable for the magnetisation to align with its anisotropy axis, we should expect the magnetisation to move toward the $z$-axis. With some random fluctuations.
The simulate function is called with the following parameters:
end_time the length of the simulation in secondstime_step the time step of the integrator in secondsmax_samples in order to save memory, the output is down/upsampled as required. So if you simulate a billion steps, you can only save the state at 1000 regularly spaced intervals.seed for reproducible simulations you should always choose the seed.
In [3]:
results = single_particle.simulate(
end_time = 5e-9,
time_step = 1e-14,
max_samples=1000,
seed = 1001
)
The x,y,z components of the magnetisation can be visualised with the .plot() function.
In [4]:
results.plot()
Out[4]:
We can also access this data directly and plot it however we like! In this example, we normalise the magnetisation and plot it in 3d space.
In [5]:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
Ms = 400e3
time = results.time
mx = results.x[0] / Ms # particle 0
my = results.y[0] / Ms # particle 0
mz = results.z[0] / Ms # particle 0
fg = plt.figure()
ax = fg.add_subplot(111, projection='3d')
ax.plot3D(mx, my, mz)
Out[5]: