Exemplo n.º 1
0
    def minimise_system_energy(L, m_init):
        N = 16  # discretisation in one dimension
        cubesize = 100e-9  # cube edge length (m)
        cellsize = cubesize/N  # discretisation in all three dimensions.
        lex = cubesize/L  # exchange length.

        Km = 1e6  # magnetostatic energy density (J/m**3)
        Ms = np.sqrt(2*Km/mm.consts.mu0)  # magnetisation saturation (A/m)
        A = 0.5 * mm.consts.mu0 * Ms**2 * lex**2  # exchange energy constant
        K = 0.1*Km  # Uniaxial anisotropy constant
        u = (0, 0, 1)  # Uniaxial anisotropy easy-axis

        p1 = (0, 0, 0)  # Minimum sample coordinate.
        p2 = (cubesize, cubesize, cubesize)  # Maximum sample coordinate.
        cell = (cellsize, cellsize, cellsize)  # Discretisation.
        region = df.Region(p1=p1, p2=p2)
        mesh = df.Mesh(region=region, cell=cell)

        system = mm.System(name=name)
        system.energy = (mm.Exchange(A=A) + mm.UniaxialAnisotropy(K=K, u=u) +
                         mm.Demag())
        system.m = df.Field(mesh, dim=3, value=m_init, norm=Ms)

        md = calculator.MinDriver()
        md.drive(system)

        calculator.delete(system)

        return system
Exemplo n.º 2
0
    def test_demag_pbc(self):
        name = 'demag_pbc'

        Ms = 1e6

        system = mm.System(name=name)
        system.energy = mm.Demag()

        md = self.calculator.MinDriver()

        # 1D pbc
        mesh = df.Mesh(region=self.region, cell=self.cell, bc='x')
        system.m = df.Field(mesh, dim=3, value=(0, 0, 1), norm=Ms)

        md.drive(system)

        # 2D pbc
        mesh = df.Mesh(region=self.region, cell=self.cell, bc='xy')
        system.m = df.Field(mesh, dim=3, value=(0, 0, 1), norm=Ms)

        with pytest.raises(ValueError):
            md.drive(system)

        # 3D pbc
        mesh = df.Mesh(region=self.region, cell=self.cell, bc='xyz')
        system.m = df.Field(mesh, dim=3, value=(0, 0, 1), norm=Ms)

        with pytest.raises(ValueError):
            md.drive(system)

        self.calculator.delete(system)
Exemplo n.º 3
0
    def test_exchange_dmi_zeeman_uniaxialanisotropy_demag(self):
        name = 'exchange_dmi_zeeman_uniaxialanisotropy'

        mesh = df.Mesh(region=self.region,
                       cell=self.cell,
                       subregions=self.subregions)

        # Very weak DMI and strong Zeeman to make the final
        # magnetisation uniform.
        A = {'r1': 1e-12, 'r2': 3e-12, 'r1:r2': 2e-12}
        D = {'r1': 1e-9, 'r2': 0, 'r1:r2': 5e-9}  # Very weak DMI
        H = df.Field(mesh, dim=3, value=(1e12, 0, 0))
        K = 1e6
        u = (1, 0, 0)
        Ms = 1e5

        system = mm.System(name=name)
        system.energy = mm.Exchange(A=A) + \
            mm.DMI(D=D, crystalclass='Cnv') + \
            mm.UniaxialAnisotropy(K=K, u=u) + \
            mm.Zeeman(H=H) + \
            mm.Demag()
        system.m = df.Field(mesh, dim=3, value=(1, 0.3, 0), norm=Ms)

        md = self.calculator.MinDriver()
        md.drive(system)

        value = system.m(mesh.region.random_point())
        assert np.linalg.norm(np.subtract(value, (Ms, 0, 0))) < 1

        self.calculator.delete(system)
    def setup(self):
        A = 1e-12
        self.exchange = mm.Exchange(A=A)
        H = (0, 0, 1.2e6)
        self.zeeman = mm.Zeeman(H=H)
        K1 = 1e4
        K2 = 3e2
        u = (0, 1, 0)
        self.uniaxialanisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u)
        self.demag = mm.Demag()
        D = 1e-3
        crystalclass = 't'
        self.dmi = mm.DMI(D=D, crystalclass=crystalclass)
        K1 = 5e6
        u1 = (0, 0, 1)
        u2 = (0, 1, 0)
        self.cubicanisotropy = mm.CubicAnisotropy(K1=K1, u1=u1, u2=u2)

        self.terms = [
            self.exchange, self.zeeman, self.uniaxialanisotropy, self.demag,
            self.dmi, self.cubicanisotropy
        ]

        self.invalid_terms = [
            1, 2.5, 0, 'abc', [3, 7e-12], [self.exchange, self.zeeman]
        ]
