Spatially varying parameters


The main objective of this tutorial is to demonstrate how spatially varying parameters can be used to model and simulate different geometries and/or materials using JOOMMF.

Problem specification

The geometry is a cylinder with

  • radius \(r = 50 \,\text{nm}\) and
  • height \(h = 100 \,\text{nm}\).

The material parameters (similar to permalloy) are:

  • exchange energy constant \(A = 1.3 \times 10^{-11} \,\text{J/m}\),
  • magnetisation saturation \(M_\text{s} = 8 \times 10^{5} \,\text{A/m}\).

Magnetisation dynamics are governed by the Landau-Lifshitz-Gilbert equation

\[\frac{d\mathbf{m}}{dt} = \underbrace{-\gamma_{0}(\mathbf{m} \times \mathbf{H}_\text{eff})}_\text{precession} + \underbrace{\alpha\left(\mathbf{m} \times \frac{d\mathbf{m}}{dt}\right)}_\text{damping}\]

where \(\gamma_{0} = 2.211 \times 10^{5} \,\text{m}\,\text{A}^{-1}\,\text{s}^{-1}\) and Gilbert damping \(\alpha=0.5\).

We are interested in computing the equlibrium magnetisation state starting from the uniform magnetisation in the \((1, 1, 1)\) direction.


In the first step, we import the required discretisedfield and oommfc modules.

In [1]:
import oommfc as oc
import discretisedfield as df

We need to define the rectangular finite difference mesh that can contain the entire sphere.

In [2]:
L = 100e-9  # mesh edge length (m)
d = 5e-9  # discretisation cell (m)
mesh = oc.Mesh(p1=(0, 0, 0), p2=(L, L, L), cell=(d, d, d))

To illustrate the mesh and discretisation cell:

In [3]:
%matplotlib inline

As usual, we create the system object and define its Hamiltonian and dynamics equation.

In [4]:
#System object
system = oc.System(name="cylinder")

# Hamiltonian
A = 1.3e-11  # exchange energy constant (J/m)
H = (0, 0, 0.2e-3/oc.mu0)  # external magnetic field (A/m)
system.hamiltonian = oc.Exchange(A) + oc.Demag() + oc.Zeeman(H)

# Dynamics
gamma = 2.211e5
alpha = 0.5
system.dynamics = oc.Precession(gamma) + oc.Damping(alpha)

The Hamiltonian and dynamics equation are:

In [5]:
$\mathcal{H}=A (\nabla \mathbf{m})^{2}-\frac{1}{2}\mu_{0}M_\text{s}\mathbf{m} \cdot \mathbf{H}_\text{d}-\mu_{0}M_\text{s} \mathbf{m} \cdot \mathbf{H}$
In [6]:
$\frac{\partial \mathbf{m}}{\partial t}=-\gamma_{0}^{*} \mathbf{m} \times \mathbf{H}_\text{eff}+\alpha \mathbf{m} \times\frac{\partial \mathbf{m}}{\partial t}$

Defining cylinder geometry

In order to define cylinder geometry inside the rectangular mesh, we can define the saturation magnetisation function (we name it Ms_function), which depending on the position inside mesh \(pos = (x, y, z)\) returns \(M_\text{s}\) if the point is inside the culinder and \(0\) otherwise:

\[\begin{split}M_\text{s} = \begin{cases} 8 \times 10^{5}, & \sqrt{x^{2} + y^{2}} \leq 50\,\text{nm} \\ 0, & \sqrt{x^{2} + y^{2}} > 50\,\text{nm}. \\ \end{cases}\end{split}\]
In [7]:
import math

def Ms_function(pos):
    x, y, z = pos
    r = math.sqrt((x-L/2)**2 + (y-L/2)**2)
    if r <= 50e-9:
        return 8e5
        return 0

Having the function defining the sphere geometry, we can now create the initial magnetisation field. The value of field should be the inital magnetisation \((1, 0, 0)\) and the norm should be the saturation magnetisation function we just created.

In [8]:
system.m = df.Field(mesh, value=(1, 1, 1), norm=Ms_function)

We can plot the initial magnetisation by slicing the cylinder geometry perpendicular to “z” and “x” axes.

In [9]:

Relaxing the magnetisation

After we defined all requited parameters of the system, we can relax the system using MinDriver.

In [10]:
td = oc.MinDriver()
2017/9/25 14:41: Calling OOMMF (cylinder/cylinder.mif) ... [1.9s]

And plot the magnetisation in the same slices as before.

In [11]: