# Spin-polarised current driven skyrmion¶

Author: Marijan Beg, Weiwei Wang

Date: 30 July 2016

In this tutorial, a single magnetic skyrmion is driven by a spin-polarised current.

Firstly, we define a function which will be subsequently used for plotting the z component of magnetisation.

In [1]:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

def plot_magnetisation(m, mesh, title=None):
m.shape = (-1, 3)
mx = m[:, 0]
my = m[:, 1]
mz = m[:, 2]
nx, ny = mesh.nx, mesh.ny
mx.shape = (ny, nx)
my.shape = (ny, nx)
mz.shape = (ny, nx)

#plt.imshow(mz, extent=extent)
#plt.xlabel('x (nm)')
#plt.ylabel('y (nm)')

fig = plt.figure(figsize=(8,8))
plt.axes().set_aspect('equal')
plt.quiver(mx[::3,::3], my[::3,::3], mz[::3,::3], pivot='mid', alpha=0.9, scale=18, width=0.005,  cmap=plt.get_cmap('jet'), edgecolors='None' )
if title is not None:
plt.title(title)
plt.xticks([])
plt.yticks([])
plt.show()


Now, we create a finite difference mesh.

In [2]:

from fidimag.micro import Sim
from fidimag.common import CuboidMesh
from fidimag.micro import Zeeman, Demag, DMI, UniformExchange

mesh = CuboidMesh(nx=51, ny=30, nz=1, dx=2.5, dy=2.5, dz=2, unit_length=1e-9, periodicity=(True, True, False))


We create a simulation object that contains uniform exchange, DMI, and Zeeman energy contributions.

In [3]:

# PYTEST_VALIDATE_IGNORE_OUTPUT
Ms = 8.6e5  # magnetisation saturation (A/m)
A = 1.3e-11  # exchange stiffness (J/m)
D = 4e-3  # DMI constant (J/m**2)
H = (0, 0, 3.8e5)  # external magnetic field (A/m)
alpha = 0.5  # Gilbert damping
gamma = 2.211e5  # gyromagnetic ratio (m/As)

sim  = Sim(mesh)  # create simulation object

# Set parameters.
sim.Ms = Ms
sim.driver.alpha = alpha
sim.driver.gamma = gamma
sim.driver.do_precession = False



In order to get a skyrmion as a relaxed state, we need to initialise the system in an appropriate way. For that, we use the following function, and plot the initial state.

In [4]:

def m_initial(coord):
# Extract x and y coordinates.
x = coord[0]
y = coord[1]

# The centre of the circle
x_centre = 15*2.5
y_centre = 15*2.5

r = ((x-x_centre)**2 + (y-y_centre)**2)**0.5

if r < 8.0:
return (0, 0, -1)
else:
return (0, 0, 1)

sim.set_m(m_initial)


Now, we can relax the system, save and plot the relaxed state.

In [5]:

%%capture
sim.driver.relax(dt=1e-13, stopping_dmdt=0.1, max_steps=5000, save_m_steps=None, save_vtk_steps=None)
np.save('m0.npy', sim.spin)

In [6]:

plot_magnetisation(sim.spin.copy(), mesh, title='t=0 ns')


Using the obtained relaxed state, we create a new smulation object and specify the driver to be ‘llg_stt’. By applying a spin-polarised current of $$J = 5 \times 10^{12} \,\text{A/m}^{2}$$ in the $$x$$ directions with $$\beta = 0.2$$, we move a skyrmion in the simulated sample.

In [7]:

# PYTEST_VALIDATE_IGNORE_OUTPUT
sim2  = Sim(mesh, driver='llg_stt')  # create simulation object

# Set parameters.
sim2.Ms = Ms
sim2.alpha = alpha
sim2.driver.gamma = gamma