Exemplo n.º 5
0
    def test_set_hamiltonian_with_zero(self):
        system = mm.System()
        system.hamiltonian = mm.Exchange(1e-12) + mm.Demag()
        assert isinstance(system.hamiltonian, mm.Hamiltonian)
        assert len(system.hamiltonian.terms) == 2

        system.hamiltonian = 0
        assert isinstance(system.hamiltonian, mm.Hamiltonian)
        assert len(system.hamiltonian.terms) == 0
Exemplo n.º 6
0
    def test_init(self):
        system = mm.System(name="test_sim")

        assert isinstance(system.hamiltonian, mm.Hamiltonian)
        assert system.hamiltonian.terms == []

        system.hamiltonian = mm.Exchange(1e-12) + mm.Demag()
        assert len(system.hamiltonian.terms)

        assert isinstance(system.dynamics, mm.Dynamics)
        assert system.dynamics.terms == []

        assert system.name == "test_sim"
Exemplo n.º 7
0
    def test_repr_latex_(self):
        demag = mm.Demag()
        latex = demag._repr_latex_()

        # Assert some characteristics of LaTeX string.
        assert isinstance(latex, str)
        assert latex[0] == latex[-1] == '$'
        assert r'\mu_{0}' in latex
        assert r'\mathbf{H}_\text{d}' in latex
        assert r'\mathbf{m}' in latex
        assert r'\cdot' in latex
        assert r'M_\text{s}' in latex
        assert r'\frac{1}{2}' in latex
Exemplo n.º 8
0
def test_skyrmion(calculator):
    name = 'skyrmion'

    Ms = 1.1e6
    A = 1.6e-11
    D = 4e-3
    K = 0.51e6
    u = (0, 0, 1)
    H = (0, 0, 2e5)

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

    system = mm.System(name=name)
    system.energy = (mm.Exchange(A=A) + mm.DMI(D=D, crystalclass='Cnv') +
                     mm.UniaxialAnisotropy(K=K, u=u) + mm.Demag() +
                     mm.Zeeman(H=H))

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

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

    system.m = df.Field(mesh, dim=3, value=m_init, norm=Ms_fun)

    md = calculator.MinDriver()
    md.drive(system)

    # Check the magnetisation at the sample centre.
    value = system.m((0, 0, 0))
    assert value[2] / Ms < -0.97

    # Check the magnetisation at the sample edge.
    value = system.m((50e-9, 0, 0))
    assert value[2] / Ms > 0.5

    self.calculator.delete(system)
Exemplo n.º 9
0
    def setup(self):
        name = 'compute_tests'
        p1 = (0, 0, 0)
        p2 = (10e-9, 2e-9, 2e-9)
        cell = (2e-9, 2e-9, 2e-9)
        region = df.Region(p1=p1, p2=p2)
        mesh = df.Mesh(region=region, cell=cell)

        self.system = mm.System(name=name)
        self.system.energy = (
            mm.Exchange(A=1e-12) + mm.Demag() + mm.Zeeman(H=(8e6, 0, 0)) +
            mm.UniaxialAnisotropy(K=1e4, u=(0, 0, 1)) +
            mm.CubicAnisotropy(K=1e3, u1=(1, 0, 0), u2=(0, 1, 0)))

        self.system.m = df.Field(mesh, dim=3, value=(0, 0, 1), norm=8e6)
Exemplo n.º 10
0
    def test_demag_asymptotic_radius(self):
        name = 'demag_asymptotic_radius'

        Ms = 1e6

        system = mm.System(name=name)
        system.energy = mm.Demag(asymptotic_radius=6)

        system.m = df.Field(self.mesh, dim=3, value=(0, 0, 1), norm=Ms)

        md = self.calculator.MinDriver()
        md.drive(system)

        # Check if it runs. Tests to be added here.

        self.calculator.delete(system)
