2.5. Example: Hysteresis loop for thin disk

This example computes the hysteresis loop of a flat disc magnetised along a direction orthogonal to the main axis. In comparison to the previous Example: Hysteresis loop for Stoner-Wohlfarth particle, it demonstrates the use of a more complex sequence of applied fields.

We use a disc 20 nm thick and 200 nm in diameter for this example (the mesh is contained in nanodot1.nmesh.h5 which is created from the_nanodot.geo with `Netgen`_):

../_images/nanodot1_mesh.png

To compute the hysteresis loop for the disc, we use the script nanodot1.py:

import nmag
from nmag import SI, at

#create simulation object
sim = nmag.Simulation()

# define magnetic material
Py = nmag.MagMaterial( name="Py",
                       Ms=SI(795774,"A/m"),
                       exchange_coupling=SI(13.0e-12, "J/m")
                     )

# load mesh: the mesh dimensions are scaled by 100nm
sim.load_mesh( "nanodot1.nmesh.h5",
               [("cylinder", Py)],
               unit_length=SI(100e-9,"m")
             )

# set initial magnetisation
sim.set_m([1.,0.,0.])

Hs = nmag.vector_set( direction=[1.,0.,0.],
                      norm_list=[1000.0, 900.0, [],
                                 95.0, 90.0, [],
                                 -100.0, -200.0, [],
                                 -1000.0, -900.0, [],
                                 -95.0, -90.0, [],
                                 100.0, 200.0, [], 1000.0],
                      units=1e3*SI('A/m')
                    )


# loop over the applied fields Hs
sim.hysteresis(Hs,
               save=[('averages', 'fields', 'restart', at('convergence'))]
               )

We assume that the previous example have been sufficiently instructive to explain the basic steps such as importing nmag, creating a simulation object, defining the material and leading the mesh. Here, we focus on the hysteresis command:

We would like to apply fields ranging from [1e6, 0, 0] A/m to [100e3, 0, 0] A/m in steps of 100e3 A/m. Then, from [95e3, 0, 0] A/m to [-95e3, 0, 0] A/m we would like to use a smaller step size of 5e3 A/m (to resolve this applied field range better).

This will take us through zero applied field ([0,0,0] A/m). Now, symmetrically to the positive field values, we would like to use a step size of 100e3 A/m again to go from [-100e3, 0, 0] A/m to [-1e6, 0, 0] A/m. At this point, we would like to reverse the whole sequence (to sweep the field back to the initial value).

The information we need for the hysteresis command includes:

  1. a direction for the applied field (here just [1,0,0]),

  2. a list of magnitudes of the field (this is the norm_list) that will be interpreted, and then multiplied with the direction vector,

    As in the Example: Simple hysteresis loop and in the Example: Hysteresis loop for Stoner-Wohlfarth particle, we employ a special notation for ranges of field strengths understood by nmag.vector_set. The expression:

    [1000.0, 900.0, [], 95.0]
    

    means that we start with a magnitude of 1000, the next magnitude is 900. The empty brackets ([]) indicate that this sequence should be continued (i.e. 800, 700, 600, 500, 400, 300, 200, 100) up to but not beyond the next value given (i.e. 95).

  3. another multiplier that defines the strength of the applied fields (here, 1e3*SI('A/m')).

The corresponding command is:

Hs = nmag.vector_set( direction=[1,0,0],
                      norm_list=[1000.0, 900.0, [],
                                   95.0, 90.0, [],
                                 -100.0, -200.0, [],
                                 -1000.0, -900.0, [],
                                 -95.0, -90.0, [],
                                 100.0, 200.0, [], 1000.0],
                      units=1e6*SI('A/m')
                    )

which computes a list of vectors Hs. The hysteresis command takes this list of applied fields Hs as one input parameter, and will compute the hysteresis loop for these fields:

sim.hysteresis(Hs,
               save=[('averages', 'fields', 'restart', at('convergence'))]
              )

Again, the second parameter (save) is used to tell the hysteresis command what data to save, and how often. We request that the averages of the fields, the fields and the restart data should be saved at those points in time where we reach convergence. (See also Restart example).

2.5.1. Thin disk hysteresis loop

Once the calculation has finished, we can plot the hysteresis loop, i.e. the graph of the magnetisation computed along the direction of the applied field as a function of the applied field strength.

We use the ncol command to extract the data into a text file plot.dat:

$ ncol nanodot1 H_ext_0 m_Py_0 > plot.dat

This file starts as follows:

      1000000  0.9995058139817 
      1000000  0.9995058139817 
       900000  0.9994226410102 
       900000  0.9994226410102 
       800000  0.9993139080655 

We use `Gnuplot`_ to plot the hysteresis loop:

$ gnuplot make_plot.gnu

using the gnuplot script make_plot.gnu:

set term postscript eps enhanced color
set out 'nanodot_hyst.eps'
set xlabel 'Applied field (A/m)'
set ylabel 'M / Ms'
set xrange [-1.2e6:1.2e6]
set yrange [-1.2:1.2]
plot 'plot.dat' u 1:2 ti 'nmag' with linespoints lw 3 pt 5

The resulting graph is:

../_images/nanodot_hyst.png

and the comparison with the `Magpar`_ data, obtained with the script make_comparison_plot.gnu:

set term postscript eps enhanced color
set out 'nanodot_comparison_hyst.eps'
set xlabel 'Applied field (kA/m)'
set ylabel 'M / Ms'
set xrange [-0.2e3:0.2e3]
set yrange [-1.2:1.2]
plot 'plot.dat' u ($1/1000):2  ti 'nmag' w lp 3, 'magpar.dat' u 1:2  ti 'magpar' w p 4

is shown here (note that the `Magpar`_ computation only shows half of the hysteresis loop.):

../_images/nanodot_comparison_hyst.png

Here we can see a slight difference between |nmag| and `Magpar`_ in the location of the switching point, probably due to different tolerances in both programs when determining time integrator convergence.