import math from nmag.common import SI, degrees_per_ns, Tesla, mu0, at, every from nmag.nmag5 import Simulation, MagMaterial # Applied field Happ_dir = [0, 0, 10] # in mT # Material definition mat = MagMaterial("Py", Ms=SI(860e3, "A/m"), exchange_coupling=SI(13e-12, "J/m"), llg_gamma_G=SI(221017, "m/s A"), llg_damping=SI(0.014)) sim = Simulation("nmag_no_stt", do_demag=False) nm = SI(1e-9, "m") sim.load_mesh("mesh.nmesh", [("cube", mat)], unit_length=nm) sim.set_m([1, 0.01, 0.01]) sim.set_H_ext(Happ_dir, 0.001 * Tesla / mu0) # Define the tolerances for the simulation ns = SI(1e-9, "s") sim.set_params(stopping_dm_dt=0 * degrees_per_ns, ts_rel_tol=1e-8, ts_abs_tol=1e-8, ts_pc_rel_tol=1e-3, ts_pc_abs_tol=1e-8, demag_dbc_rel_tol=1e-6, demag_dbc_abs_tol=1e-6) sim.relax(save=[("averages", every("time", 0.01 * ns))], do=[("exit", at("time", 10 * ns))])
ps = SI(1e-12, "s"); nm = SI(1e-9, "m") # Useful definitions theta_rad = 3.141592654 phi_rad = 1.570796327 #length, width, thick = (2*nm, 16*nm, 64*nm) # System geometry current_density = SI( 100e10, "A/m^2") # Applied current Happ_dir = [0, 0, 0] # Applied field (mT)- # Material definition anis = cubic_anisotropy(axis1=[1, 0, 0], axis2=[0,1,0], K1=SI(-1e4, "J/m^3")) mat = MagMaterial("Co", Ms=SI(9.0e5, "A/m"), exchange_coupling=SI(2.0e-11, "J/m"), llg_gamma_G=SI(2.3245e5, "m/s A"), llg_damping=SI(0.01), anisotropy = anis)
relaxed_m = "m0.h5" film_centre = (5, 50, 50) do_relaxation = not os.path.exists(relaxed_m) ps = SI(1e-12, "s") mat = MagMaterial("Py", Ms=SI(0.86e6, "A/m"), exchange_coupling=SI(13e-12, "J/m"), llg_damping=SI(0.5 if do_relaxation else 0.01)) mat.sl_P = 0.0 if do_relaxation else 0.4 # Polarisation mat.sl_d = SI(3e-9, "m") # Free layer thickness sim = Simulation(do_sl_stt=True) sim.load_mesh(mesh_filename, [("region1", mat)], unit_length=SI(1e-9, "m")) def m0(r): dx, dy, dz = tuple(ri - ri0*1e-9 for ri, ri0 in zip(r, film_centre)) v = (1.0e-9, dz, -dy) vn = (1.0e-9**2 + dy*dy + dz*dz)**0.5 return tuple(vi/vn for vi in v) sim.set_m(m0) sim.set_H_ext([0, 0, 0], SI("A/m")) # Direction of the polarization sim.model.quantities["sl_fix"].set_value(Value([0, 1, 0])) # Current density
relaxed_m = "m0.h5" film_centre = (5, 50, 50) do_relaxation = not os.path.exists(relaxed_m) ps = SI(1e-12, "s") mat = MagMaterial("Py", Ms=SI(0.86e6, "A/m"), exchange_coupling=SI(13e-12, "J/m"), llg_damping=SI(0.5 if do_relaxation else 0.01)) mat.sl_P = 0.0 if do_relaxation else 0.4 # Polarisation mat.sl_d = SI(10e-9, "m") # Free layer thickness sim = Simulation(do_sl_stt=True) sim.load_mesh(mesh_filename, [("region1", mat)], unit_length=SI(1e-9, "m")) def m0(r): dx, dy, dz = tuple(ri - ri0 * 1e-9 for ri, ri0 in zip(r, film_centre)) v = (1.0e-9, dz, -dy) vn = (1.0e-9**2 + dy * dy + dz * dz)**0.5 return tuple(vi / vn for vi in v) sim.set_m(m0) sim.set_H_ext([0, 0, 0], SI("A/m")) # Direction of the polarization sim.model.quantities["sl_fix"].set_value(Value([0, 1, 0]))
# Material definition anis = uniaxial_anisotropy(axis=[0, 0, 1], K1=-SI(0.1e6, "J/m^3")) mat = MagMaterial("Py", Ms=SI(860e3, "A/m"), exchange_coupling=SI(13e-12, "J/m"), llg_gamma_G=SI(221017, "m/s A"), llg_damping=SI(0.014), anisotropy=anis) mat.sl_P = 0.4 # Polarisation mat.sl_lambda = 2.0 # lambda parameter mat.sl_d = SI(5.0e-9, "m") # Free layer thickness sim = Simulation(do_sl_stt=True, do_demag=False) sim.load_mesh(mesh_filename, [("region1", mat)], unit_length=nm) sim.set_m([1, 0.01, 0.01]) sim.set_H_ext(Happ_dir, 0.001*Tesla/mu0) # Direction of the polarization theta_rad = math.pi*theta/180.0 phi_rad = math.pi*phi/180.0 P_direction = [math.sin(theta_rad)*math.cos(phi_rad), math.sin(theta_rad)*math.sin(phi_rad), math.cos(theta_rad)] # Set the polarization direction and current density sim.model.quantities["sl_fix"].set_value(Value(P_direction)) sim.model.quantities["sl_current_density"].set_value(Value(current_density)) # Define the tolerances for the simulation
Ms=SI(0.5e6, "A/m"), exchange_coupling=SI(13e-12, "J/m"), anisotropy=anisotropy, llg_damping=0.5, llg_gamma_G=SI(0.2211e6, "m/A s")) # Create the simulation object sim = Simulation() # We want some constants to be spatially dependent sim.declare("spacefield", "alpha", "Ms", "gamma_G", "exchange_factor") anisotropy.declare("spacefield", "K1") # Load the mesh mats = [("bottom", mag), ("top", mag)] sim.load_mesh("spatially.nmesh.h5", mats, unit_length=SI(1e-9, "m")) # Set additional parameters for the time-integration sim.set_params(stopping_dm_dt=1*degrees_per_ns, ts_rel_tol=1e-6, ts_abs_tol=1e-6) sim.set_m([0.1, 0.1, 1]) sim.set_H_ext([1, 0, 0], SI(100000, 'A/m')) def create_setter(value_bottom, value_top, value_middle=None): # Fields in Nmag are defined on the nodes, which means that it is not # straightforward to decide how to set fields at the boundary. Here we # decide to set them as half of the values they have on each side. value_middle = \ ([0.5*(v + value_top[i]) for i, v in enumerate(value_bottom)] if hasattr(value_top, "__iter__")