Magnetic Nanoparticle with a Disordered Shell (Reproduce Hysteresis Loop from article)

144 views
Skip to first unread message

Victor Hugo Sosa Fierro

unread,
Oct 30, 2024, 10:46:18 AM10/30/24
to mumax2

Hello! I'm trying to reproduce the hysteresis loop described in this article. However, my calculated value is much lower than expected (see attached hysteresis loop for reference).

The code I am using is provided below. I have experimented with adjusting the edgesmooth parameter and ext_InterExchange() function, but these changes have had minimal impact. The values for Aex, K_u, and Msat are taken directly from Table 2 of the article. Any suggestions would be greatly appreciated!Hysteresis_loop.png


// Set mesh grid and geometry
SetGridSize(12,12,12)
SetCellSize(0.5e-9,0.5e-9,0.5e-9)
FixDt=1e-15
Temp = 0
// edgesmooth = 7

//Set geometry
d1 := 5.5e-9
d2 := 0.5e-9
core := Ellipsoid(d1,d1,d1)
shell := Ellipsoid(d1+d2,d1+d2,d1+d2).intersect(core.inverse())
setgeom(core.add(shell))
saveas(geom, "core-shell")

//Define two regions, default region is 0
defregion(1, core)
defregion(2, shell)

// Set magnetic parameters for core
Msat_core := 7.74e5
Aex_core := 1.5e-11
Ku_core := 8.9e4
alpha_core := 0.01

msat.setregion(1,Msat_core)
Aex.setregion(1,Aex_core)
Ku1.setregion(1,Ku_core)
anisU.setRegion(1, vector(1, 0, 0))
alpha.setregion(1, alpha_core)

// Set magnetic parameter for shell
order := 0.8
msat.setregion(2,Msat_core*order)
Aex.setregion(2,Aex_core*order)
alpha.setregion(2, 0.005)

//Set the interaction between the two regions
//ext_InterExchange(1, 2, Aex_core)


//set initial magnetization in regions or shapes
//default = randommag
m.setregion(1, uniform(1, 0.1, 0))
m.setregion(2, randommag())
saveas(m, "initial_magnetization")

//Set and external field in x direction rotated 1 degree to break the simmetry
angle := pi/180
Bmax  := 3.56
B_ext=vector(Bmax*cos(angle),Bmax*sin(angle),0)
tableadd(B_ext)
relax() //works all the time

//set up the hysteresis loop parameters
H_min  := -Bmax
H_max  :=  Bmax
H_step :=  0.01

//ramp the field down
for H:=H_max;H>=H_min;H-=H_step{
    B_ext=vector(H*cos(angle),H*sin(angle),0)
    minimize() //only works if you are close to the minimum
    tablesave()
}

//ramp the field up again
for H:=H_min;H<=H_max;H+=H_step{
    B_ext=vector(H*cos(angle),H*sin(angle),0)
    minimize()
    tablesave()
}

Josh Lauzier

unread,
Nov 17, 2024, 3:18:15 AM11/17/24
to mumax2
Hi,

Generally speaking, I would say your code looks reasonable. However one important difference is that paper is using run(), instead of minimize()/relax(). If you want to recreate those results, you should match that. This matters for a few reasons: One, relax/minimize disable excitations, including temperature (this doesn't matter so much if you're only interested in 0 K). If you're interested in temperature, you will have to use run. But also, they are not time based solvers so they aren't constrained by things like FixDt. One downside to using run is you will find that it takes much, much longer than relax or minimize. This is largely unavoidable, unfortunately. Using a FixDt will also exacerbate this problem.

In some situations, the different solvers can give different results. In particular for this case, this paper seems to use a very short run time (~2e-11 seconds only). This is actually so short that I would be worried that this is too short and artificially increased the coercivity. When comparing to hysteresis results, you're essentially comparing to the long term steady state behavior. Therefore, it's important to have a run time long enough for spins to settle at each field step to match experiment. When I've seen people use run() for hysteresis, the run time is usually much longer, on the order of nanoseconds. One good rule of thumb is, your results (including the coercivity) should not change much if you increase the run time. If it changes significantly, that's a sign you aren't letting the system full relax before stepping to the next field, and this can give incorrect behavior. I would recommend starting with the paper's run time, and investigating what happens if you increase it. I suspect the coercivity will continue to drop with longer run time.

That said, I would say your results look pretty reasonable to me. Your effective anisotropy field is 2*K/M_sat ~=0.22 T. So your result with minimize is basically what I would expect. I don't really see anything that would lead to a 2 T coercivity. There's no strong shape anisotropy or anything.

One other thing I would mention is, the paper doesn't say anything about using a canting. So they may be applying the field at 0 degrees. This can also artificially increase the coercivity. For instance if you run at 0 degrees, minimize gives a coercivity of closer to ~2T, and relax gives something closer to ~1.2 T. This shows how a) different solvers can give different results, and b) how symmetry can inflate the coercivity. Whereas if you break the symmetry, minimize and relax both give the ~0.2 T coercivity and agree. This should be less of an issue with run(), especially once temperature is enabled (the temperature can break up the symmetry), but it is something to consider.

Best,
Josh L.

Victor Hugo Sosa Fierro

unread,
Nov 20, 2024, 10:28:49 AM11/20/24
to mumax2
Thank you very much for the response. Very helpful information. I will run some test with your recommendations.
Reply all
Reply to author
Forward
0 new messages