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)
Пример #2
0
    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\")'
Пример #4
0
    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)
Пример #5
0
    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))
Пример #7
0
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)
Пример #8
0
    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)
Пример #9
0
    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]]
Пример #11
0
 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)
Пример #12
0
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)
Пример #13
0
    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
Пример #14
0
    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]
        ]
Пример #15
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)
Пример #16
0
    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)
Пример #17
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)
Пример #19
0
    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)
Пример #20
0
    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)
Пример #21
0
 def test_name(self):
     for gamma in self.valid_args:
         precession = mm.Precession(gamma)
         assert precession.name == 'precession'
Пример #22
0
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)
Пример #23
0
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
Пример #24
0
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
Пример #25
0
 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)
Пример #26
0
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
Пример #27
0
 def test_script(self):
     for gamma in self.valid_args:
         precession = mm.Precession(gamma)
         with pytest.raises(NotImplementedError):
             script = precession._script
Пример #28
0
 def test_init_invalid_args(self):
     for gamma in self.invalid_args:
         with pytest.raises(Exception):
             precession = mm.Precession(gamma)
Пример #29
0
 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