Hello,
I'm a graduate student in Jeff Neaton's group at Berkeley and am currently using Z2pack to study a few of my systems. It's been going well so far, but I had a few questions if you would be able to provide some guidance.
One of my systems is a Dirac nodal line and I wanted to compute the Berry phase using a ring around the nodal line to show it's nontrivial. I can see how to do it for the case of a single Dirac point with the Sphere in the shape module, but is that the only shape currently implemented? Is there a "ring" to use as the shape for line.run()?
The nodal line is in the kz=0 plane, so one thing I've tried so far is finding the point on the nodal line with a minimal kx value and then calculating one string around the sphere still using the surface module. However, I'm not sure how to specify I want the line to be at constant x and just traverse around the sphere in the y-z directions.
Another idea I was trying was to add a "class" to the shapes.py module for a ring, just based on the sphere one that's already there, the only difference being that I don't update the x value. (I realize this is very system specific and not a general solution). It's not clear to me how line.py actually iterates around this ring to calculate the wannier charge centres (and thereby get the Chern number).
Do either of these seem plausible? I could also send my inputs and/or errors if you want. Although if there's already something implemented I've missed please let me know...
Lastly, one quick question, would you mind clarifying if the coordinates for the centre of a sphere should be given in cartesian or direct coordinates?
Thank you in advance for any feedback!
Best, Stephanie
Hi Stephanie,
There is no built-in shape for this task. However, you can define almost any shape by providing a function which parametrizes this shape.
For lines, this function should take one parameter t in [0, 1], and return the position in reduced/direct coordinates (to answer your last question, Z2Pack always works with direct coordinates). So for example, you could create a circle in y-z coordinates with
from numpy import sin, cos, pi line.run(..., line=lambda t: [0, cos(2 * pi * t), sin(2 * pi * t)])
where obviously you need to change the function such that it actually goes around your Dirac node. To get a well-defined result, the line must be closed (in the periodic sense), meaning that f(t=1) = f(t=0) + G, where G is a reciprocal lattice vector.
The same basic principle can be applied if you want to create an arbitrary shape for a surface (described here http://z2pack.ethz.ch/doc/2.0/tutorial_surface.html). You could use this to create a torus around your nodal line. Now the full surface must be closed (in the periodic sense) to get a well-defined Chern number, and each line within the surface (which you get if you keep the first parameter constant) must also be closed.
There is actually nothing special about the classes being defined in shape.py, that's just to simplify creating this function for certain special cases. Something like a "Circle" class for lines where one could specify the position, radius and rotation angles would make perfect sense to put there. Also, if the torus approach works for your system it could make sense to make a class for that. Maybe one could give a function describing the nodal line, and it would create a torus of a certain radius enclosing it.
Feel free to let me know if you have some further questions, or you need help implementing some of this.
Best,
Dominik
On 18.05.2017 02:52, Stephanie Mack wrote:
Hello,
I'm a graduate student in Jeff Neaton's group at Berkeley and am currently using Z2pack to study a few of my systems. It's been going well so far, but I had a few questions if you would be able to provide some guidance.
One of my systems is a Dirac nodal line and I wanted to compute the Berry phase using a ring around the nodal line to show it's nontrivial. I can see how to do it for the case of a single Dirac point with the Sphere in the shape module, but is that the only shape currently implemented? Is there a "ring" to use as the shape for line.run()?
The nodal line is in the kz=0 plane, so one thing I've tried so far is finding the point on the nodal line with a minimal kx value and then calculating one string around the sphere still using the surface module. However, I'm not sure how to specify I want the line to be at constant x and just traverse around the sphere in the y-z directions.
Another idea I was trying was to add a "class" to the shapes.py module for a ring, just based on the sphere one that's already there, the only difference being that I don't update the x value. (I realize this is very system specific and not a general solution). It's not clear to me how line.py actually iterates around this ring to calculate the wannier charge centres (and thereby get the Chern number).
Do either of these seem plausible? I could also send my inputs and/or errors if you want. Although if there's already something implemented I've missed please let me know...
Lastly, one quick question, would you mind clarifying if the coordinates for the centre of a sphere should be given in cartesian or direct coordinates?
Thank you in advance for any feedback!
Best, Stephanie