Hi Kuang-Shing Chen,
yes, that's correct: FT(IFT) is not the identity. The Fourier transform from the frequency to the time domain uses model functions. The Fourier transform from time to frequency uses (in this implementation) a spline fitting routine.
You can, if you prefer, do a Fourier transform with a model function also from the time to the frequency domain but you will need to know your high frequency moments.
There are various points where you can read about this. Probably Nils Blümer's thesis has the most thorough description of Fourier transforms in the DMFT context (http://komet337.physik.uni-mainz.de/Bluemer/thesis.en.shtml).
Emanuel
On Dec 28, 2011, at 7:34 PM, Kuangshing Chen wrote:
Thank you Hartmut,
I just test the fourier transformation inside SemicircleHilbertTransformer::initial_G0. The initial G(tau) is defined by
std::complex<double> zeta = iw+mu+(flavor%2 ? -h : h); G0_omega(i, flavor) = (zeta - sqrt(zeta*zeta-4*tsq[flavor]))/(2*tsq[flavor]);
The code uses backward_ft to inverse fourier transform G0_tau to G0_omega, fourier_ptr->backward_ft(G0_tau, G0_omega);
If I fourier transform G0_omega back to G0_tau now, I should get the original G0_tau. But the result of the test shows different G0_tau. Again if I do fourier_ptr->backward_ft(G0_tau, G0_omega), I will get a new G0_omega'. It sounds that FT(IFT) does not equal to identity! Could you double check that for me?
Kuang-Shing Chen
On Wed, Dec 28, 2011 at 6:15 PM, Hartmut Hafermann hartmut.hafermann@cpht.polytechnique.fr wrote: Hi,
the code is correct. I have changed the comment to comply with the code. As a reference you can have a look into Emanuel's thesis, p. 138: http://e-collection.library.ethz.ch/eserv/eth:31103/eth-31103-02.pdf
Best, Hartmut
Am 29.12.2011 um 00:04 schrieb Kuangshing Chen:
Hi,
The function generate_spline_matrix in fouriertransform.C in the dmft folder shows the comments as follows:
// A is the matrix whose inverse defines spline_matrix // // 6 6 // 1 4 1 // 1 4 1 // A = ... // // 1 4 1 // -2 0 0 2
However, the following codes,
dense_matrix A = 4*dt/6.*boost::numeric::ublas::identity_matrix<double>(Np1);
for (int i=1; i<Np1-1; i++) { A(i,i-1) = dt/6.; A(i,i+1) = dt/6.; } A(0,0) = 1.; A(0, Np1-1) = 1.; A(Np1-1, 0) = -2.*dt/6.; A(Np1-1, 1) = -1.*dt/6.; A(Np1-1, Np1-2) = 1*dt/6.; A(Np1-1, Np1-1) = 2*dt/6.;
the red lines will make the matrix looks like
// 6 6 // 1 4 1 // 1 4 1 // A = ... // // 1 4 1 // -2 -1 1 2
Is the comment correct or the code correct? Any reference for this algorithm?
Thank you, Kuang-Shing Chen
-- Hartmut Hafermann
École Polytechnique Centre de Physique Theorique (CPHT) 91128 Palaiseau Cedex, France
Tel.: +33 1 69 33 42 34 Fax: +33 1 69 33 49 49
-- Kuang-Shing Chen