Fourier transforms

Synopsis

Here is a synopsis (V = imfreq, imtime, refreq, retime):

auto fourier(gf_const_view<V, T> g);
auto fourier(gf_const_view<V, T> g, array_const_view<dcomplex, 1 + T::rank> known_moments);

gf<adj(V), T> make_gf_from_fourier(gf_const_view<V, T> g);
gf<adj(V), T> make_gf_from_fourier(gf_const_view<V, T> g, gf_mesh<V> m);
gf<adj(V), T> make_gf_from_fourier(gf_const_view<V, T> g, gf_mesh<V> m, array_const_view<dcomplex, 1 + T::rank> known_moments);

fourier

The fourier function does not perform the Fourier transformation, but returns a small lazy object (basically saying “Fourier Transform of XXX”), which is then used in an assignment of a view of a gf.

The reason is the following: when putting e.g. a Fourier transform of a function in time, say gt, into a Green function in frequencies, say gw, we want to say something like:

gw = fourier(gt); // ??? (1)

However, if the fourier function performs the transformation, how could it know the details of the mesh of gw ? That information is not available when calling fourier.

Since fourier returns a small lazy object, the library can then rewrite (1) internally into something like

call_the_fourier_implementation(gt, gw);

where all the information about the mesh of gw is now available to the implementation.

Moreover, since fourier(gt) does not possess a domain (for the same reason), (1) makes no sense: RHS of gf assignment requires a domain (cf concepts). We therefore use a view as LHS:

gw() = fourier(gt); // correct usage.

make_gf_from_fourier

In the case where we want to create a new container from the fourier transform of gt, we can use the function make_gf_from_fourier.