def relax_system_stage2(): mesh = CuboidMesh(nx=140 , ny=140, nz=1) sim = Sim(mesh, name='dyn', driver='llg') sim.alpha = 0.1 sim.do_precession = True sim.gamma = const.gamma sim.mu_s = spatial_mu sim.set_m(np.load('skx.npy')) J = 50 * const.k_B exch = UniformExchange(J) sim.add(exch) D = 0.27 * J dmi = DMI(D) sim.add(dmi) zeeman = Zeeman(spatial_H) sim.add(zeeman) ts = np.linspace(0, 2e-9, 201) for t in ts: sim.run_until(t) sim.save_vtk() sim.save_m() print(t)
def relax_system(mesh): sim=Sim(mesh,name='relax') sim.set_options(rtol=1e-12,atol=1e-14) sim.do_precession = False sim.alpha = 0.5 sim.gamma = 1.0 sim.mu_s = 1.0 sim.set_m(init_m) J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.18 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0,0e-3,2e-2],name='H') sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-8, max_steps=10000, save_m_steps=None, save_vtk_steps=100) np.save('m0.npy',sim.spin)
def relax_system(mesh, Hy=0): sim = Sim(mesh, name='relax') sim.driver.set_tols(rtol=1e-10, atol=1e-12) sim.driver.alpha = 0.5 sim.driver.gamma = 1.0 sim.mu_s = 1.0 sim.do_precession = False sim.set_m(init_m) #sim.set_m(random_m) #sim.set_m(np.load('m_10000.npy')) J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.18 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0, Hy, 2e-2], name='H') sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-7, max_steps=10000, save_m_steps=100, save_vtk_steps=50) np.save('m0.npy', sim.spin)
def relax_system_stage1(): mesh = CuboidMesh(nx=140 , ny=140, nz=1) sim = Sim(mesh, name='relax', driver='llg') #sim.set_options(dt=1e-14, gamma=const.gamma, k_B=const.k_B) sim.alpha = 0.5 sim.do_precession = False sim.gamma = const.gamma sim.mu_s = spatial_mu sim.set_m(init_m) J = 50 * const.k_B exch = UniformExchange(J) sim.add(exch) D = 0.27 * J dmi = DMI(D) sim.add(dmi) zeeman = Zeeman(spatial_H) sim.add(zeeman) sim.relax(dt=1e-14, stopping_dmdt=1e10, max_steps=1000, save_m_steps=100, save_vtk_steps=10) np.save('skx.npy', sim.spin) plot_m(mesh, 'skx.npy', comp='z')
def relax_system(mesh, Hy=0): sim = Sim(mesh, name="relax") sim.set_options(rtol=1e-10, atol=1e-12) sim.alpha = 0.5 sim.gamma = 1.0 sim.mu_s = 1.0 sim.do_precession = False sim.set_m(init_m) # sim.set_m(random_m) # sim.set_m(np.load('m_10000.npy')) J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.18 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0, Hy, 2e-2], name="H") sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-8, max_steps=10000, save_m_steps=100, save_vtk_steps=50) np.save("m0.npy", sim.spin)
def relax_system(mesh): sim = Sim(mesh, name='relax') sim.set_options(rtol=1e-12, atol=1e-14) sim.do_precession = False sim.alpha = 0.5 sim.gamma = 1.0 sim.mu_s = 1.0 sim.set_m(init_m) J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.18 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0, 0e-3, 2e-2], name='H') sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-8, max_steps=10000, save_m_steps=None, save_vtk_steps=100) np.save('m0.npy', sim.spin)
def test_skx_num_atomistic(): """ Test the *finite spin chirality* or skyrmion number for a discrete spins simulation in a two dimensional lattice The expression is (PRL 108, 017601 (2012)) : Q = S_i \dot ( S_{i+1} X S_{j+1} ) + S_i \dot ( S_{i-1} X S_{j-1} ) which measures the chirality taking two triangles of spins per lattice site i: S_{i} , S_{i + x} , S_{i + y} and S_{i} , S_{i - x} , S_{i - y} The area of the two triangles cover a unit cell, thus the sum cover the whole area of the atomic lattice This test generate a skyrmion pointing down with unrealistic paremeters. """ mesh = CuboidMesh(nx=120, ny=120, nz=1, periodicity=(True, True, False)) sim = Sim(mesh, name='skx_num') sim.set_tols(rtol=1e-6, atol=1e-6) sim.alpha = 1.0 sim.gamma = 1.0 sim.mu_s = 1.0 sim.set_m(lambda pos: init_m(pos, 60, 60, 20)) sim.do_precession = False J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.09 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0, 0, 5e-3]) sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-2, max_steps=1000, save_m_steps=None, save_vtk_steps=None) skn = sim.skyrmion_number() print('skx_number', skn) assert skn > -1 and skn < -0.99
def relax_system(): # 1D chain of 50 spins with a lattice constant of 0.27 A mesh = CuboidMesh( nx=nx, dx=dx, unit_length=1e-9, # pbc='1d' ) # Initiate the simulation sim = Sim(mesh, name=sim_name) sim.gamma = const.gamma # magnetisation in units of Bohr's magneton sim.mu_s = 2 * const.mu_B # sim.set_options(gamma=const.gamma, k_B=const.k_B) # Initial magnetisation profile sim.set_m(init_m) # Exchange constant in Joules: E = Sum J_{ij} S_i S_j J = 12. * const.meV exch = UniformExchange(J) sim.add(exch) # DMI constant in Joules: E = Sum D_{ij} S_i x S_j D = 2. * const.meV dmi = DMI(D, dmi_type='interfacial') sim.add(dmi) # Anisotropy along +z axis ku = Anisotropy(Ku=0.5 * const.meV, axis=[0, 0, 1], name='ku') sim.add(ku) # Faster convergence sim.alpha = 0.5 sim.do_precession = False sim.relax(dt=1e-13, stopping_dmdt=0.05, max_steps=700, save_m_steps=1000, save_vtk_steps=1000) # Save the last relaxed state np.save(sim_name + '.npy', sim.spin)
def relax_system(): # 1D chain of 50 spins with a lattice constant of 0.27 A mesh = CuboidMesh(nx=nx, dx=dx, unit_length=1e-9, # pbc='1d' ) # Initiate the simulation. PBCs are specified in the mesh sim = Sim(mesh, name=sim_name) sim.gamma = const.gamma # magnetisation in units of Bohr's magneton sim.mu_s = 2. * const.mu_B # sim.set_options(gamma=const.gamma, k_B=const.k_B) # Initial magnetisation profile sim.set_m((0, 0, 1)) # Exchange constant in Joules: E = Sum J_{ij} S_i S_j J = 12. * const.meV exch = UniformExchange(J) sim.add(exch) # DMI constant in Joules: E = Sum D_{ij} S_i x S_j D = 2. * const.meV dmi = DMI(D, dmi_type='interfacial') sim.add(dmi) # Anisotropy along +z axis ku = Anisotropy(Ku=0.5 * const.meV, axis=[0, 0, 1], name='ku') sim.add(ku) # Faster convergence sim.alpha = 0.5 sim.do_precession = False sim.relax(dt=1e-13, stopping_dmdt=0.05, max_steps=700, save_m_steps=1000, save_vtk_steps=1000) # Save the last relaxed state np.save(sim_name + '.npy', sim.spin)
def test_dw_dmi_atomistic(do_plot=False): mesh = CuboidMesh(nx=300, ny=1, nz=1) sim = Sim(mesh, name='relax') sim.set_default_options(gamma=const.gamma) sim.alpha = 0.5 sim.mu_s = const.mu_s_1 sim.do_precession = False sim.set_m(m_init_dw) J = 50.0 * const.k_B exch = UniformExchange(J) sim.add(exch) D = 0.01 * J dmi = DMI(D) sim.add(dmi) K = 0.005 * J anis = Anisotropy(K, axis=[1, 0, 0]) sim.add(anis) ONE_DEGREE_PER_NS = 17453292.52 sim.relax(dt=1e-13, stopping_dmdt=0.01 * ONE_DEGREE_PER_NS, max_steps=1000, save_m_steps=100, save_vtk_steps=50) np.save('m0.npy', sim.spin) xs = np.array([p[0] for p in mesh.coordinates]) - 150 mx, my, mz = analytical(xs, A=J / 2.0, D=-D, K=K) mxyz = sim.spin.copy() mxyz = mxyz.reshape(-1, 3).T assert max(abs(mxyz[0, :] - mx)) < 0.001 assert max(abs(mxyz[1, :] - my)) < 0.001 assert max(abs(mxyz[2, :] - mz)) < 0.0006 if do_plot: save_plot(xs, mxyz, mx, my, mz)
def test_dw_dmi_atomistic(do_plot=False): mesh = CuboidMesh(nx=300, ny=1, nz=1) sim = Sim(mesh, name='relax') sim.set_default_options(gamma=const.gamma) sim.alpha = 0.5 sim.mu_s = const.mu_s_1 sim.do_precession = False sim.set_m(m_init_dw) J = 50.0 * const.k_B exch = UniformExchange(J) sim.add(exch) D = 0.01 * J dmi = DMI(D) sim.add(dmi) K = 0.005 * J anis = Anisotropy(K, axis=[1,0,0]) sim.add(anis) ONE_DEGREE_PER_NS = 17453292.52 sim.relax(dt=1e-13, stopping_dmdt=0.01 * ONE_DEGREE_PER_NS, max_steps=1000, save_m_steps=100, save_vtk_steps=50) np.save('m0.npy', sim.spin) xs = np.array([p[0] for p in mesh.coordinates]) - 150 mx, my, mz = analytical(xs, A=J/2.0, D=-D, K=K) mxyz = sim.spin.copy() mxyz = mxyz.reshape(-1, 3).T assert max(abs(mxyz[0, :] - mx)) < 0.001 assert max(abs(mxyz[1, :] - my)) < 0.001 assert max(abs(mxyz[2, :] - mz)) < 0.0006 if do_plot: save_plot(xs, mxyz, mx, my, mz)
def relax_system(mesh): sim = Sim(mesh, name='relax') sim.set_default_options(gamma=constant.gamma) sim.alpha = 0.5 sim.mu_s = constant.mu_s_1 sim.do_precession = False sim.set_m(m_init_dw) J = 50.0 * constant.k_B exch = UniformExchange(J) sim.add(exch) D = 0.1 * J dmi = DMI(D, dmi_type='interfacial') sim.add(dmi) K = 0.02 * J anis = Anisotropy(K, axis=[0, 0, 1]) sim.add(anis) ONE_DEGREE_PER_NS = 17453292.52 sim.relax(dt=1e-13, stopping_dmdt=0.01 * ONE_DEGREE_PER_NS, max_steps=1000, save_m_steps=100, save_vtk_steps=50) np.save('m0.npy', sim.spin) xs = np.array([p[0] for p in mesh.pos]) - 150 mx, my, mz = analytical(xs, A=J / 2.0, D=-D, K=K) mxyz = sim.spin.copy() mxyz.shape = (3, -1) save_plot(xs, mxyz, mx, my, mz)
def relax_system(mesh): sim = Sim(mesh, name='relax') sim.set_default_options(gamma=constant.gamma) sim.driver.alpha = 0.5 sim.mu_s = constant.mu_s_1 sim.do_precession = False sim.set_m(m_init_dw) J = 50.0 * constant.k_B exch = UniformExchange(J) sim.add(exch) D = 0.1 * J dmi = DMI(D, dmi_type = 'interfacial') sim.add(dmi) K = 0.02 * J anis = Anisotropy(K, axis=[0,0,1]) sim.add(anis) ONE_DEGREE_PER_NS = 17453292.52 sim.relax(dt=1e-13, stopping_dmdt=0.01 * ONE_DEGREE_PER_NS, max_steps=1000, save_m_steps=100, save_vtk_steps=50) np.save('m0.npy', sim.spin) xs = np.array([p[0] for p in mesh.pos]) - 150 mx, my, mz = analytical(xs, A=J/2.0, D=-D, K=K) mxyz = sim.spin.copy() mxyz.shape = (3, -1) save_plot(xs, mxyz, mx, my, mz)
def test_skx_num_atomistic(): """ Test the *finite spin chirality* or skyrmion number for a discrete spins simulation in a two dimensional lattice The expression is (PRL 108, 017601 (2012)) : Q = S_i \dot ( S_{i+1} X S_{j+1} ) + S_i \dot ( S_{i-1} X S_{j-1} ) which measures the chirality taking two triangles of spins per lattice site i: S_{i} , S_{i + x} , S_{i + y} and S_{i} , S_{i - x} , S_{i - y} The area of the two triangles cover a unit cell, thus the sum cover the whole area of the atomic lattice We also test the Berg and Luscher definition for a topological charge (see the hexagonal mesh test for details) in a square lattice. This test generate a skyrmion pointing down with unrealistic paremeters. """ mesh = CuboidMesh(nx=120, ny=120, nz=1, periodicity=(True, True, False)) sim = Sim(mesh, name='skx_num') sim.driver.set_tols(rtol=1e-6, atol=1e-6) sim.driver.alpha = 1.0 sim.driver.gamma = 1.0 sim.mu_s = 1.0 sim.set_m(lambda pos: init_m(pos, 60, 60, 20)) sim.do_precession = False J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.09 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0, 0, 5e-3]) sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-2, max_steps=1000, save_m_steps=None, save_vtk_steps=None) skn = sim.skyrmion_number() print('skx_number', skn) skn_BL = sim.skyrmion_number(method='BergLuscher') print('skx_number_BergLuscher', skn_BL) # Test the finite chirality method assert skn > -1 and skn < -0.99 # Test the Berg-Luscher method assert np.abs(skn_BL - (-1)) < 1e-4 and np.sign(skn_BL) < 0 # Test guiding center Rx, Ry = compute_RxRy(mesh, sim.spin) print('Rx=%g, Ry=%g' % (Rx, Ry)) assert Rx < 60 and Rx > 58 assert Ry < 60 and Ry > 58
def test_skx_num_atomistic(): """ Test the *finite spin chirality* or skyrmion number for a discrete spins simulation in a two dimensional lattice The expression is (PRL 108, 017601 (2012)) : Q = S_i \dot ( S_{i+1} X S_{j+1} ) + S_i \dot ( S_{i-1} X S_{j-1} ) which measures the chirality taking two triangles of spins per lattice site i: S_{i} , S_{i + x} , S_{i + y} and S_{i} , S_{i - x} , S_{i - y} The area of the two triangles cover a unit cell, thus the sum cover the whole area of the atomic lattice We also test the Berg and Luscher definition for a topological charge (see the hexagonal mesh test for details) in a square lattice. This test generate a skyrmion pointing down with unrealistic paremeters. """ mesh = CuboidMesh(nx=120, ny=120, nz=1, periodicity=(True, True, False)) sim = Sim(mesh, name='skx_num') sim.driver.set_tols(rtol=1e-6, atol=1e-6) sim.driver.alpha = 1.0 sim.driver.gamma = 1.0 sim.mu_s = 1.0 sim.set_m(lambda pos: init_m(pos, 60, 60, 20)) sim.do_precession = False J = 1.0 exch = UniformExchange(J) sim.add(exch) D = 0.09 dmi = DMI(D) sim.add(dmi) zeeman = Zeeman([0, 0, 5e-3]) sim.add(zeeman) sim.relax(dt=2.0, stopping_dmdt=1e-2, max_steps=1000, save_m_steps=None, save_vtk_steps=None) skn = sim.skyrmion_number() print('skx_number', skn) skn_BL = sim.skyrmion_number(method='BergLuscher') print('skx_number_BergLuscher', skn_BL) # Test the finite chirality method assert skn > -1 and skn < -0.99 # Test the Berg-Luscher method assert np.abs(skn_BL - (-1)) < 1e-4 and np.sign(skn_BL) < 0 # Test guiding center Rx, Ry = compute_RxRy(mesh, sim.spin) print('Rx=%g, Ry=%g'%(Rx, Ry)) assert Rx<60 and Rx>58 assert Ry<60 and Ry>58