def relax_neb(k, maxst, simname, init_im, interp, save_every=10000): """ Execute a simulation with the NEB function of the FIDIMAG code The simulations are made for a specific spring constant 'k' (a float), number of images 'init_im', interpolations between images 'interp' (an array) and a maximum of 'maxst' steps. 'simname' is the name of the simulation, to distinguish the output files. --> vtks and npys are saved in files starting with the 'simname' string """ # Prepare simulation sim = Sim(mesh, name=simname) sim.gamma = const.gamma # magnetisation in units of Bohr's magneton sim.mu_s = 2. * const.mu_B # 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) # Initial images init_images = init_im # Number of images between each state specified before (here we need only # two, one for the states between the initial and intermediate state # and another one for the images between the intermediate and final # states). Thus, the number of interpolations must always be # equal to 'the number of initial states specified', minus one. interpolations = interp neb = NEB_Sundials(sim, init_images, interpolations=interpolations, spring=k, name=simname) neb.relax(max_steps=maxst, save_vtk_steps=save_every, save_npy_steps=save_every, stopping_dmdt=1e-2)
def relax_neb(k, maxst, simname, init_im, interp, save_every=10000): """ Execute a simulation with the NEB function of the FIDIMAG code The simulations are made for a specific spring constant 'k' (a float), number of images 'init_im', interpolations between images 'interp' (an array) and a maximum of 'maxst' steps. 'simname' is the name of the simulation, to distinguish the output files. --> vtks and npys are saved in files starting with the 'simname' string """ # Prepare simulation sim = Sim(mesh, name=simname) sim.driver.gamma = const.gamma # magnetisation in units of Bohr's magneton sim.mu_s = 2. * const.mu_B # 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) # Initial images init_images = init_im # Number of images between each state specified before (here we need only # two, one for the states between the initial and intermediate state # and another one for the images between the intermediate and final # states). Thus, the number of interpolations must always be # equal to 'the number of initial states specified', minus one. interpolations = interp neb = NEB_Sundials(sim, init_images, interpolations=interpolations, spring=k, name=simname) neb.relax(max_steps=maxst, save_vtk_steps=save_every, save_npy_steps=save_every, stopping_dmdt=1e-2)
def relax_neb(k, maxst, simname, init_im, interp, save_every=10000): """ Execute a simulation with the NEB function of the FIDIMAG code, for a nano disk The simulations are made for a specific spring constant 'k' (a float), number of images 'init_im', interpolations between images 'interp' (an array) and a maximum of 'maxst' steps. 'simname' is the name of the simulation, to distinguish the output files. --> vtks and npys are saved in folders starting with the 'simname' """ # Prepare simulation # We define the small cylinder with the Magnetisation function sim = Sim(mesh) sim.Ms = cylinder # Energies # Exchange sim.add(UniformExchange(A=A)) # Bulk DMI --> This produces a Bloch DW - like skyrmion sim.add(DMI(D=D)) # No Demag, but this could have some effect # Demagnetization energy # sim.add(Demag()) # Initial images (npy files or functions) init_images = init_im # Number of images between each state specified before (here we need only # two, one for the states between the initial and intermediate state # and another one for the images between the intermediate and final # states). Thus, the number of interpolations must always be # equal to 'the number of initial states specified', minus one. interpolations = interp # Initiate the NEB algorithm driver neb = NEB_Sundials(sim, init_images, interpolations=interpolations, spring=k, name=simname) # Start the relaxation neb.relax(max_steps=maxst, save_vtk_steps=save_every, save_npy_steps=save_every, stopping_dmdt=1)
def relax_neb(k, maxst, simname, init_im, interp, save_every=10000): """ Execute a simulation with the NEB function of the FIDIMAG code, for an elongated particle (long cylinder) The simulations are made for a specific spring constant 'k' (a float), number of images 'init_im', interpolations between images 'interp' (an array) and a maximum of 'maxst' steps. 'simname' is the name of the simulation, to distinguish the output files. --> vtks and npys are saved in files starting with the 'simname' string """ # Prepare simulation # We define the cylinder with the Magnetisation function sim = Sim(mesh) sim.Ms = two_part #sim.add(UniformExchange(A=A)) # Uniaxial anisotropy along x-axis sim.add(UniaxialAnisotropy(Kx, axis=(1, 0, 0))) # Define many initial states close to one extreme. We want to check # if the images in the last step, are placed mostly in equally positions init_images = init_im # Number of images between each state specified before (here we need only # two, one for the states between the initial and intermediate state # and another one for the images between the intermediate and final # states). Thus, the number of interpolations must always be # equal to 'the number of initial states specified', minus one. interpolations = interp neb = NEB_Sundials(sim, init_images, interpolations=interpolations, spring=k, name=simname) neb.relax(max_steps=maxst, save_vtk_steps=save_every, save_npy_steps=save_every, stopping_dmdt=1e-2)
def relax_neb(k, maxst, simname, init_im, interp, save_every=10000): """ Execute a simulation with the NEB function of the FIDIMAG code, for an elongated particle (long cylinder) The simulations are made for a specific spring constant 'k' (a float), number of images 'init_im', interpolations between images 'interp' (an array) and a maximum of 'maxst' steps. 'simname' is the name of the simulation, to distinguish the output files. --> vtks and npys are saved in files starting with the 'simname' string """ # Prepare simulation # We define the cylinder with the Magnetisation function sim = Sim(mesh) sim.Ms = two_part sim.add(UniformExchange(A=A)) # Uniaxial anisotropy along x-axis sim.add(UniaxialAnisotropy(Kx, axis=(1, 0, 0))) # Define many initial states close to one extreme. We want to check # if the images in the last step, are placed mostly in equally positions init_images = init_im # Number of images between each state specified before (here we need only # two, one for the states between the initial and intermediate state # and another one for the images between the intermediate and final # states). Thus, the number of interpolations must always be # equal to 'the number of initial states specified', minus one. interpolations = interp neb = NEB_Sundials(sim, init_images, interpolations=interpolations, spring=k, name=simname) neb.relax(max_steps=maxst, save_vtk_steps=save_every, save_npy_steps=save_every, stopping_dmdt=1e-2)
def relax_system(sim): # init_images=[np.load('m_init.npy')] """ n=20 for i in range(1,n): theta = i*np.pi/n mx = -np.cos(theta) my = np.sin(theta) init_images.append((mx,my,0)) """ # init_images.append(np.load('m_final.npy')) init_images = [(-1, 0, 0), init_dw, (1, 0, 0)] neb = NEB_Sundials( sim, init_images, interpolations=[6, 6], name='neb', spring=1e8) # neb.add_noise(0.1) neb.relax(dt=1e-8, max_steps=5000, save_vtk_steps=500, save_npy_steps=500, stopping_dmdt=100)