TRIQS / triqs

a Toolbox for Research on Interacting Quantum Systems
https://triqs.github.io
GNU General Public License v3.0
142 stars 72 forks source link

Creating gf_mesh<cyclic_lattice> and gf_mesh<brillouin_zone> that are compatible with each other #556

Closed HugoStrand closed 1 year ago

HugoStrand commented 6 years ago

Dear All,

I am trying to use Fourier transform to go back and forth between momentum and real space representations of lattice Green's functions. However, I have not found a generic way of making 'gf_meshe's that in one space that is directly compatible with a given Green's function in the other space.

I think i would make sense to have gf_mesh<...> constructors for both types taking the other type.

Would this be possible to do and make sense?

Best, Hugo

tayral commented 6 years ago

Hi Hugo, I had replied to your post via email a couple of days ago, but apparently the reply got lost somewhere... So here it is, if it still useful:

I think gf_mesh and gf_mesh should do the job. They are meant to describe reciprocal and real space meshes in the general case, i.e meshes corresponding to Bravais lattices with generic periodic boundary conditions (in fact, "Betts clusters"). Usually, the superlattice vectors corresponding to the PBCs are collinear with the Bravais unit vectors, but it may not always be the case.

The two constructors

gf_mesh(bravaislattice const& bl, matrix const & periodizationmatrix)

gf_mesh(brillouinzone const& bz, matrix const & periodizationmatrix)

are "mirrors" of each other. In both cases, the periodization matrix holds the coordinates of the vectors describing the periodic boundary conditions in units of the "unit vectors" of the mesh, be it in real or reciprocal space.

In real space, the meaning of the periodization_matrix is clear: For instance, if you want to describe a 10x10x10 cubic lattice with "usual" PBC (collinear PBC vectors), the bravais_lattice bl has unit vectors of coordinates (1,0,0), (0,1,0), (0,0,1), and the periodization matrix is the array([[10,0,0],[0,10,0],[0,0,10]]).

In reciprocal space: the corresponding gf_mesh is meant as follows: the reciprocal lattice has the corresponding brillouin_zone bz (the reciprocal of the bravais_lattice), and the periodization_matrix is still the array ([[10,0,0],[0,10,0],[0,0,10]]) (the first Brillouin zone contains 10x10x10 points). The unit vectors of the corresponding k-mesh are then computed so that the cartesian coordinates of the (reciprocal) PBC vectors are (2PI, 0, 0), (0, 2PI, 0), (0, 0, 2PI), as they should be. In this case, the unit vectors will be (2PI/10, 0,0), (0, 2PI/10, 0), (0,0,2PI/10).

The philosophy behind these classes can be found e.g in doi:10.3929/ethz-a-010657714, pp 23 sq. I can also give you more details directly.

As for the FT in a general Betts cluster, it is not as straightforward as for the particular cases one usually looks at (collinear PBC). In the collinear-PBC case, the FFTW as currently implemented already works. The subtleties of the general case are described p26 of the above ref., and are not yet implemented. I also have more details if needed.

Does it answer your question?

Thomas

Wentzell commented 1 year ago

You can now use the functions make_adjoint_mesh(..) in both Python and C++ to achieve this goal.