How to model uncompensated spins on the FM/AFM interface in Mumax?

1,174 views
Skip to first unread message

Oreci Escobar da Silva

unread,
Feb 24, 2018, 3:41:18 PM2/24/18
to mumax2


I'm trying to implement a uncompensated spins FM/AFM interface in a bilayers system that presents the phenomenon of exchange bias in Mumax, following the standard of the article "Modeling compensated antiferromagnetic interfaces with MuMax", however, I'm not succeeding. To implement uncompensated spins on the FM/AFM interface, do I have to define one or two AFM regions in Mumax? I tried to freeze the AFM layer with the "frozenspins" command but it did not work, can anyone help me with this problem?

See how I implemented the code based on this one from the article "Modeling compensated antiferromagnetic interfaces with MuMax", from a companion in the researchgate on this subject too, I posted some results there. Is the way I used the FM/AFm interaction correct?

Nx := 64; Ny := 64; Nz := 3;
Cx := 3.0e-9; Cy := 3.0e-9; Cz := 3.0e-9;
setgridsize(Nx, Ny, Nz)
setcellsize(Cx, Cy, Cz)
setgeom(universe())
setPBC(0,0,1) // as the FM is discretized in only 1 layer
DefRegion(0, Layer(0)) // AFM layer
DefRegion(1, Layer(1)) // FM layer
defregion(0, xrange(-inf, 0)) // left half
defregion(1, xrange(0, inf)) // right half
NoDemagSpins.setRegion(1, 1)
A_FM := 13e-12
Msat_FM:= 800e3
Aex.setRegion(1, A_FM)
Msat.setRegion(1, Msat_FM)
m.setRegion(1, uniform(0, 1, 0))
t_AFM := Cz
Msat_AFM := Msat_FM // to equally divide the energy density
K_AFM := 7.0e5
J_I := 0.7e-3
delta := 1.0e6
A_AFM := -(delta*t_AFM*Cz/2)
A_A := -A_AFM
NoDemagSpins.SetRegion(0, 1)
Aex.setRegion(0, A_A)
Msat.setRegion(0, Msat_AFM)
Ku1.setRegion(0, K_AFM)
anisU.setRegion(0,vector(0, 1, 0))
m.setRegion(0, vortex(-1, -1))
eb:= (2 * A_FM * A_AFM / (Msat_FM * Msat_AFM))/(A_FM/Msat_FM + A_AFM/Msat_AFM)
ext_ScaleExchange(0, 1, J_I*Cz/(eb*(Msat_AFM+Msat_AFM)))
Relax()
Bmax := 75.0
B_app := 75.0
fiH := 0.0 // field angle applied
TableAddVar(B_app, "B_app", "T")
TableAdd(m.Region(1)) // save average magnetization of FM layer
for i := Bmax; i >= -Bmax; i-- {
B_app = i * 1e-3
print(B_app*1000, "Oe")
B_ext.setregion(1, vector(B_app*cos((fiH+90)*pi/180), B_app*sin((fiH+90)*pi/180), 0))
tablesave()
Relax()
}
for i := -Bmax; i <= Bmax; i++ {
B_app = i * 1e-3
print(B_app*1000, "Oe")
B_ext.setregion(1, vector(B_app*cos((fiH+90)*pi/180), B_app*sin((fiH+90)*pi/180), 0))
tablesave()
Relax()

Greets.
Oreci.
Exchange_Bias.png

a

unread,
Feb 24, 2018, 4:36:13 PM2/24/18
to mumax2
Dear all,

Sadly it is true that an example of an uncompensated AFM interface (paper 'Modelling exchange bias with MuMax3') was not included in the supplementary material of the paper 'modelling compensated antiferromagnetic interfaces in MuMax3'.

Modelling exchange bias with MuMax3: https://doi.org/10.1088/0022-3727/49/43/435001
Modelling compensated antiferromagnetic interfaces with MuMax3: https://doi.org/10.1088/1361-6463/aa8601

However, for reasons of transparency, please find an example code below.

When only dealing with an uncompensated AFM interface, it suffices in MuMax3 to replace the AFM by one layer with thickness equal to the total thickness of the AFM.
The exchange coupling between the FM and the AFM layer can be rescaled (see the papers) to a proper value and can locally be varied by dividing the AFM layer into grains using the Voronoi tesselation.
The saturation magnetisation of the AFM layer should be set equal to that of the ferromagnet and demagnetisation energy and the external field should be switched off in the AFM layer. The anisotropy constant K_AFM of the AFM should be set to its real value.
If necessary, one can take into account the external field on the uncompensated AFM interface by appropriately rescaling the value of the applied field. (remember one should put Msat_AFM always equal to Msat_FM). Please use the relax() function. Limitations of this micromagnetic model is described in the 2 cited papers.

In this model, you obtain exchange bias in the case K_AFM*t_AFM > J_eb with K_AFM the anisotropy constant of the AFM, t_AFM the total thickness of the AFM and J_eb  the surface energy density determined by the exchange interaction at the FM/AFM interface. This situation amounts to pinned AFM grains.
In case K_AFM*t_AFM < J_eb, the AFM grains switch together with the FM layer and so do not lead to exchange bias, but to an enhanced coercivity. In a real system, both types are present and so this model can explain exchange bias (shift of the loop) due to the pinned AFM grains and the enhanced coercivity due to the rotatable AFM grains. This is the case e.g. in the paper 'Modelling exchange bias with MuMax3' when reproducing the experimental hysteresis loop of the Co/CoO bilayer.

For the example script below, we have:
K_AFM = 1.0e5 J/m^3
t_AFM = 3.5e-9 m
J_eb = 0.1e-3 (also labelled as J_I in the paper 'Modelling compensated antiferromagnetic interfaces with MuMax3)

For these values, the theoretical model shows that the bias field should be 35.4 mT.
As K_AFM*t_AFM > J_eb, there is no coercivity in the hysteresis loop.
Remember that demagnetization energy of the FM is only switched off in this example, in order to be able to compare it to theoretical predictions. (macrospin model) There is no reason to do this in a real system.
In the AFM, demagnetization energy should always be switched off. See the function NoDemagSpins.SetRegion(0, 1) in the example code.

When using this model, please cite the corresponding papers.



Nx := 128
Ny := 128
Nz := 2
Cx := 3.5e-9
Cz := 3.5e-9
setgridsize(Nx, Ny, Nz)
setcellsize(Cx, Cx, Cz)

Aex = 1.3e-11
alpha = 0.9
setgeom(universe())

Msat_FM := 800.0e3
A_FM := 1.3e-11

Ku_AFM := 1.0e5
Msat_AFM := Msat_FM
A_AFM := 1.3e-11

DefRegion(1, Layer(1))
NoDemagSpins.SetRegion(1, 1)
Msat.setRegion(1, Msat_FM)
m.setRegion(1, uniform(1,0,0))
Aex.setRegion(1, A_FM)


J_eb := 0.1e-3


DefRegion(0, Layer(0))
Aex.setRegion(0, A_AFM)
NoDemagSpins.SetRegion(0, 1)
Msat.setRegion(0, Msat_AFM)
m.setRegion(0, uniform(1, 0, 0))
Ku1.setregion(0, Ku_AFM)
anisU.setRegion(0, vector(1, 0, 0))


fc_eb := (2 * A_FM * A_AFM / (Msat_FM * Msat_AFM))/(A_FM/Msat_FM + A_AFM/Msat_AFM)
ext_ScaleExchange(0, 1, J_eb*Cz/(fc_eb*(Msat_AFM+Msat_AFM)))
B_app := 0.0
relax()
save(m)

TableAddVar(B_app, "B_app", "T")
TableAdd(m.Region(1))


for i:=600; i>-601; i--{
   B_app = i*0.0005
   B_ext.setregion(1,vector(i*0.0005,0,0.000001))
   tablesave()
   relax()
}

for i:=-599; i<601; i++{
   B_app = i*0.0005
   B_ext.setregion(1,vector(i*0.0005,0,0.000001))
   tablesave()
   relax()
}
   



Op zaterdag 24 februari 2018 21:41:18 UTC+1 schreef Oreci Escobar da Silva:
Reply all
Reply to author
Forward
Message has been deleted
0 new messages