# Table of contents

Back to the main page Back to the documentation 1. Overview: Grid operations 2. Smoothing 3. Whitening 4. Convolutions

# Overview: Grid operations

Some common operations on grids.

# Smoothing

Smooth the grid by Fourier transforming and applying a filter. The filter can be sharpk ($H(1-kR)$, i.e. $0$ for $kR > 1$ and $1$ otherwise), tophat (the Fourier transform of $H(R-x)$ in 2D or 3D) or gaussian ($e^{-\frac{1}2{}(kR)^2}$) or add your own.

template<int N> void smoothing_filter_fourier_space( FFTWGrid<N> & fourier_grid, double smoothing_scale, std::string smoothing_method)

# Whitening

Transform a grid to Fourier space, normalize all modes such that $|f(k)| = 1$ and transform back (the method below does just the middle part).

template<int N> void whitening_fourier_space(FFTWGrid<N> & fourier_grid); // When starting in real-space grid.fftw_r2c(); whitening_fourier_space(grid); grid.fftw_c2r();

# Convolutions

Convolve the grid (in real space) with an arbitary (compact) kernel:

template<int N, int ORDER, class T> void convolve_grid_with_kernel( const FFTWGrid<N> & grid_in, FFTWGrid<N> & grid_out, std::function<FloatType(std::vector<double> &am; dx)> & convolution_kernel);

The argument to the kernel is how far away the point is from the cell in units of the cell-size so the NGP kernel would be $1$ if all $|dx_i| < 0.5$ and zero otherwisee. ORDER is how wide the kernel is (how many grid-cells; this is needed to limit the number of cells we visit).

We can also perform convolutions of two grids in real and fourier space (using Fourier transforms):

template <int N> void convolution_fourier_space(const FFTWGrid<N> & fourier_grid_f, const FFTWGrid<N> & fourier_grid_g, FFTWGrid<N> & fourier_grid_result); template <int N> void convolution_real_space(const FFTWGrid<N> & real_grid_f, const FFTWGrid<N> & real_grid_g, FFTWGrid<N> & real_grid_result);

This is computing the grids $F(k) = \int d^N q f(q)g(k-q)$ and $F(x) = \int d^N y f(x)g(x-y)$ respectively. This requires three Fourier tranforms and one temporary grid (we don't touch the input grids).