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
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)
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] ]
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
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"
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
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)
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)
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)
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]]
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))
def test_script(self): demag = mm.Demag() with pytest.raises(NotImplementedError): script = demag._script
def test_repr(self): demag = mm.Demag() assert repr(demag) == 'Demag(name=\'demag\')'
def test_name(self): demag = mm.Demag() assert demag.name == 'demag'