The first step towards computing the effective mass is to be able to compute the band structure E(k) for a given k, instead of a route. This function (class, really) is provided in the attached script.
To use this to compute the effective mass is both trivial and rather tricky. All you really need to do is provide this function with some k-points that lie in the correct direction, say 21 points that span a smallish interval around the k point that corresponds to the conduction/valence band minimum/maximum, compute E(k) for these points, then fit a parabola through the points. This can be done using numpy, or you can just do it in Excel. Oh, you also need the band index, for which to extract the energies, but that's just the number of electrons in the system divided by two (remember, we are talking about semiconductors here!).
The tricky parts are:
- Putting the k-points in the correct direction, esp. for the transverse masses
- Getting the metric right, i.e. what are the actual k-points, in Cartesian (reciprocal) coordinates
The first point actually makes it very hard to make a "simple" black box script that just computes the effective masses. The appropriate "longitudinal" and "transverse" directions depends on the situation, and as a user you must carefully consider which reciprocal vectors to direct the k-points along.
For example, for Si we can read in many papers that the conduction band minimum lies about 85% of the way on the Delta symmetry line towards the X point. Now, you can further read in some places (e.g.
here, if you enter 225 for the space group), that the X point in the fcc lattice lies at (0,1,0) in "conventional ITA notation". However, in primitive notation, which is what we use in ATK, it's (½,0,½). Thus the Delta valley minimum is at (0.425,0,0.425), which (normalized) becomes the longitudinal direction.
(Actually, the referenced website, which is an excellent reference for space group symmetries, recently made some updates to make the symmetry point notation a bit clearer. It was much harder to distinguish the primitive and conventional coordinates before.)
But what to choose for the transverse direction? It should be two vectors perpendicular to the longitudinal direction, but we cannot compute that in the non-orthogonal coordinate system spanned by the reciprocal fcc vectors (which of course span a bcc cell). We have to do it in the corresponding conventional cell (simple cubic), i.e. find two vectors perpendicular to (0,1,0). This is simple enough, of course we choose (1,0,0) and (0,0,1), again in
conventional notation. Converting these to the corresponding (unnormalized) primitive directions, we get (0,1,1) and (1,1,0). Note how these do not appear to be perpendicular to (1,0,1), but that's because the bcc metric is not orthogonal!
Also, the "effective mass" as such is not a completely well-defined concept: do you mean the DOS mass, or the conductivity mass, or what? Notably, in order to compute these you need the mass along several different directions, and as elaborated on above, the script can not really be expected to find these out by itself.
So, one can't deliver the effective mass calculation as a "simple function", because there are several key decisions that need to be made by the user. At the very minimum, we will need to ask for the 3 directions as input, instead of (as before, incorrectly) assuming we can compute them inside the function.
I will return with some more details soon, on how to do the parabolic fitting etc. But I have to think about how to design the user interface so that it is, at the same time, easy to use, but does not present itself as a black box - because it is just not a well-defined question to ask for "the" effective mass for a given system (or even k-point).
(@ramkrishna, I noticed you wrote 11.2.2 in the first post; if you haven't done so, you really should upgrade to ATK 11.2.3, it's free of charge! Some critical bugs were fixed.)