Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question on spin transfer torque #607

Open
sfragkos opened this issue Jan 4, 2022 · 6 comments
Open

Question on spin transfer torque #607

sfragkos opened this issue Jan 4, 2022 · 6 comments

Comments

@sfragkos
Copy link

sfragkos commented Jan 4, 2022

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
Copy link
Author

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

@GPMueller
Copy link
Member

GPMueller commented Feb 4, 2022

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,

if (a_j > 0)
{
if (parameters.stt_use_gradient)
{
auto& boundary_conditions = this->systems[0]->hamiltonian->boundary_conditions;
// Gradient approximation for in-plane currents
Vectormath::directional_gradient(image, geometry, boundary_conditions, je, s_c_grad); // s_c_grad = (j_e*grad)*S
Vectormath::add_c_a ( dtg * a_j * ( damping - beta ), s_c_grad, force_virtual); // TODO: a_j durch b_j ersetzen
Vectormath::add_c_cross( dtg * a_j * ( 1 + beta * damping ), s_c_grad, image, force_virtual); // TODO: a_j durch b_j ersetzen
// Gradient in current richtung, daher => *(-1)
}
else
{
// Monolayer approximation
Vectormath::add_c_a (-dtg * a_j * ( damping - beta ), s_c_vec, force_virtual);
Vectormath::add_c_cross(-dtg * a_j * ( 1 + beta * damping ), s_c_vec, image, force_virtual);
}
}

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:

// 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

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

@sfragkos
Copy link
Author

sfragkos commented Feb 5, 2022

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.

if (a_j > 0)
{
if (parameters.stt_use_gradient)
{
auto& boundary_conditions = this->systems[0]->hamiltonian->boundary_conditions;
// Gradient approximation for in-plane currents
Vectormath::directional_gradient(image, geometry, boundary_conditions, je, s_c_grad); // s_c_grad = (j_e*grad)*S
Vectormath::add_c_a ( dtg * a_j * ( damping - beta ), s_c_grad, force_virtual); // TODO: a_j durch b_j ersetzen
Vectormath::add_c_cross( dtg * a_j * ( 1 + beta * damping ), s_c_grad, image, force_virtual); // TODO: a_j durch b_j ersetzen
// Gradient in current richtung, daher => *(-1)
}
else
{
// Monolayer approximation
Vectormath::add_c_a (-dtg * a_j * ( damping - beta ), s_c_vec, force_virtual);
Vectormath::add_c_cross(-dtg * a_j * ( 1 + beta * damping ), s_c_vec, image, force_virtual);
}
}

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 = u
mu_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
Copy link
Author

sfragkos commented Feb 6, 2022

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
Copy link
Member

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
Copy link
Author

sfragkos commented Feb 7, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants