Spatially varying parameters 2#

In this notebook, one data point from Figure 2 in Beg et al. Stable and manipulable Bloch point. Scientific Reports, 9, 7959 (2019) is simulated.

We need to relax a \(150 \,\text{nm}\) disk, which consists of two layers with different sign of Dzyaloshinskii-Moriya constant \(D\). The bottom layer with \(D<0\) has \(20 \,\text{nm}\) thickness, whereas the top layer with \(D>0\) has \(10 \,\text{nm}\) thickness. We start by importing the necessary modules and creating the mesh with two regions.

[1]:
import oommfc as mc
import discretisedfield as df
import micromagneticmodel as mm

d = 150e-9
hb = 20e-9
ht = 10e-9
cell = (5e-9, 5e-9, 2.5e-9)
subregions = {
    "r1": df.Region(p1=(-d / 2, -d / 2, -hb), p2=(d / 2, d / 2, 0)),
    "r2": df.Region(p1=(-d / 2, -d / 2, 0), p2=(d / 2, d / 2, ht)),
}
p1 = (-d / 2, -d / 2, -hb)
p2 = (d / 2, d / 2, ht)
mesh = df.Mesh(p1=p1, p2=p2, cell=cell, subregions=subregions)

The mesh domain and the discretisation cells are:

[2]:
mesh.mpl(figsize=(10, 10))
../../_images/examples_notebooks_spatially-varying-parameters2_3_0.png

and the two regions we defined are:

[3]:
mesh.mpl.subregions(figsize=(10, 10))
../../_images/examples_notebooks_spatially-varying-parameters2_5_0.png

Now, we need to define the system object, and by setting magnetisation saturation, set the geometry to be a disk.

[4]:
system = mm.System(name="bloch_point")

D = {"r1": 1.58e-3, "r2": -1.58e-3, "r1:r2": 1.58e-9}
Ms = 3.84e5
A = 8.78e-12


def Ms_fun(point):
    x, y, z = point
    if x**2 + y**2 <= (d / 2) ** 2:
        return Ms
    else:
        return 0


system.energy = mm.Exchange(A=A) + mm.DMI(D=D, crystalclass="T") + mm.Demag()
system.m = df.Field(mesh, nvdim=3, value=(0, 0, 1), norm=Ms_fun, valid="norm")

Our sample is now:

[5]:
system.m.norm.sel("z").mpl()
../../_images/examples_notebooks_spatially-varying-parameters2_9_0.png

Now, we can minimise the system’s energy by using MinDriver.

[6]:
md = mc.MinDriver()
md.drive(system)
Running OOMMF (ExeOOMMFRunner)[2023/10/23 16:07]... (0.8 s)

The out-of-plane magnetisation component (\(m_{z}\)) is now:

[7]:
system.m.z.sel("z").mpl(scalar_kw={"colorbar_label": "$m_z$"})
../../_images/examples_notebooks_spatially-varying-parameters2_13_0.png

We can see that two vortices with different orientation emerged. We can inspect this closer by plotting an hv plot of the magnetisation as follows:

[8]:
system.m.hv(kdims=["x", "y"])
[8]:

The slider can be utilized to view magnetisation configuration at different z values. We can now plot another cross section and see that the Bloch point emerged.

[9]:
system.m.sel("y").mpl(scalar_kw={"colorbar_label": "$m_y$"}, figsize=(15, 10))
../../_images/examples_notebooks_spatially-varying-parameters2_17_0.png