def test_init_invalid_args(self): for gamma0 in self.invalid_args: with pytest.raises((TypeError, ValueError)): term = mm.Precession(gamma0=gamma0) with pytest.raises(AttributeError): term = mm.Precession(wrong=1)
def test_repr(self): for gamma in self.valid_args: precession = mm.Precession(gamma) assert repr(precession) == ('Precession(gamma={}, ' 'name=\'{}\')').format( gamma, 'precession') precession = mm.Precession(gamma=2.211e5, name='test_name') assert repr(precession) == ('Precession(gamma=221100.0, ' 'name=\'test_name\')')
def test_repr(self): for gamma in self.valid_args: precession = mm.Precession(gamma) assert repr(precession) == ('Precession(gamma={}, ' 'name=\"{}\")').format( gamma, "precession") precession = mm.Precession(gamma=2.211e5, name="test_name") assert repr( precession) == 'Precession(gamma=221100.0, name=\"test_name\")'
def test_dict(self): name = 'precession_dict' H = (0, 0, 1e6) gamma0 = {'r1': 0, 'r2': 2.211e5} Ms = 1e6 mesh = df.Mesh(region=self.region, n=self.n, subregions=self.subregions) system = mm.System(name=name) system.energy = mm.Zeeman(H=H) system.dynamics = mm.Precession(gamma0=gamma0) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) td = self.calculator.TimeDriver() td.drive(system, t=0.2e-9, n=50) # gamma=0 region value = system.m((1e-9, -4e-9, 3e-9)) assert np.linalg.norm(np.cross(value, (0, 0.1*Ms, Ms))) < 1e-3 # gamma!=0 region value = system.m((1e-9, 4e-9, 3e-9)) assert np.linalg.norm(np.cross(value, (0, 0.1*Ms, Ms))) > 1 self.calculator.delete(system)
def test_field(self): name = 'precession_field' mesh = df.Mesh(region=self.region, n=self.n) def value_fun(pos): x, y, z = pos if y <= 0: return 0 else: return 2.211e5 H = (0, 0, 1e6) gamma0 = df.Field(mesh, dim=1, value=value_fun) Ms = 1e6 system = mm.System(name=name) system.energy = mm.Zeeman(H=H) system.dynamics = mm.Precession(gamma0=gamma0) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) td = self.calculator.TimeDriver() td.drive(system, t=0.2e-9, n=50) # gamma=0 region value = system.m((1e-9, -4e-9, 3e-9)) assert np.linalg.norm(np.cross(value, (0, 0.1*Ms, Ms))) < 1e-3 # gamma!=0 region value = system.m((1e-9, 4e-9, 3e-9)) assert np.linalg.norm(np.cross(value, (0, 0.1*Ms, Ms))) > 1 self.calculator.delete(system)
def test_init_valid_args(self): for gamma0 in self.valid_args: term = mm.Precession(gamma0=gamma0) check_term(term) assert hasattr(term, 'gamma0') assert term.name == 'precession' assert re.search(r'^Precession\(gamma0=.+\)$', repr(term))
def test_dirname(calculator): name = 'specifying_dirname' mydirname = './my_dirname' p1 = (0, 0, 0) p2 = (5e-9, 5e-9, 5e-9) n = (2, 2, 2) Ms = 1e6 A = 1e-12 H = (0, 0, 1e6) region = df.Region(p1=p1, p2=p2) mesh = df.Mesh(region=region, n=n) system = mm.System(name=name) system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) system.dynamics = (mm.Precession(gamma0=mm.consts.gamma0) + mm.Damping(alpha=1)) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) md = calculator.MinDriver() md.drive(system, dirname=mydirname) dirname = os.path.join(mydirname, name, 'drive-0') assert os.path.exists(dirname) system.energy.zeeman.H = (1e6, 0, 0) td = calculator.TimeDriver() td.drive(system, t=100e-12, n=10, dirname=mydirname) dirname = os.path.join(mydirname, name, 'drive-1') assert os.path.exists(dirname) shutil.rmtree(mydirname)
def test_scalar_dict(self): name = 'dynamics_scalar_dict' H = (0, 0, 1e6) gamma0 = 2.211e5 alpha = {'r1': 0, 'r2': 1} Ms = 1e6 mesh = df.Mesh(region=self.region, n=self.n, subregions=self.subregions) system = mm.System(name=name) system.energy = mm.Zeeman(H=H) system.dynamics = (mm.Precession(gamma0=gamma0) + mm.Damping(alpha=alpha)) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) td = self.calculator.TimeDriver() td.drive(system, t=0.2e-9, n=50) # alpha=0 region value = system.m((1e-9, -4e-9, 3e-9)) assert np.linalg.norm(np.cross(value, (0, 0, Ms))) > 1 # alpha!=0 region value = system.m((1e-9, 4e-9, 3e-9)) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 self.calculator.delete(system)
def test_set_dynamics_with_zero(self): system = mm.System() system.dynamics = mm.Precession(2e5) + mm.Damping(0.1) assert isinstance(system.dynamics, mm.Dynamics) assert len(system.dynamics.terms) == 2 system.dynamics = 0 assert isinstance(system.dynamics, mm.Dynamics) assert len(system.dynamics.terms) == 0
def setup(self): self.precession = mm.Precession(gamma0=2.21e5) self.damping = mm.Damping(alpha={'r1': 1, 'r2': 0.5}) self.zhangli = mm.ZhangLi(u=500, beta=0.2) self.terms = [self.precession, self.damping, self.zhangli] self.invalid_terms = [1, 2.5, 0, 'abc', [3, 7], [self.precession, 5]]
def setup(self): p1 = (0, 0, 0) p2 = (5e-9, 5e-9, 5e-9) n = (2, 2, 2) self.Ms = 1e6 A = 1e-12 H = (0, 0, 1e6) region = df.Region(p1=p1, p2=p2) self.mesh = df.Mesh(region=region, n=n) self.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) self.precession = mm.Precession(gamma0=mm.consts.gamma0) self.damping = mm.Damping(alpha=1) self.m = df.Field(self.mesh, dim=3, value=(0, 0.1, 1), norm=self.Ms)
def test_multiple_drives(calculator): name = 'multiple_drives' p1 = (0, 0, 0) p2 = (5e-9, 5e-9, 5e-9) n = (2, 2, 2) Ms = 1e6 A = 1e-12 H = (0, 0, 1e6) region = df.Region(p1=p1, p2=p2) mesh = df.Mesh(region=region, n=n) system = mm.System(name=name) system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) system.dynamics = (mm.Precession(gamma0=mm.consts.gamma0) + mm.Damping(alpha=1)) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) md = calculator.MinDriver() md.drive(system) dirname = os.path.join(name, 'drive-0') assert os.path.exists(dirname) system.energy.zeeman.H = (1e6, 0, 0) td = calculator.TimeDriver() td.drive(system, t=100e-12, n=10) dirname = os.path.join(name, 'drive-1') assert os.path.exists(dirname) E = calculator.compute(system.energy.zeeman.energy, system) dirname = os.path.join(name, 'compute-0') assert os.path.exists(dirname) td.drive(system, t=100e-12, n=10) dirname = os.path.join(name, 'drive-2') assert os.path.exists(dirname) Heff = calculator.compute(system.energy.zeeman.effective_field, system) dirname = os.path.join(name, 'compute-1') assert os.path.exists(dirname) assert len(os.listdir(name)) == 5 calculator.delete(system)
def test_repr_latex_(self): for gamma in self.valid_args: precession = mm.Precession(gamma) latex = precession._repr_latex_() # Assert some characteristics of LaTeX string. assert isinstance(latex, str) assert latex[0] == latex[-1] == '$' assert r'\gamma' in latex assert '^{*}' in latex assert '_{0}' in latex assert r'\mathbf{m}' in latex assert r'\mathbf{H}_\text{eff}' in latex assert r'\times' in latex
def setup(self): gamma = 2.21e5 self.precession = mm.Precession(gamma) alpha = 0.5 self.damping = mm.Damping(alpha) u = (0, 0, 500) beta = 0.2 self.stt = mm.STT(u=u, beta=beta) self.terms = [self.precession, self.damping, self.stt] self.invalid_terms = [ 1, 2.5, 0, 'abc', [3, 7e-12], [self.precession, self.damping] ]
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 test_field_field(self): name = 'dynamics_field_field' mesh = df.Mesh(region=self.region, n=self.n) def alpha_fun(pos): x, y, z = pos if y <= 0: return 0 else: return 1 def gamma0_fun(pos): x, y, z = pos if y <= 0: return 0 else: return 2.211e5 H = (0, 0, 1e6) alpha = df.Field(mesh, dim=1, value=alpha_fun) gamma0 = df.Field(mesh, dim=1, value=gamma0_fun) Ms = 1e6 system = mm.System(name=name) system.energy = mm.Zeeman(H=H) system.dynamics = (mm.Precession(gamma0=gamma0) + mm.Damping(alpha=alpha)) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) td = self.calculator.TimeDriver() td.drive(system, t=0.2e-9, n=50) # alpha=0 and gamma=0 region value = system.m((1e-9, -4e-9, 3e-9)) assert np.linalg.norm(np.cross(value, (0, 0.1 * Ms, Ms))) < 1e-3 # alpha!=0 and gamma!=0 region value = system.m((1e-9, 4e-9, 3e-9)) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 self.calculator.delete(system)
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_scalar(self): name = 'precession_scalar' H = (0, 0, 1e6) gamma0 = 0 Ms = 1e6 mesh = df.Mesh(region=self.region, n=self.n) system = mm.System(name=name) system.energy = mm.Zeeman(H=H) system.dynamics = mm.Precession(gamma0=gamma0) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) td = self.calculator.TimeDriver() td.drive(system, t=0.2e-9, n=50) # Gamma is zero, nothing should change. value = system.m(mesh.region.random_point()) assert np.linalg.norm(np.cross(value, (0, 0.1*Ms, Ms))) < 1e-3 self.calculator.delete(system)
def test_scalar_scalar(self): name = 'dynamics_scalar_scalar' H = (0, 0, 1e6) alpha = 1 gamma0 = 2.211e5 Ms = 1e6 mesh = df.Mesh(region=self.region, n=self.n) system = mm.System(name=name) system.energy = mm.Zeeman(H=H) system.dynamics = (mm.Precession(gamma0=gamma0) + mm.Damping(alpha=alpha)) system.m = df.Field(mesh, dim=3, value=(0, 0.1, 1), norm=Ms) td = self.calculator.TimeDriver() td.drive(system, t=0.2e-9, n=50) # Alpha is zero, nothing should change. 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_name(self): for gamma in self.valid_args: precession = mm.Precession(gamma) assert precession.name == 'precession'
def test_info_file(calculator): name = 'info_file' L = 30e-9 # (m) cell = (10e-9, 15e-9, 5e-9) # (m) A = 1.3e-11 # (J/m) Ms = 8e5 # (A/m) H = (1e6, 0.0, 2e5) # (A/m) gamma0 = 2.211e5 # (m/As) alpha = 0.02 region = df.Region(p1=(0, 0, 0), p2=(L, L, L)) mesh = df.Mesh(region=region, cell=cell) system = mm.System(name=name) system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) system.dynamics = mm.Precession(gamma0=gamma0) + mm.Damping(alpha=alpha) system.m = df.Field(mesh, dim=3, value=(0.0, 0.25, 0.1), norm=Ms) # First (0) drive td = calculator.TimeDriver() td.drive(system, t=25e-12, n=10) dirname = os.path.join(name, 'drive-0') infofile = os.path.join(dirname, 'info.json') assert os.path.exists(dirname) assert os.path.isfile(infofile) with open(infofile) as f: info = json.loads(f.read()) assert 'drive_number' in info.keys() assert 'date' in info.keys() assert 'time' in info.keys() assert 'driver' in info.keys() assert info['drive_number'] == 0 assert re.findall(r'\d{4}-\d{2}-\d{2}', info['date']) is not [] assert re.findall(r'\d{2}:\d{2}-\d{2}', info['time']) is not [] assert info['driver'] == 'TimeDriver' assert info['t'] == 25e-12 assert info['n'] == 10 # Second (1) drive md = calculator.MinDriver() md.drive(system) dirname = os.path.join(name, 'drive-1') infofile = os.path.join(dirname, 'info.json') assert os.path.exists(dirname) assert os.path.isfile(infofile) with open(infofile) as f: info = json.loads(f.read()) assert 'drive_number' in info.keys() assert 'date' in info.keys() assert 'time' in info.keys() assert 'driver' in info.keys() assert info['drive_number'] == 1 assert re.findall(r'\d{4}-\d{2}-\d{2}', info['date']) is not [] assert re.findall(r'\d{2}:\d{2}-\d{2}', info['time']) is not [] assert info['driver'] == 'MinDriver' calculator.delete(system)
def driver_script(driver, system, compute=None, **kwargs): mif = '' if isinstance(driver, oc.MinDriver): # Check evolver and set default if not passed. if not hasattr(driver, 'evolver'): driver.evolver = oc.CGEvolver() elif not isinstance(driver.evolver, oc.CGEvolver): msg = f'Cannot use {type(driver.evolver)} for evolver.' raise TypeError(msg) # Define default stopping_mxHxm if not passed. OOMMF cannot run without # this value. if not hasattr(driver, 'stopping_mxHxm'): driver.stopping_mxHxm = 0.1 mif += oc.scripts.evolver_script(driver.evolver) # Minimisation driver script. mif += '# MinDriver\n' mif += 'Specify Oxs_MinDriver {\n' mif += ' evolver :evolver\n' mif += ' mesh :mesh\n' mif += ' Ms :m0_norm\n' mif += ' m0 :m0\n' for attr, value in driver: if attr != 'evolver': mif += f' {attr} {value}\n' mif += '}\n\n' # Saving results. mif += 'Destination table mmArchive\n' mif += 'Destination mags mmArchive\n\n' mif += 'Schedule DataTable table Stage 1\n' mif += 'Schedule Oxs_MinDriver::Magnetization mags Stage 1' if isinstance(driver, oc.TimeDriver): # Check evolver and set default if not passed. if not hasattr(driver, 'evolver'): if mm.ZhangLi() in system.dynamics: driver.evolver = oc.SpinTEvolver() elif mm.Slonczewski() in system.dynamics: driver.evolver = oc.SpinXferEvolver() else: driver.evolver = oc.RungeKuttaEvolver() elif not isinstance(driver.evolver, (oc.EulerEvolver, oc.RungeKuttaEvolver, oc.SpinTEvolver, oc.SpinXferEvolver)): msg = f'Cannot use {type(driver.evolver)} for evolver.' raise TypeError(msg) # Extract dynamics equation parameters. if mm.Precession() in system.dynamics: driver.evolver.gamma_G = system.dynamics.precession.gamma0 else: driver.evolver.do_precess = 0 if mm.Damping() in system.dynamics: driver.evolver.alpha = system.dynamics.damping.alpha else: driver.evolver.alpha = 0 if mm.ZhangLi() in system.dynamics: driver.evolver.u = system.dynamics.zhangli.u driver.evolver.beta = system.dynamics.zhangli.beta if mm.Slonczewski() in system.dynamics: driver.evolver.J = system.dynamics.slonczewski.J driver.evolver.mp = system.dynamics.slonczewski.mp driver.evolver.P = system.dynamics.slonczewski.P driver.evolver.Lambda = system.dynamics.slonczewski.Lambda driver.evolver.eps_prime = system.dynamics.slonczewski.eps_prime mif += oc.scripts.evolver_script(driver.evolver) # Extract time and number of steps. t, n = kwargs['t'], kwargs['n'] # TimeDriver mif += '# TimeDriver\n' mif += 'Specify Oxs_TimeDriver {\n' mif += ' evolver :evolver\n' mif += ' mesh :mesh\n' mif += f' Ms :m0_norm\n' mif += f' m0 :m0\n' mif += f' stopping_time {t/n}\n' mif += f' stage_count {n}\n' for attr, value in driver: if attr != 'evolver': mif += f' {attr} {value}\n' mif += '}\n\n' # Saving results mif += 'Destination table mmArchive\n' mif += 'Destination mags mmArchive\n' mif += 'Destination archive mmArchive\n\n' mif += 'Schedule DataTable table Stage 1\n' mif += 'Schedule Oxs_TimeDriver::Magnetization mags Stage 1\n' if compute is not None: mif += compute return mif
p1 = (0, 0, 0) p2 = (100e-9, 50e-9, 20e-9) cell = (5e-9, 5e-9, 5e-9) region = df.Region(p1=p1, p2=p2) mesh = df.Mesh(region=region, cell=cell) Ms = 8e5 A = 1.3e-11 H = (1e6, 0.0, 2e5) alpha = 0.02 system = mm.System(name=name) system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) system.dynamics = mm.Precession(gamma0=mm.consts.gamma0) + mm.Damping( alpha=alpha) system.m = df.Field(mesh, dim=3, value=(0.0, 0.25, 0.1), norm=Ms) td = mc.TimeDriver() td.drive(system, t=25e-12, n=25, dirname=dirname) # drive-0 td.drive(system, t=15e-12, n=15, dirname=dirname) # drive-1 td.drive(system, t=5e-12, n=10, dirname=dirname) # drive-2 md = mc.MinDriver() md.drive(system, dirname=dirname) # drive-3 system.energy.zeeman.H = (0.0, 0.0, 1.0e6) td.drive(system, t=5e-12, n=5, dirname=dirname) # drive-4 md.drive(system, dirname=dirname, output_step=True) # drive-5
def test_init_valid_args(self): for gamma in self.valid_args: precession = mm.Precession(gamma) assert precession.gamma == gamma assert isinstance(precession.gamma, numbers.Real)
def driver_script(driver, system, fixed_subregions=None, compute=None, output_step=False, **kwargs): mif = '' if isinstance(driver, oc.HysteresisDriver): # Check evolver and set default if not passed. if not hasattr(driver, 'evolver'): driver.evolver = oc.CGEvolver() elif not isinstance(driver.evolver, oc.CGEvolver): msg = f'Cannot use {type(driver.evolver)} for evolver.' raise TypeError(msg) # Define default stopping_mxHxm if not passed. OOMMF cannot run without # this value. if not hasattr(driver, 'stopping_mxHxm'): driver.stopping_mxHxm = 0.1 # Fixed spins if fixed_subregions is not None: resstr = f'{{main_atlas {" ".join(fixed_subregions)}}}' driver.evolver.fixed_spins = resstr mif += oc.scripts.evolver_script(driver.evolver) # Oxs_UZeeman Hmin, Hmax, n = kwargs['Hmin'], kwargs['Hmax'], kwargs['n'] mif += '# OxS_UZeeman\n' mif += 'Specify Oxs_UZeeman {\n' mif += ' Hrange {\n' mif += ' {{ {} {} {} {} {} {} {} }}\n'.format(*Hmin, *Hmax, n - 1) mif += ' {{ {} {} {} {} {} {} {} }}\n'.format(*Hmax, *Hmin, n - 1) mif += ' }\n' mif += '}\n\n' # Minimisation driver script. mif += '# MinDriver\n' mif += 'Specify Oxs_MinDriver {\n' mif += ' evolver :evolver\n' mif += ' mesh :mesh\n' mif += ' Ms :m0_norm\n' mif += ' m0 :m0\n' for attr, value in driver: if attr != 'evolver': mif += f' {attr} {value}\n' mif += '}\n\n' # Saving results. mif += 'Destination table mmArchive\n' mif += 'Destination mags mmArchive\n\n' mif += 'Schedule DataTable table Stage 1\n' mif += 'Schedule Oxs_MinDriver::Magnetization mags Stage 1' if isinstance(driver, oc.MinDriver): # Check evolver and set default if not passed. if not hasattr(driver, 'evolver'): driver.evolver = oc.CGEvolver() elif not isinstance(driver.evolver, oc.CGEvolver): msg = f'Cannot use {type(driver.evolver)} for evolver.' raise TypeError(msg) # Define default stopping_mxHxm if not passed. OOMMF cannot run without # this value. if not hasattr(driver, 'stopping_mxHxm'): driver.stopping_mxHxm = 0.1 # Fixed spins if fixed_subregions is not None: resstr = f'{{main_atlas {" ".join(fixed_subregions)}}}' driver.evolver.fixed_spins = resstr # What is saved in output? if output_step: output_str = 'Step' else: output_str = 'Stage' mif += oc.scripts.evolver_script(driver.evolver) # Minimisation driver script. mif += '# MinDriver\n' mif += 'Specify Oxs_MinDriver {\n' mif += ' evolver :evolver\n' mif += ' mesh :mesh\n' mif += ' Ms :m0_norm\n' mif += ' m0 :m0\n' for attr, value in driver: if attr != 'evolver': mif += f' {attr} {value}\n' mif += '}\n\n' # Saving results. mif += 'Destination table mmArchive\n' mif += 'Destination mags mmArchive\n\n' mif += f'Schedule DataTable table {output_str} 1\n' mif += f'Schedule Oxs_MinDriver::Magnetization mags {output_str} 1' if isinstance(driver, oc.TimeDriver): # Check evolver and set default if not passed. if not hasattr(driver, 'evolver'): if mm.ZhangLi() in system.dynamics: driver.evolver = oc.SpinTEvolver() elif mm.Slonczewski() in system.dynamics: driver.evolver = oc.SpinXferEvolver() else: driver.evolver = oc.RungeKuttaEvolver() elif not isinstance(driver.evolver, (oc.EulerEvolver, oc.RungeKuttaEvolver, oc.SpinTEvolver, oc.SpinXferEvolver)): msg = f'Cannot use {type(driver.evolver)} for evolver.' raise TypeError(msg) # Extract dynamics equation parameters. if mm.Precession() in system.dynamics: driver.evolver.gamma_G = system.dynamics.precession.gamma0 else: driver.evolver.do_precess = 0 if mm.Damping() in system.dynamics: driver.evolver.alpha = system.dynamics.damping.alpha else: driver.evolver.alpha = 0 if mm.ZhangLi() in system.dynamics: driver.evolver.u = system.dynamics.zhangli.u driver.evolver.beta = system.dynamics.zhangli.beta if mm.Slonczewski() in system.dynamics: driver.evolver.J = system.dynamics.slonczewski.J driver.evolver.mp = system.dynamics.slonczewski.mp driver.evolver.P = system.dynamics.slonczewski.P driver.evolver.Lambda = system.dynamics.slonczewski.Lambda driver.evolver.eps_prime = system.dynamics.slonczewski.eps_prime # Fixed spins if fixed_subregions is not None: resstr = f'{{main_atlas {" ".join(fixed_subregions)}}}' driver.evolver.fixed_spins = resstr mif += oc.scripts.evolver_script(driver.evolver) # Extract time and number of steps. t, n = kwargs['t'], kwargs['n'] # TimeDriver mif += '# TimeDriver\n' mif += 'Specify Oxs_TimeDriver {\n' mif += ' evolver :evolver\n' mif += ' mesh :mesh\n' mif += f' Ms :m0_norm\n' mif += f' m0 :m0\n' mif += f' stopping_time {t/n}\n' mif += f' stage_count {n}\n' for attr, value in driver: if attr != 'evolver': mif += f' {attr} {value}\n' mif += '}\n\n' # Saving results mif += 'Destination table mmArchive\n' mif += 'Destination mags mmArchive\n' mif += 'Destination archive mmArchive\n\n' mif += 'Schedule DataTable table Stage 1\n' mif += 'Schedule Oxs_TimeDriver::Magnetization mags Stage 1\n' if compute is not None: mif += compute return mif
def test_script(self): for gamma in self.valid_args: precession = mm.Precession(gamma) with pytest.raises(NotImplementedError): script = precession._script
def test_init_invalid_args(self): for gamma in self.invalid_args: with pytest.raises(Exception): precession = mm.Precession(gamma)
def test_set_dynamics_with_dynamicsterm(self): system = mm.System() assert isinstance(system.dynamics, mm.Dynamics) system.dynamics = mm.Precession(2.211e5) assert isinstance(system.dynamics, mm.Dynamics) assert len(system.dynamics.terms) == 1