I would like to add an FFT accelerated far field calculation to the Python interface. It would calculate the Fraunhofer far field approximation which is valid for large distances >> lambda. The current nf2ff implementation calculates the exact far field, given a certain radius. This approach accounts for the radiating near field
. The reactive near field
should be enclosed by the FDTD domain anyway.
However, in many cases one is interested in the far field for very large radii >> lambda. In these cases the Fraunhofer approximation is valid. I.e. the field at a point can be obtained by just multiplying the angular distribution
by exp(-jkr)/r. The former can be obtained via FFT. The advatage would be a fast calculation for many directions (phi-theta-combinations), in fact as many as we have sampling points on the faces of the nf2ff box. The disadvantage would be inaccuracies when r is not so much larger than lambda.
Technically we can do this by introducing a new keword for nf2ff.CalcNF2FF, e.g. "method". It could take the the values "exact" (default) which is the current nf2ff implementation. When it takes the value "Fraunhofer", a class _nf2ff_Fraunhofer would be used instead of _nf2ff. The former can be a subclass of the latter. Although a certain radius is not needed for the Fraunhofer approximation, the given radius can be used for the calculation of the field at a dedicated point via the above multiplication.
Do you think this would be a proper way for the implementation? Do you think this is a desirable feature at all?
PS: There would be a nice offspring. When the angular distribution is known, it would be easy to implement a method which calculates the field of paraxial beams (e.g. Gaussian beams or the radiation patterns of strongly directional antennas) in arbitrary planes outside the FDTD domain. This in turn can be the beginning of a physical optics extension (mirrors, lenses and the like).