Introduction

Janus is a Python library dedicated to the discretization of the Lippmann–Schwinger equation with periodic boundary conditions. The matrix of the resulting linear system is the sum of a block-diagonal matrix and a block-circulant matrix. Following the ideas initially introduced by Moulinec & Suquet (1998) matrix-vector products can then be computed efficiently by means of the Fast Fourier Transform. A matrix-free strategy is then adopted to solve the linear system iteratively, e.g. (non-exhaustive list)

see also Moulinec & Silva (2014) for a comparison of some of these iterative schemes.

The library provides tools to define the linear operator associated to the discretized Lippmann–Schwinger equation, and to compute the necessary matrix-vector products. Third-party iterative linear solvers (Scipy, petsc4py) can then be invoked to compute the solution.

The library is designed with performance in mind. It is fully parallelized (using MPI and mpi4py), and the critical parts of the code are written in Cython.