romerogroup / pyprocar

A Python library for electronic structure pre/post-processing
GNU General Public License v3.0
165 stars 72 forks source link

Fermi surface not aligned with Brillouin zone, and not centered at Gamma point? #60

Open alpinnovianus opened 2 years ago

alpinnovianus commented 2 years ago

Dear PyProCar experts,

I am having weird Fermi surface that is not centered with the Brillouin zone boundary.

(see Screenshot file here:) https://drive.google.com/drive/folders/18_LiACSNKPMapAEMmNWebd7D8bxE-I57?usp=sharing

My structure is symmetric in x- and y-direction. See CONTCAR in the above link.

Also, I was expecting the Fermi surface to be drawn centered at Gamma point (see expectation.jpg), but the figure i obtained with pyprocar seems to be centered at M point instead.

The PROCAR and OUTCAR I use to draw the Fermi Surface can be found in the above link as well.

May I know what might have been wrong?

lllangWV-zz commented 2 years ago

Hey alpinnovianus!

Could you provide the KPOINT file as well? I'll try to diagnose what is going on.

Logan Lang

alpinnovianus commented 2 years ago

Hi Logan Lang,

I added KPOINT, INCAR, and POTCAR in the linked folder.

Meanwhile, I used c2x and I could produce a bxsf file to be plotted with other software such as fermisurfer and I got the expected figure. I also added this bxsf file in the folder link (NM.bxsf).

Strangely, I couldn't instruct pyprocar to only read this bxsf file. (the bxsf file cannot be used alone, the PROCAR and OUTCAR is needed to execute pyprocar.fermi3D() )

I think it should be made possible to ask pyprocar to plot plain Fermi Surface with only bxsf input (i.e. without PROCAR/OUTCAR in the directory).

Anyway, regardless whether pyprocar.fermi3D() is executed with or without specifying the bxsf file path, the misalignment from pyprocar still occurs in my case.

lllangWV-zz commented 2 years ago

I found the issue. It is because there is a kpoint component with a magnitude exactly 0.500. This is related to shifts of the grid, and the way we generate the isosurface. I am about to go teach, and I can fix this after(around 3pm est)

In isosurface.py line 362 { if np.any(self.XYZ >= 0.5): } needs to be {if np.any(self.XYZ > 0.5):}

In fermisurface3d.py line 106 {if np.any(self.kpoints >= 0.5):} needs to be f np.any(self.kpoints > 0.5):

There are other similar changes in fermisurface3d.py in lines (188,312,431)

lllangWV-zz commented 2 years ago

image I believe I got it now alpinnovianus! I'm going to go ahead and push the changes now

lllangWV-zz commented 2 years ago

I'm looking into the bxsf issue now. For bxsf files you need to set (code = "bxsf", infile = "NM.bxsf") This is the code I am running: pyprocar.fermi3D( mode='plain', interpolation_factor=2, code = "bxsf", infile="NM.bxsf", vmin=0, vmax=1, )

I believe there is an issue with the regular expression parsing, I will try to resolve this and get back to you as soon as possible!