Hi,
I want to use abinit to calculate and print momentum matrix elements along certain lines of the FBZ just like bandstructure.
So far I tried to use The lesson on Optic input file as it generates ddk files from which I can calculate matrix elements.
But I have 2 problems:
1. ddk output is binary and I couldn't figure out how to print it as txt file. I solved this one by modifying source code of optic to save it to txt after reading, not very elegant but it works.
2. ddk are generated only for kgrid for which I run ground state calculations, is there a way to generate it for kgrid that is determined by kptbounds? I need ddk in particular points of the FBZ.
Is there an easier way of getting those elements?
Thank you and best wishes
Jacek
momentum matrix element calculation
Moderators: mverstra, joaocarloscabreu
-
- Posts: 3
- Joined: Mon Aug 12, 2019 1:00 pm
Re: momentum matrix element calculation
Hi Jacek,
I know that some years passed since you have asked the question, but I'm still very interested in the answer. Is there any news?
I know that some years passed since you have asked the question, but I'm still very interested in the answer. Is there any news?
-
- Posts: 3
- Joined: Mon Aug 12, 2019 1:00 pm
Re: momentum matrix element calculation
I figured out a way, which is not the most efficient, but works out quite well. (I confirmed the results with data I got from vasp-calculations.)
1. As stated in the first post, you have to modify your abinit-code. Go to optic.f90 and add a command to print the dipole-data (pmat) after the call pmat_renorm command. I have no experience with fortran, so I naively did
After that, recompile your code.
2. Follow the https://docs.abinit.org/tutorial/optic/ tutorial to get the momentum matrix elements at the positions determined by ngkpt.
3. To get a finer resolution along a certain axis, just modify the kpt yourself and run the calculation multiple times at different positions. Don't forget to add Chksymbreak=0.
1. As stated in the first post, you have to modify your abinit-code. Go to optic.f90 and add a command to print the dipole-data (pmat) after the call pmat_renorm command. I have no experience with fortran, so I naively did
Code: Select all
open (unit=41, file='dipole.txt')
do i1=1, mband
do i2=1, mband
do i3=1, nkpt
do i4=1, 3
do i5=1, nsppol
write(41,*) pmat(i1,i2, i3, i4, i5)
end do
end do
end do
end do
end do
close(unit=41)
After that, recompile your code.
2. Follow the https://docs.abinit.org/tutorial/optic/ tutorial to get the momentum matrix elements at the positions determined by ngkpt.
3. To get a finer resolution along a certain axis, just modify the kpt yourself and run the calculation multiple times at different positions. Don't forget to add Chksymbreak=0.
Re: momentum matrix element calculation
Hello Theldaelis and Jacek,
There is currently no way of directly printing the momentum matrix elements.
As Jacek pointed out, you can calculate them with ABINIT and OPTIC (see the optics tutorial toptics_1.in where the wave functions and the perturbed wave functions are calculated). OPTIC then reads those wave functions and calculates the matrix elements for the entire BZ (depending on time-reversal symmetry).
The optics tutorial can be found at https://docs.abinit.org/tutorial/optic/index.html.
One could modify a local version of OPTIC to print the desired matrix elements for each k point and each band. The resulting (rather large) file could then be parsed and the desired k-points along a path could be plotted.
As far as I can tell, this method is the best way to do it.
Best of luck!
-Nick
There is currently no way of directly printing the momentum matrix elements.
As Jacek pointed out, you can calculate them with ABINIT and OPTIC (see the optics tutorial toptics_1.in where the wave functions and the perturbed wave functions are calculated). OPTIC then reads those wave functions and calculates the matrix elements for the entire BZ (depending on time-reversal symmetry).
The optics tutorial can be found at https://docs.abinit.org/tutorial/optic/index.html.
One could modify a local version of OPTIC to print the desired matrix elements for each k point and each band. The resulting (rather large) file could then be parsed and the desired k-points along a path could be plotted.
As far as I can tell, this method is the best way to do it.
Best of luck!
-Nick
Nicholas A. Pike
Research Scientist
Research Scientist