mammos_analysis quickstart#

mammos_analysis has a collection of post-processing tools:

  • mammos_analysis.hysteresis contains functions to extract macroscopic properties from a hysteresis loop

  • mammos_analysis.kuzmin contains fuctions to estimate micromagnetic properties from (atomistic) M(T) data using Kuz’min equations.

import mammos_analysis
import mammos_entity as me
import mammos_units as u
import numpy as np
import matplotlib.pyplot as plt

mammos_analysis.hysteresis#

Extrinsic properties Hc, Mr, BHmax#

We can compute coercive field Hc, remanent magnetization Mr and the maximum energy product BHmax from a hysteresis loop.

We need to provide the external field H and the magnetization M. These could come from a simulation or experiment. Here, we create some artificial data:

H = me.H([-1e6, -0.8e6, -0.6e6, -0.5e6, -0.2e6, 0, 0.5e6, 1e6])
M = me.M([-1e6, -1e6, 1e6, 1e6, 1e6, 1e6, 1e6, 1e6])
plt.plot(H.q, M.q, "o-", linewidth=1)
plt.xlabel(H.axis_label)
plt.ylabel(M.axis_label)
Text(0, 0.5, 'Magnetization (A / m)')
../../_images/93bc70cd920a7f603e0ecbe06fa9ebc1ca3c218324d031722a435bd01dcdb0f9.png
extrinsic_properties = mammos_analysis.hysteresis.extrinsic_properties(
    H=H,
    M=M,
    demagnetization_coefficient=1 / 3,  # assumption: we have a cube
)
extrinsic_properties.Mr
Remanence(value=1000000.0, unit=A / m)
extrinsic_properties.Hc
CoercivityHcExternal(value=700000.0, unit=A / m)
extrinsic_properties.BHmax  # only available if we pass a demagnetization_coefficient, otherwise NaN
MaximumEnergyProduct(value=312763.00212764443, unit=N / m2)
plt.plot(H.q, M.q, ".-", -H.q, -M.q, "x-", linewidth=1)
plt.plot(0, extrinsic_properties.Mr.q, "cs", label="Mr")
plt.plot(extrinsic_properties.Hc.q, 0, "rD", label="Hc")
plt.xlabel(H.axis_label)
plt.ylabel(M.axis_label)
plt.legend()
<matplotlib.legend.Legend at 0x7f64b6e135d0>
../../_images/a51db696b5bdb98baabf9e1a6095ba573c7e1adb03785c3c59428beb8591dbc1.png

Linear segment of a hysteresis loop#

We can compute properties the linear segment (starting at H=0) of a hysteresis loop.

We need to provide the external field H and the magnetization M. These could come from a simulation or experiment. Here, we create some artificial data:

H = me.H(np.linspace(0, 1.1e6, 12))
M = me.M([0, 0.11e5, 0.22e5, 0.33e5, 0.44e5, 0.55e5, 0.66e5, 0.75e5, 0.83e5, 0.90e5, 0.95e5, 0.95e5])
plt.plot(H.q, M.q, "o-", linewidth=1)
plt.xlabel(H.axis_label)
plt.ylabel(M.axis_label)
Text(0, 0.5, 'Magnetization (A / m)')
../../_images/b00fdfa264d805912e923de6c27d3a86187602a3959da8fb3b7222e20f2436ff.png
margin = 0.03 * 0.95e5  # allow 3% maximum deviation from assumed Ms=0.95e5
linear_segment_properties = mammos_analysis.hysteresis.find_linear_segment(H=H, M=M, margin=margin, min_points=3)
linear_segment_properties.plot()
<Axes: xlabel='External Magnetic Field (A / m)', ylabel='Magnetization (A / m)'>
../../_images/ea56d88d603a6a0a895db0f740f7beb74ed0d29e2a2e40cbeda12abc7be6ab7d.png

mammos_analysis.kuzmin#

Functionality to extract estimated micromagnetic properties from Ms(T) data, which could e.g. come from spin dynamics simulations.

  • We use Kuz’min equations to compute Ms(T), A(T), K1(T)

  • Kuz’min, M.D., Skokov, K.P., Diop, L.B. et al. Exchange stiffness of ferromagnets. Eur. Phys. J. Plus 135, 301 (2020). https://doi.org/10.1140/epjp/s13360-020-00294-y

  • Additional details about inputs and outputs are available in the API reference

In this notebook we will use artificial data:

T = me.T(np.linspace(0, 600, 20))
Ms_val = np.sqrt(500 - T.value, where=T.value < 500, out=np.zeros_like(T.value)) * 0.5e5
Ms_quant = Ms_val * u.A / u.m
Ms = me.Ms(Ms_quant.to("kA/m"))
plt.plot(T.q, Ms.q, "o")
plt.xlabel(T.axis_label)
plt.ylabel(Ms.axis_label)
Text(0, 0.5, 'Spontaneous Magnetization (kA / m)')
../../_images/17d4aa75fe355e68d12d2f9a3dec062ab98d27dd9a17e19f6866ef96d1e9b1b4.png
kuzmin_result = mammos_analysis.kuzmin.kuzmin_properties(T=T, Ms=Ms, K1_0=1e5)  # K1_0 is optional

We can visualize the resulting functions and compare against our input data:

kuzmin_result.plot()
array([<Axes: xlabel='Thermodynamic Temperature (K)', ylabel='Spontaneous Magnetization (kA / m)'>,
       <Axes: xlabel='Thermodynamic Temperature (K)', ylabel='Exchange Stiffness Constant (J / m)'>,
       <Axes: xlabel='Thermodynamic Temperature (K)', ylabel='Uniaxial Anisotropy Constant (J / m3)'>],
      dtype=object)
../../_images/501e68c3baf6c7aa97ecf8e02c2fb0d590c3169b6d6ef9fbf7c880a58be386d6.png
kuzmin_result.Ms.plot()
plt.plot(T.q, Ms.q, "o")
[<matplotlib.lines.Line2D at 0x7f64b2cc7ed0>]
../../_images/2910cd8e07bfe1c91576ba72246ce02d78402ed38b1a2befc8c4521b5ae30b17.png

We can also generate these plots using temperature in degree Celsius by using the celsius argument:

kuzmin_result.plot(celsius=True);
../../_images/a897bb8ef8a048a44f545e72b1cd0afd2f93047d324d488a3915e59b364f2188.png

The result object contains three functions for Ms, A, and K1. K1 is only available if we pass K1_0 to the kuzmin_properties function. Furthermore, we get an estimated Curie temperature and the fit parameter s.

kuzmin_result
KuzminResult(Ms=Ms(T), A=A(T), Tc=Entity(ontology_label='CurieTemperature', value=505.26315282138864, unit='K'), s=<Quantity 2.4534165>, K1=K1(T))

We can call the functions at different temperatures to get parameters. We can pass a mammos_entity.Entity, an astropy.units.Quantity or a number:

kuzmin_result.Ms(me.T(0))
SpontaneousMagnetization(value=1118.0339887498951, unit=kA / m)
kuzmin_result.A(100 * u.K)
ExchangeStiffnessConstant(value=2.0493757041828874e-12, unit=J / m)
kuzmin_result.K1(300)
UniaxialAnisotropyConstant(value=27234.489224661367, unit=J / m3)

We can also use an array to get data for multiple temperatures:

kuzmin_result.Ms(me.T([0, 100, 200, 300]))
SpontaneousMagnetization(value=[1118.03398875 1041.90028122  906.08222136  724.70526759], unit=kA / m)