I came across a thread
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
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

mpb-discuss mailing list

Reply via email to