Hello, I came across a thread http://mpb-discuss.ab-initio.mit.narkive.com/5J6vrcdF/raw-eigenvectors where it states that MPB stores the field components of the plane wave expansion as k-G and not k+G, and it's because of fft sign choice for DFT: X[k]=sum{0<=n<N, x[n]*exp(-i*2pi/N*n*k) } I looked over at the source code and indeed it uses fft to convert from eigenvectors (spanned in reciprocal space) to fields in real space.
In my opinion, it is as if the plane wave expansion which is described in http://ab-initio.mit.edu/wiki/index.php/MPB_Developer_Information as Hk_bloch(x) = Hk(x)*exp(i*k*x) Hk(x) = sum{G, h_G*exp(i*G*x) } is wrong and should be -i*k*x and -i*G*x, and the implied time dependence (say in Meep) should be exp(+i*w*t). The reason I think it's crucial is for example when one want's to evaluate the distribution function of H at reciprocal point k+G1 where G1 is a vector of the photonic crystal lattice. If we go by the given notation above, then according to Bloch theorem we will have simply Hk_G1(x) = Hk(x)*exp(-i*G1*x) = sum{G, h_G*exp(i*(G-G1)*x) } and I can use the eigenvector components, shift them by a single index and re-evaluate the field using fft (without running MPB for k+G1) however since MPB stores the vectors of k-G, I come to the conclusion that by doing so I actually evaluates sum{G, h_G*exp(i*(-G-G1)*x) } To make things short... Should the MPB code use ifft instead of fft and vice versa? as it should be according to the notation Hk_bloch(x) = Hk(x)*exp(i*k*x) Hk(x) = sum{G, h_G*exp(i*G*x) } (it should actually be N*ifft(x) and 1/N*fft(x) to make sure norm is conserved) Respectfully, Amnon
_______________________________________________ mpb-discuss mailing list mpb-discuss@ab-initio.mit.edu http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/mpb-discuss