Eigenvectors components and relations to Bloch solutions which are outside of FBZ
Amnon Willinger <[email protected]> Sun, 3 Jan 2016 22:58:13 +0200
| Newsgroups | gmane.comp.science.photonic-bands |
|---|---|
| Message-ID | <CAJHp0iEkBwUaNPT6rdmK3uSeC_V4JQfoU+6epM5x_0HhnHJFHw@mail.gmail.com> |
--===============1854512720596287203==
Content-Type: multipart/alternative; boundary=001a114fcea00b199f0528744595
--001a114fcea00b199f0528744595
Content-Type: text/plain; charset=UTF-8
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
--001a114fcea00b199f0528744595
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"rtl"><div dir=3D"ltr">Hello,</div><div dir=3D"ltr">I came acros=
s a thread</div><div dir=3D"ltr"><a href=3D"http://mpb-discuss.ab-initio.mi=
t.narkive.com/5J6vrcdF/raw-eigenvectors" target=3D"_blank">http://mpb-discu=
ss.ab-initio.mit.narkive.com/5J6vrcdF/raw-eigenvectors</a><br></div><div di=
r=3D"ltr">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:</div><div dir=3D"ltr">X[k]=3Dsum{0<=3Dn<N, x[n]*exp(-i*2pi/=
N*n*k) }=C2=A0</div><div dir=3D"ltr">I looked over at the source code and i=
ndeed it uses fft to convert from eigenvectors (spanned in reciprocal space=
) to fields in real space.</div><div dir=3D"ltr"><br></div><div dir=3D"ltr"=
>In my opinion, it is as if the plane wave expansion which is described in=
=C2=A0</div><div dir=3D"ltr"><a href=3D"http://ab-initio.mit.edu/wiki/index=
.php/MPB_Developer_Information" target=3D"_blank">http://ab-initio.mit.edu/=
wiki/index.php/MPB_Developer_Information</a><br></div><div dir=3D"ltr">as=
=C2=A0</div><div dir=3D"ltr">Hk_bloch(x) =3D Hk(x)*exp(i*k*x)</div><div dir=
=3D"ltr">Hk(x) =3D sum{G, h_G*exp(i*G*x) }</div><div dir=3D"ltr"><br></div>=
<div dir=3D"ltr">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).</div><div dir=3D"ltr">=
<br></div><div dir=3D"ltr">The reason I think it's crucial is for examp=
le when one want's to evaluate the distribution function of H at recipr=
ocal 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 ha=
ve simply=C2=A0</div><div dir=3D"ltr">Hk_G1(x) =3D Hk(x)*exp(-i*G1*x) =3D s=
um{G, h_G*exp(i*(G-G1)*x) }</div><div dir=3D"ltr"><br></div><div dir=3D"ltr=
">and I can use the eigenvector components, shift them by a single index an=
d re-evaluate the field using fft (without running MPB for k+G1)</div><div =
dir=3D"ltr"><br></div><div dir=3D"ltr">however since MPB stores the vectors=
of k-G, I come to the conclusion that by doing so I actually evaluates</di=
v><div dir=3D"ltr">sum{G, h_G*exp(i*(-G-G1)*x) }<br></div><div dir=3D"ltr">=
<br></div><div dir=3D"ltr">To make things short...</div><div dir=3D"ltr">Sh=
ould the MPB code use ifft instead of fft and vice versa? as it should be a=
ccording to the notation</div><div dir=3D"ltr"><div dir=3D"ltr">Hk_bloch(x)=
=3D Hk(x)*exp(i*k*x)</div><div dir=3D"ltr">Hk(x) =3D sum{G, h_G*exp(i*G*x)=
}</div></div><div dir=3D"ltr">(it should actually be N*ifft(x) and 1/N*fft=
(x) to make sure norm is conserved)</div><div dir=3D"ltr"><br></div><div di=
r=3D"ltr">Respectfully,</div><div dir=3D"ltr">Amnon</div></div>
--001a114fcea00b199f0528744595--
--===============1854512720596287203==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: inline
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbXBiLWRpc2N1
c3MgbWFpbGluZyBsaXN0Cm1wYi1kaXNjdXNzQGFiLWluaXRpby5taXQuZWR1Cmh0dHA6Ly9hYi1p
bml0aW8ubWl0LmVkdS9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vbXBiLWRpc2N1c3M=
--===============1854512720596287203==--