Fitting susceptibility data with CrystalField

Hello,
I have a question regarding CrystalField susceptibility fits in Mantid, and the relationship between Lambda and the molecular fields BmolX,Y,Z.

I’m learning from CrystalFieldSusceptibility
Crystal Field Python Interface

This is part of my code:

fun = ‘name=CrystalFieldSusceptibility,Ion=Ce,Symmetry=D2d,’
fun += 'B20 = 3.7, B40 = -0.05, B44 = 0.6, BextX=5, Lambda=0.1, ’ # Starting values
fun += ‘ties=(BextX=5),’
fun += ‘ties=(BextY=0,BextZ=0),’
fun += ‘ties=(BmolY=0,BmolZ=0),’ # BolX is left free
fun += ‘Hdir=(1,0,0), Unit=cgs, inverse=0’

Fit(Function=fun,
InputWorkspace=‘data_exp’, WorkspaceIndex=0, Output=‘fit’, MaxIterations=10,
OutputCompositeMembers=True, CostFunction=‘Unweighted least squares’,)

This gives me a fitted value of Lambda, and what I assume is a calculated value of BmolX (BmolY and BmolZ are tied to 0). If I understand correctly, Bmol is defined as Bmol = λ/M, where Lambda is a temperature independent parameter, and M is a value of magnetization calculated at some temperature. Therefore, the value of BmolX stored in the fit_Parameters workspace corresponds to that specific temperature (?).
Is this reasoning correct? At what temperature are the M and Bmol values calculated? Can I somehow retrieve that value of temperature from any of the Mantis workspaces (I couldn’t manage to do that)?
Thanks in advance.

Hi 3he4he,

Unfortunately the code is a bit disjointed and Bmol and lambda are two parameters which try to do the same thing (account phenomenologically for exchange interactions which the single-ion CEF calculation cannot calculate) in two different parts of the code:

Bmol is used in the calculation of the CEF Hamiltonian itself by adding an extra “internal” magnetic field as described in this part of the documentation.

lambda is used only in the calculation of the magnetic susceptibility after the CEF Hamiltonian has been calculated and diagonalised to get the eigenvalues En and eigenvectors Vn in the first equation in this part of the susceptibility docs. Now, this equation is derived using perturbation theory and assumes that the Zeeman term in the base Hamiltonian is zero (i.e. it does not enter into En and Vn and can be treated perturbatively).

Therefore if you include a non-zero Bmol (or Bext) in the calculation, it invalidates this assumption and makes the calculation invalid.

So, you should use the lambda parameter only and set all Bmol and Bext to zero. If you need to use Bmol or Bext, I would recommend to use the CrystalFieldMoment function instead (docs here). This function computes the magnetic moment without using perturbation theory by diagonalising the full CEF+Zeeman Hamiltonian and calculating the thermal expectation value of the induced moment. The down-side of this approach is that it is not valid in the limit as the applied/internal field tends to zero which is why we have the CrystalFieldSusceptibility function.

Best wishes,

Duc

Hi mducle,
Thanks a lot for the detailed response. I had totally missed part of the documentation. I will take a look at it, and re-think how I’m using the functions, and I will probably get back to you with more questions.
(Edited my previous response after re-reading your explanation and docs)

Dear Duc,

I followed you advice, and made fits to my data, both using CrystalFieldSusceptibility varying Bnm and lambda (it looks good), and then I tried with CrystalFieldMoment following the example you mentioned in the function documentation. As in the example, I started with ties in all the Bext and Bmol paramenters, only setting
fun += 'Hmag=0.2, Hdir=(1,0,0), Unit=SI,'
fun += 'ties=(BmolX=0,BmolY=0,BmolZ=0,BextX=0,BextY=0,BextZ=0)'
As expected, only the Bnm were fit.

Then I tried removing ties. For example, if I remove BmolX from ties, it is ignored. And if I give an initial value, for example, BmolX=0.1 or BextX=0.1, it just prints BmolX = 0.1 ± inf or BextX = 0.1 ± inf, without changing during the fit. The energy levels do change, which makes me think that Bmol and Bext are not fitted, but only used in calculating the states.

Also, I cannot see in the documentation the difference between, let’s say, Hmag=1, Hdir=(1,0,0) and BextX=1.

Hopefully I managed to explained myself…