Skyrmion in a disk#

In this tutorial, we compute and relax a skyrmion in an interfacial-DMI material in a confined disk like geometry.

import oommfc as oc
import discretisedfield as df
import micromagneticmodel as mm

We define mesh in cuboid through corner points p1 and p2, and discretisation cell size cell.

region = df.Region(p1=(-50e-9, -50e-9, 0), p2=(50e-9, 50e-9, 10e-9))
mesh = df.Mesh(region=region, cell=(5e-9, 5e-9, 5e-9))

The mesh we defined is:


Now, we can define the system object by first setting up the Hamiltonian:

system = mm.System(name='skyrmion') = (mm.Exchange(A=1.6e-11)
               + mm.DMI(D=4e-3, crystalclass='Cnv_z')
               + mm.UniaxialAnisotropy(K=0.51e6, u=(0, 0, 1))
               + mm.Demag()
               + mm.Zeeman(H=(0, 0, 2e5)))

Disk geometry is set up by defining the saturation magnetisation (norm of the magnetisation field). For that, we define a function:

Ms = 1.1e6

def Ms_fun(pos):
    """Function to set magnitude of magnetisation: zero outside cylindric shape,
    Ms inside cylinder.

    Cylinder radius is 50nm.

    x, y, z = pos
    if (x**2 + y**2)**0.5 < 50e-9:
        return Ms
        return 0

And the second function we need is the function to define the initial magnetisation which is going to relax to skyrmion.

def m_init(pos):
    """Function to set initial magnetisation direction:
    -z inside cylinder (r=10nm),
    +z outside cylinder.
    y-component to break symmetry.

    x, y, z = pos
    if (x**2 + y**2)**0.5 < 10e-9:
        return (0, 0, -1)
        return (0, 0, 1)

# create system with above geometry and initial magnetisation
system.m = df.Field(mesh, nvdim=3, value=m_init, norm=Ms_fun, valid='norm')

The geometry is now cylindrical:

system.m.norm.hv(kdims=['x', 'y'])

and the initial magnetsation is:

/home/mlang/miniconda3/envs/ubermagdev310/lib/python3.10/site-packages/matplotlib/ RuntimeWarning: divide by zero encountered in scalar divide
  length = a * (widthu_per_lenu / (self.scale * self.width))
/home/mlang/miniconda3/envs/ubermagdev310/lib/python3.10/site-packages/matplotlib/ RuntimeWarning: invalid value encountered in multiply
  length = a * (widthu_per_lenu / (self.scale * self.width))

Finally we can minimise the energy and plot the magnetisation.

# minimize the energy
md = oc.MinDriver()

# Plot relaxed configuration: vectors in z-plane
Running OOMMF (ExeOOMMFRunner)[2023/10/23 16:07]... (0.5 s)
# Plot z-component only:
system.m.hv(kdims=['x', 'y'])

Finally we can sample and plot the magnetisation along the line:

system.m.z.line(p1=(-49e-9, 0, 0), p2=(49e-9, 0, 0), n=20).mpl()