Exemplo n.º 11
0
def test_stdprob5(calculator):
    name = 'stdprob5'

    # Geometry
    lx = 100e-9  # x dimension of the sample(m)
    ly = 100e-9  # y dimension of the sample (m)
    lz = 10e-9  # sample thickness (m)

    # Material (permalloy) parameters
    Ms = 8e5  # saturation magnetisation (A/m)
    A = 1.3e-11  # exchange energy constant (J/m)

    # Dynamics (LLG + ZhangLi equation) parameters
    gamma0 = 2.211e5  # gyromagnetic ratio (m/As)
    alpha = 0.1  # Gilbert damping
    ux = -72.35  # velocity in x direction
    beta = 0.05  # non-adiabatic STT parameter

    system = mm.System(name=name)
    p1 = (0, 0, 0)
    p2 = (lx, ly, lz)
    cell = (5e-9, 5e-9, 5e-9)
    region = df.Region(p1=p1, p2=p2)
    mesh = df.Mesh(region=region, cell=cell)
    system.energy = mm.Exchange(A=A) + mm.Demag()

    def m_vortex(pos):
        x, y, z = pos[0] / 1e-9 - 50, pos[1] / 1e-9 - 50, pos[2] / 1e-9
        return (-y, x, 10)

    system.m = df.Field(mesh, dim=3, value=m_vortex, norm=Ms)

    md = calculator.MinDriver()
    md.drive(system)

    system.dynamics += (mm.Precession(gamma0=gamma0) +
                        mm.Damping(alpha=alpha) + mm.ZhangLi(u=ux, beta=beta))

    td = calculator.TimeDriver()
    td.drive(system, t=8e-9, n=100)

    mx = system.table.data['mx'].values

    assert -0.35 < mx.min() < -0.30
    assert -0.03 < mx.max() < 0

    calculator.delete(system)
    def setup(self):
        self.exchange = mm.Exchange(A=1e-12)
        self.zeeman = mm.Zeeman(H=(0, 0, 1.2e6))
        self.uniaxialanisotropy = mm.UniaxialAnisotropy(K=1e4, u=(0, 1, 0))
        self.demag = mm.Demag()
        self.dmi = mm.DMI(D=1e-3, crystalclass='T')
        self.cubicanisotropy = mm.CubicAnisotropy(K={
            'r1': 1e6,
            'r2': 5e6
        },
                                                  u1=(0, 0, 1),
                                                  u2=(0, 1, 0))

        self.terms = [
            self.exchange, self.zeeman, self.uniaxialanisotropy, self.demag,
            self.dmi, self.cubicanisotropy
        ]

        self.invalid_terms = [1, 2.5, 0, 'abc', [3, 7e-12], [self.exchange, 2]]
Exemplo n.º 13
0
def test_stdprob4(calculator):
    name = 'stdprob4'

    L, d, th = 500e-9, 125e-9, 3e-9  # (m)
    cell = (5e-9, 5e-9, 3e-9)  # (m)
    p1 = (0, 0, 0)
    p2 = (L, d, th)
    region = df.Region(p1=p1, p2=p2)
    mesh = df.Mesh(region=region, cell=cell)

    Ms = 8e5  # (A/m)
    A = 1.3e-11  # (J/m)

    system = mm.System(name=name)
    system.energy = mm.Exchange(A=A) + mm.Demag()

    gamma0 = 2.211e5  # (m/As)
    alpha = 0.02
    system.dynamics = mm.Precession(gamma0=gamma0) + mm.Damping(alpha=alpha)

    system.m = df.Field(mesh, dim=3, value=(1, 0.25, 0.1), norm=Ms)

    md = calculator.MinDriver()
    md.drive(system)  # updates system.m in-place

    H = (-24.6e-3 / mm.consts.mu0, 4.3e-3 / mm.consts.mu0, 0)
    system.energy += mm.Zeeman(H=H)

    td = calculator.TimeDriver()
    td.drive(system, t=1e-9, n=200)

    t = system.table.data['t'].values
    my = system.table.data['my'].values

    assert abs(min(t) - 5e-12) < 1e-20
    assert abs(max(t) - 1e-9) < 1e-20

    # Eye-norm test.
    assert 0.7 < max(my) < 0.8
    assert -0.5 < min(my) < -0.4

    calculator.delete(system)
    def test_init_valid_args(self):
        system = mm.System()
        check_system(system)
        assert len(system.energy) == 0
        assert len(system.dynamics) == 0
        assert system.m is None
        assert system.T == 0
        assert system.name == 'unnamed'  # Default value

        system.energy = mm.Exchange(A=1e-12) + mm.Demag()
        check_system(system)
        assert len(system.energy) == 2

        system.dynamics = mm.Precession(gamma0=2.21e5) + mm.Damping(alpha=1)
        check_system(system)
        assert len(system.dynamics) == 2

        system.m = self.m
        system.T = 5
        check_system(system)
 def test_init_valid_arg(self):
     term = mm.Demag()
     check_term(term)
     assert term.name == 'demag'
     assert re.search(r'^Demag\(.*\)$', repr(term))
Exemplo n.º 16
0
 def test_script(self):
     demag = mm.Demag()
     with pytest.raises(NotImplementedError):
         script = demag._script
Exemplo n.º 17
0
 def test_repr(self):
     demag = mm.Demag()
     assert repr(demag) == 'Demag(name=\'demag\')'
Exemplo n.º 18
0
 def test_name(self):
     demag = mm.Demag()
     assert demag.name == 'demag'