def test_init_invalid_args(self): for K, u in self.invalid_args: with pytest.raises((TypeError, ValueError)): term = mm.UniaxialAnisotropy(K=K, u=u) with pytest.raises(AttributeError): term = mm.UniaxialAnisotropy(wrong=1)
def test_repr(self): for K1, K2, u in self.valid_args: anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u) exp_str = ("UniaxialAnisotropy(K1={}, K2={}, u={}, " "name=\"{}\")").format(K1, K2, u, "uniaxialanisotropy") assert repr(anisotropy) == exp_str anisotropy = mm.UniaxialAnisotropy(1000, (0, 0, 1), name="test_name") assert repr(anisotropy) == ("UniaxialAnisotropy(K1=1000, K2=0, " "u=(0, 0, 1), name=\"test_name\")")
def test_repr(self): for K1, K2, u in self.valid_args: anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u) exp_str = ('UniaxialAnisotropy(K1={}, K2={}, u={}, ' 'name=\'{}\')').format(K1, K2, u, 'uniaxialanisotropy') assert repr(anisotropy) == exp_str anisotropy = mm.UniaxialAnisotropy(1000, (0, 0, 1), name='test_name') assert repr(anisotropy) == ('UniaxialAnisotropy(K1=1000, K2=0, ' 'u=(0, 0, 1), name=\'test_name\')')
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 test_field_vector(self): name = 'uniaxialanisotropy_field_vector' def value_fun(pos): x, y, z = pos if x <= 0: return 0 else: return 1e5 mesh = df.Mesh(region=self.region, cell=self.cell) K = df.Field(mesh, dim=1, value=value_fun) u = (0, 0, 1) Ms = 1e6 system = mm.System(name=name) system.energy = mm.UniaxialAnisotropy(K=K, u=u) system.m = df.Field(mesh, dim=3, value=(0, 0.3, 1), norm=Ms) md = self.calculator.MinDriver() md.drive(system) value = system.m((-2e-9, -2e-9, -2e-9)) assert np.linalg.norm(np.cross(value, (0, 0.3*Ms, Ms))) < 1e-3 value = system.m((2e-9, 2e-9, 2e-9)) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 self.calculator.delete(system)
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_scalar_field(self): name = 'uniaxialanisotropy_scalar_field' def value_fun(pos): x, y, z = pos if x <= 0: return (1, 0, 0) else: return (0, 1, 0) mesh = df.Mesh(region=self.region, cell=self.cell) K = 1e5 u = df.Field(mesh, dim=3, value=value_fun) Ms = 1e6 system = mm.System(name=name) system.energy = mm.UniaxialAnisotropy(K=K, u=u) system.m = df.Field(mesh, dim=3, value=(1, 1, 0), norm=Ms) md = self.calculator.MinDriver() md.drive(system) value = system.m((-2e-9, -2e-9, -2e-9)) assert np.linalg.norm(np.subtract(value, (Ms, 0, 0))) < 1e-3 value = system.m((2e-9, 2e-9, 2e-9)) assert np.linalg.norm(np.subtract(value, (0, Ms, 0))) < 1e-3 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_init_valid_args(self): for K, u in self.valid_args: term = mm.UniaxialAnisotropy(K=K, u=u) check_term(term) assert hasattr(term, 'K') assert hasattr(term, 'u') assert term.name == 'uniaxialanisotropy' assert re.search(r'^UniaxialAnisotropy\(K=.+, u=.+\)$', repr(term))
def test_init_valid_args(self): for K1, K2, u in self.valid_args: anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u) assert anisotropy.K1 == K1 assert anisotropy.K2 == K2 assert isinstance(anisotropy.K1, numbers.Real) assert isinstance(anisotropy.K2, numbers.Real) assert isinstance(anisotropy.u, (tuple, list, np.ndarray)) assert len(anisotropy.u) == 3 assert all([isinstance(i, numbers.Real) for i in anisotropy.u])
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_repr_latex(self): for K1, K2, u in self.valid_args: anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u) latex = anisotropy._repr_latex_() # Assert some characteristics of LaTeX string. assert isinstance(latex, str) assert latex[0] == latex[-1] == '$' assert 'K_{1}' in latex assert '\mathbf{u}' in latex assert '\mathbf{m}' in latex assert '^{2}' in latex assert '\cdot' in latex if K2 != 0: assert 'K_{2}' in latex assert '^{4}' in latex
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_scalar_vector(self): name = 'uniaxialanisotropy_scalar_vector' K = 1e5 u = (0, 0, 1) Ms = 1e6 system = mm.System(name=name) system.energy = mm.UniaxialAnisotropy(K=K, u=u) mesh = df.Mesh(region=self.region, cell=self.cell) system.m = df.Field(mesh, dim=3, value=(0, 0.3, 1), norm=Ms) md = self.calculator.MinDriver() md.drive(system) value = system.m(mesh.region.random_point()) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 self.calculator.delete(system)
def test_field_dict(self): name = 'uniaxialanisotropy_field_dict' def K_fun(pos): x, y, z = pos if -2e-9 <= x <= 2e-9: return 0 else: return 1e5 def u_fun(pos): x, y, z = pos if x <= 0: return (1, 0, 0) else: return (0, 1, 0) mesh = df.Mesh(region=self.region, cell=self.cell) K = df.Field(mesh, dim=1, value=K_fun) u = df.Field(mesh, dim=3, value=u_fun) Ms = 1e6 system = mm.System(name=name) system.energy = mm.UniaxialAnisotropy(K=K, u=u) system.m = df.Field(mesh, dim=3, value=(1, 1, 0), norm=Ms) md = self.calculator.MinDriver() md.drive(system) value = system.m((-3e-9, -3e-9, -3e-9)) assert np.linalg.norm(np.subtract(value, (Ms, 0, 0))) < 1e-3 value = system.m((3e-9, 3e-9, 3e-9)) assert np.linalg.norm(np.subtract(value, (0, Ms, 0))) < 1e-3 value = system.m((0, 0, 0)) assert np.linalg.norm(np.cross(value, (Ms, Ms, 0))) < 1e-3 self.calculator.delete(system)
def test_dict_vector(self): name = 'uniaxialanisotropy_dict_vector' mesh = df.Mesh(region=self.region, cell=self.cell, subregions=self.subregions) K = {'r1': 0, 'r2': 1e5} u = (0, 0, 1) Ms = 1e6 system = mm.System(name=name) system.energy = mm.UniaxialAnisotropy(K=K, u=u) system.m = df.Field(mesh, dim=3, value=(0, 0.3, 1), norm=Ms) md = self.calculator.MinDriver() md.drive(system) value = system.m((-2e-9, -2e-9, -2e-9)) assert np.linalg.norm(np.cross(value, (0, 0.3*Ms, Ms))) < 1e-3 value = system.m((2e-9, 2e-9, 2e-9)) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 self.calculator.delete(system)
def test_exchange_uniaxialanisotropy(self): name = 'exchange_uniaxialanisotropy' A = {'r1': 1e-12, 'r2': 0} K = 1e5 u = (1, 0, 0) Ms = 1e6 mesh = df.Mesh(region=self.region, cell=self.cell, subregions=self.subregions) system = mm.System(name=name) system.energy = mm.Exchange(A=A) + \ mm.UniaxialAnisotropy(K=K, u=u) system.m = df.Field(mesh, dim=3, value=(0.5, 1, 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))) < 1e-3 self.calculator.delete(system)
def test_script(self): for K1, K2, u in self.valid_args: anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u) with pytest.raises(NotImplementedError): script = anisotropy._script
def test_name(self): for K1, K2, u in self.valid_args: anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u) assert anisotropy.name == 'uniaxialanisotropy'
def test_init_invalid_args(self): for K1, K2, u in self.invalid_args: with pytest.raises(Exception): anisotropy = mm.UniaxialAnisotropy(K1=K1, K2=K2, u=u)