\renewcommand\AA{\unicode{x212B}}
This function calculates the crystal field contribution to the magnetic moment as a function of temperature at a constant applied magnetic field in a specified direction, in either atomic (\mu_B//ion), SI (Am2/mol) or cgs (erg/Gauss/mol == emu/mol) units.
The magnetic moment is calculated as the thermal expectation value of the magnetic moment operator \mathbf{\mu} = g_J \mu_B \mathbf{J}:
where B is the magnetic field in Tesla, g_J is the Landé g-factor, and \mu_B is the Bohr magneton. The moment operator is defined as \mathbf{J} = \hat{J}_x B_x + \hat{J}_y B_y + \hat{J}_z B_z where \hat{J}_x, \hat{J}_y, and \hat{J}_z are the angular momentum operators in Cartesian coordinates, with z defined to be along the quantisation axis of the crystal field (which is usually defined to be the highest symmetry rotation axis). B_x, B_y, and B_z are the components of the unit vector pointing in the direction of the applied magnetic field in this coordinate system. V_n(B) and E_n(B) are the nth eigenvector and eigenvalue (wavefunction and energy) obtained by diagonalising the Hamiltonian:
where in this case the magnetic field \mathbf{B} is not normalised. Finally, \beta = 1/(k_B T) with k_B the Boltzmann constant and T the temperature, and Z is the partition sum Z = \sum_n \exp(-\beta E_n(H)).
Here is an example of how to fit M(T) to a measured dataset. All parameters disallowed by symmetry are fixed automatically. The “data” here is generated from the function itself.
The x-axis is the temperature in Kelvin, and the magnetic moment (y-axis) is in Am2/mol (SI units), and the “measurement” was done with a field of 0.01 Tesla along the [110] direction of the crystal field (not necessarily the crystallographic [110] direction).
import numpy as np
# Build a reference data set
fun = 'name=CrystalFieldMoment,Ion=Ce,B20=0.37737,B22=0.039770,B40=-0.031787,B42=-0.11611,B44=-0.12544,'
fun += 'Hmag=0.01, Hdir=(1,1,0), Unit=SI,'
# This creates a (empty) workspace to use with EvaluateFunction
x = np.linspace(1, 300, 300)
y = x * 0
e = y + 1
ws = CreateWorkspace(x, y, e)
# The calculated data will be in 'data', WorkspaceIndex=1
EvaluateFunction(fun, ws, OutputWorkspace='data')
# Change parameters slightly and fit to the reference data
fun = 'name=CrystalFieldMoment,Ion=Ce,Symmetry=C2v,B20=0.37,B22=0.04,B40=-0.032,B42=-0.12,B44=-0.13,'
fun += 'Hmag=0.01, Hdir=(1,1,0), Unit=SI,'
fun += 'ties=(B60=0,B62=0,B64=0,B66=0,BmolX=0,BmolY=0,BmolZ=0,BextX=0,BextY=0,BextZ=0)'
# (set MaxIterations=0 to see the starting point)
Fit(fun, 'data', WorkspaceIndex=1, Output='fit',MaxIterations=100, CostFunction='Unweighted least squares')
# Using Unweighted least squares fit because the data has no errors.
# Extract fitted parameters
parws = mtd['fit_Parameters']
for i in range(parws.rowCount()):
row = parws.row(i)
if row['Value'] != 0:
print("%7s = % 7.5g" % (row['Name'], row['Value']))
Output (the numbers you see on your machine may vary):
B20 = 0.37745
B22 = 0.016732
B40 = -0.032093
B42 = -0.11298
B44 = -0.12685
Cost function value = 9.7067e-18
Name | Type | Default | Description |
---|---|---|---|
Ion | String | Mandatory | An element name for a rare earth ion. Possible values are: Ce, Pr, Nd, Pm, Sm, Eu, Gd, Tb, Dy, Ho, Er, Tm, Yb. |
Symmetry | String | C1 | A symbol for a symmetry group. Setting Symmetry automatically zeros and fixes all forbidden parameters. Possible values are: C1, Ci, C2, Cs, C2h, C2v, D2, D2h, C4, S4, C4h, D4, C4v, D2d, D4h, C3, S6, D3, C3v, D3d, C6, C3h, C6h, D6, C6v, D3h, D6h, T, Td, Th, O, Oh |
powder | Boolean | false | Whether to calculate the powder averaged magnetisation or not. |
Hmag | Double | 1.0 | The applied magnetic field magnitude in Tesla (for ‘bohr’ or ‘SI’ units) or Gauss (for ‘cgs’ units). |
Hdir | Vector | (0.,0.,1.) | The direction of the applied field w.r.t. the crystal field parameters |
Unit | String | ‘bohr’ | The desired units of the output, either: ‘bohr’ (muB/ion), ‘SI’ (Am^2/mol) or ‘cgs’ (erg/G/mol). |
inverse | Boolean | false | Whether to output 1/M(T) instead of M(T). |
Name | Default | Description |
---|---|---|
BmolX | 0.0 | The x-component of the molecular field. |
BmolY | 0.0 | The y-component of the molecular field. |
BmolZ | 0.0 | The z-component of the molecular field. |
BextX | 0.0 | The x-component of the external field. |
BextY | 0.0 | The y-component of the external field. |
BextZ | 0.0 | The z-component of the external field. |
B20 | 0.0 | Real part of the B20 field parameter. |
B21 | 0.0 | Real part of the B21 field parameter. |
B22 | 0.0 | Real part of the B22 field parameter. |
B40 | 0.0 | Real part of the B40 field parameter. |
B41 | 0.0 | Real part of the B41 field parameter. |
B42 | 0.0 | Real part of the B42 field parameter. |
B43 | 0.0 | Real part of the B43 field parameter. |
B44 | 0.0 | Real part of the B44 field parameter. |
B60 | 0.0 | Real part of the B60 field parameter. |
B61 | 0.0 | Real part of the B61 field parameter. |
B62 | 0.0 | Real part of the B62 field parameter. |
B63 | 0.0 | Real part of the B63 field parameter. |
B64 | 0.0 | Real part of the B64 field parameter. |
B65 | 0.0 | Real part of the B65 field parameter. |
B66 | 0.0 | Real part of the B66 field parameter. |
IB21 | 0.0 | Imaginary part of the B21 field parameter. |
IB22 | 0.0 | Imaginary part of the B22 field parameter. |
IB41 | 0.0 | Imaginary part of the B41 field parameter. |
IB42 | 0.0 | Imaginary part of the B42 field parameter. |
IB43 | 0.0 | Imaginary part of the B43 field parameter. |
IB44 | 0.0 | Imaginary part of the B44 field parameter. |
IB61 | 0.0 | Imaginary part of the B61 field parameter. |
IB62 | 0.0 | Imaginary part of the B62 field parameter. |
IB63 | 0.0 | Imaginary part of the B63 field parameter. |
IB64 | 0.0 | Imaginary part of the B64 field parameter. |
IB65 | 0.0 | Imaginary part of the B65 field parameter. |
IB66 | 0.0 | Imaginary part of the B66 field parameter. |
Categories: FitFunctions | General