Double layers of Py / CoFeB#
Here, we calculate the dispersion of the Damon-Eshbach (DE) modes in a bilayer made of two different materials. In this system, mirror symmetries are broken, and the dipolar interaction induces a dispersion asymmetry. For more details, see Grassi et al. in Ref. 1. For the present case, we consider a bilayer with 25 nm permalloy and 25 nm CoFeB (without any nonmagnetic spacer).
Sample creation#
This can be modeled using the monolayer geometry and by setting inhomogenous material parameters. We start by creating the sample
[1]:
import tetrax as tx
import numpy as np
t1_Py = 25
t2_CoFeB = 25
total_thickness = t1_Py + t2_CoFeB
res = 2.0
dlayer_50 = tx.Sample(
tx.geometries.layer.monolayer(total_thickness, res),
name="Py25CoFeB25"
)
and set the material parameters in both layers.
[2]:
dlayer_50.gamma = 29.2 * 2 * np.pi * 1e9
Msat_Py = 845e3
Msat_CoFeB = 1270e3
middle = -(total_thickness)/2 + t1_Py
Msat_ = np.piecewise(dlayer_50.xyz.x, [dlayer_50.xyz.y <= middle, dlayer_50.xyz.y > middle], [Msat_Py,Msat_CoFeB])
dlayer_50.material["Msat"] = Msat_
A_Py = 12.8e-12
A_CoFeB = 17e-12
Aex_ = np.piecewise(dlayer_50.xyz.x, [dlayer_50.xyz.y <= middle, dlayer_50.xyz.y > middle], [A_Py,A_CoFeB])
dlayer_50.material["Aex"] = Aex_
Here, the piecewise function of the NumPy package creates a staircase dependent on the material parameters (which are piecewise constant).
[3]:
dlayer_50.mag = (1,0,0)
dlayer_50.show()
/Users/attilak/micromag/tetrax-tests/fresh_environement_test/venv/lib/python3.13/site-packages/traittypes/traittypes.py:97: UserWarning: Given trait value dtype "float32" does not match required type "float32". A coerced copy has been created.
warnings.warn(
[3]:

We see that the difference in saturation magnetization Msat between the two layers is visualized as different arrow lengths in the 3D plot. Note, that dlayer_50.mag is still a unitary vector field \(\mathbf{m}(\mathbf{r})\) of length 1 everywhere. The scaled magnetization vector \(M_\mathrm{s}(\mathbf{r})\mathbf{m}(\mathbf{r})\) can be obtained as dlayer_50.mag_full.
[4]:
dlayer_50.mag_full
[4]:
MeshVector([[ 845000., 0., 0.],
[1270000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[ 845000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.],
[1270000., 0., 0.]])
The vectors displayed in the 3D plot are simply dlayer_50.mag_full / dlayer_50.material["Msat"].average.
Dispersion calculation for the first N=5 Damon-Eshbach modes#
To calculate the first 5 DE modes, we apply an external field perpendicular to the propagation (\(z\)) direction. A homogeneous magnetization in the same direction can be assumed as the equilibrium. So we do not need to relax anymore.
[5]:
dlayer_50.external_field = (30e-3,0,0)
dlayer_50.mag = (1,0,0)
spectrum = tx.experiments.eigenmodes(dlayer_50, kmin=-50e6,kmax=50e6,num_k=81, num_cpus=-1,num_modes=5)
100%|███████████████████| 41/41 [00:01<00:00, 34.14it/s]
Plotting the spectrum shows hybridization and dispersion asymmetry of the lowest two modes.
[6]:
spectrum.plot(fscale="G", kscale="u", n=[0,1], renderer="notebook") # remove the renderer argument when running on your computer
References#
Grassi et al. “Slow-Wave-Based Nanomagnonic Diode”, Physical Review Applied 14, 024047 (2020)