/******************************************************************************* * * TRIQS: a Toolbox for Research in Interacting Quantum Systems * * Copyright (C) 2011 by M. Ferrero, O. Parcollet * * TRIQS is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * TRIQS. If not, see . * ******************************************************************************/ #pragma once #include "brillouin_zone.hpp" #include namespace triqs { namespace lattice { /** For tightbinding Hamiltonian with fully localised orbitals Overlap between orbital is taken as unit matrix. */ class tight_binding { bravais_lattice bl_; std::vector> all_disp; std::vector> all_matrices; public: /// tight_binding(bravais_lattice const& bl, std::vector> all_disp, std::vector> all_matrices); /// Underlying lattice bravais_lattice const& lattice() const { return bl_; } /// Number of bands, i.e. size of the matrix t(k) int n_bands() const { return bl_.n_orbitals(); } // calls F(R, t(R)) for all R template friend void foreach(tight_binding const& tb, F f) { int n = tb.all_disp.size(); for (int i = 0; i < n; ++i) f(tb.all_disp[i], tb.all_matrices[i]); } // a simple function on the domain brillouin_zone struct fourier_impl { tight_binding const& tb; const int nb; using domain_t = brillouin_zone; brillouin_zone domain() const { return {tb.lattice()}; } template matrix operator()(K const& k) { matrix res(nb, nb); res() = 0; foreach(tb, [&](std::vector const& displ, matrix const& m) { double dot_prod = 0; int imax = displ.size(); for (int i = 0; i < imax; ++i) dot_prod += k(i) * displ[i]; //double dot_prod = k(0) * displ[0] + k(1) * displ[1]; res += m * exp(2_j * M_PI * dot_prod); }); return res; } }; fourier_impl friend fourier(tight_binding const& tb) { return {tb, tb.n_bands()}; } }; // tight_binding /** Factorized version of hopping (for speed) k_in[:,n] is the nth vector In the result, R[:,:,n] is the corresponding hopping t(k) */ array hopping_stack(tight_binding const& TB, arrays::array_const_view k_stack); // not optimal ordering here std::pair, array> dos(tight_binding const& TB, int nkpts, int neps); std::pair, array> dos_patch(tight_binding const& TB, const array& triangles, int neps, int ndiv); array energies_on_bz_path(tight_binding const& TB, k_t const& K1, k_t const& K2, int n_pts); array energies_on_bz_grid(tight_binding const& TB, int n_pts); } }