spirit-code / spirit

Atomistic Spin Simulation Framework
http://spirit-code.github.io
MIT License
120 stars 53 forks source link

Question on spin transfer torque #607

Open sfragkos opened 2 years ago

sfragkos commented 2 years ago

Dear Spirit users and developers,

I want to study current-driven dynamics of skyrmions. What are the units of spin transfer torque u, that I give as an input in the GUI, to simulate the current injection?

Do you have any example of a reasonable range of values that I could insert for my study?

Best regards,

Sotirios Fragkos

sfragkos commented 2 years ago

Can someone please tell me what are the units of spin transfer torque u, that I give as an input in the GUI???

GPMueller commented 2 years ago

Dear Sotirios, sorry for the late reply, but it's actually a feature we rarely used and don't know the units by heart. We obviously should have documented it better.

I believe this is the relevant equation grafik and you can read up on the details in this thesis. I hope that will allow you to figure out the correct units.


To make sure you have your units correct, I would suggest that you compare equation (10) from Phys. Rev. B 99, 224414 (2019) (arxiv version in case you don't have access to PRB) to the implementation, https://github.com/spirit-code/spirit/blob/14ed7782bd23f4828bf23ab8136ae31a21037bb3/core/src/engine/Method_LLG.cpp#L185-L202

But note the corresponding factors and that the difference between STT and SOT, which is here expressed as gradient (i.e. bulk current) vs monolayer-approximation: https://github.com/spirit-code/spirit/blob/14ed7782bd23f4828bf23ab8136ae31a21037bb3/core/src/engine/Method_LLG.cpp#L155-L162

Note also figure 6 in the paper, which reproduces results from previous literature.

sfragkos commented 2 years ago

Dear G. P. Mueller,

Thank you for your answer.

In both Gradient and Monolayer method a_j seems to play key role in the implementation. https://github.com/spirit-code/spirit/blob/14ed7782bd23f4828bf23ab8136ae31a21037bb3/core/src/engine/Method_LLG.cpp#L185-L202

In the implementation you also mention:

// STT 
// - monolayer 
scalar **a_j = parameters.stt_magnitude**; 
Vector3 s_c_vec = parameters.stt_polarisation_normal; 
// - gradient 
scalar **b_j = a_j**;    // pre-factor **b_j = u*mu_s/gamma** (see bachelorthesis Constantin) 
scalar beta = parameters.beta;  // non-adiabatic parameter of correction term 
Vector3 je = s_c_vec;// direction of current 

In the case of monolayer method, it seams that the stt_magnitude refers to a_j, which has units of magnetic field (Tesla) accoring to P. Chureemart et al. (PRB 83, 184416 (2011)).

But in gradient method you mention:

b_j = a_j;    // pre-factor b_j = u*mu_s/gamma 

Here b_j, according to b_j = u*mu_s/gamma, has units of EnergySpatial_dimensions (eV times meter???), which doesn't make sense. According to Zhang-Li model and your paper P. Chureemart et al. (PRB 83, 184416 (2011)), STT is described by a_j which has units of Magnetic field and it's proportional to the injected current density , and not from some b_j which is equal to a_j = umu_s/gamma

In some line of the "Gradient method" you also comment: //replace a_j with b_j But the only definition of b_j in the code is that it is equal to a_j, where a_j is just the stt_magnitude, probably with units of magnetic field. Is that correct?

Therefore, shouldn't this mean that the input parameter llg_stt_magnitude is actually in Tesla for both gradient and monolaer methods?

Thank you very much

PS: The thesis you are referring complicates things. It uses a lot the u*mu_s/gamma but doesnt use any clear definition (and also no units). Sometimes is referred as STT, or spin current, or current density, or as something proportional to STT or spin current.

sfragkos commented 2 years ago

I looked at it a little bit more at the code and I finally believe that:

For both Gradient and Monolayer, the input is a_j and has units of energy. The a_j in P. Chureemart et al. is in Tesla because it is devided by mu_B.

Now the question is: a_j is in eV or meV?

I guess it is in meV because the parameters in Hamiltonian are also set in meV.

Do you think this is correct?

GPMueller commented 2 years ago

dt is in picoseconds, gamma has units of rad/(ps T) and mu_B has units of meV/T. `dtg = parameters.dt Constants::gamma / Constants::mu_B / (1 + damping*damping)` should therefore have units of rad/meV.

I believe the resulting force_virtual should have units of rad, which which brings me to the same conclusion you arrived at: that u is in meV.

Please note that I haven't worked on this topic in about 3 years, so please verify this yourself. In the end, the units should also match with the equation grafik which lets you calculate the current density |j_e| corresponding to your choice of u.

sfragkos commented 2 years ago

Thank you very much.

I have one last question. j_e is referring to electron current density or to spin current density? If its electron current density, shouldn't Spin Hall angle be present in the equation below? image