7#include <triqs/tight_binding/tb_hamiltonian.hpp>
9#include <triqs/mesh/imfreq.hpp>
11#include "triqs/lattice/bz_integrators.hpp"
12#include "triqs/lattice/gloc.hpp"
15#include <triqs/gfs/functions/density.hpp>
17#include "triqs/tight_binding/superlattice.hpp"
21 using namespace triqs::tb;
22 using namespace triqs::lattice;
30 std::vector<tb_hamiltonian>
H;
51 std::vector<atomic_orbs> atomic_shells);
66 spin_kind_e spin_kind, std::vector<atomic_orbs> atomic_shells);
72 std::vector<atomic_orbs> atomic_shells);
82 nda::array<nda::matrix<dcomplex>, 2>
Hloc(std::vector<tb_hamiltonian>
const &H_sigma, std::vector<atomic_orbs>
const &atomic_shells);
135 template <
typename Mesh>
136 block2_gf<Mesh, matrix_valued>
gloc(
one_body_elements_tb const &obe,
double mu, block2_gf<Mesh, matrix_valued>
const &Sigma_dynamic,
137 nda::array<nda::matrix<dcomplex>, 2>
const &Sigma_static, triqs::lattice::bz_int_options
const &opt) {
139 auto &mesh = Sigma_dynamic(0, 0).mesh();
143 if (n_sigma != Sigma_static.shape(1)) {
throw std::runtime_error(
"Mismatch between the spin channels in Sigma_Static and Sigma_Dynamic"); }
144 if (n_sigma != obe.
H.size()) {
throw std::runtime_error(
"Mismatch between the spin channels in Sigma and spin channels in Hamiltonian."); }
147 auto embedding_decomp =
get_struct(Sigma_dynamic).dims(
r_all, 0) | tl::to<std::vector>();
149 for (
auto sigma : range(n_sigma)) {
152 auto Sigma_full_space = gfs::gf(mesh, {obe.
H[sigma].n_orbitals(), obe.
H[sigma].n_orbitals()});
154 for (
auto [n, w] : enumerate(mesh)) {
155 Sigma_full_space.data()(n, R, R) = Sigma_dynamic(block, sigma).data()(n,
r_all,
r_all) + Sigma_static(block, sigma);
159 gloc_result(0, sigma) = triqs::lattice::gloc(obe.
H[sigma], mu, Sigma_full_space, opt);
177 template <
typename Mesh>
178 block2_gf<Mesh, matrix_valued>
gloc(Mesh
const &mesh,
one_body_elements_tb const &obe,
double mu, triqs::lattice::bz_int_options
const &opt) {
180 for (
auto sigma : range(obe.
C_space.
n_sigma())) { result(0, sigma) =
gloc(mesh, obe.
H[sigma], mu, opt); }
200 template <
typename Mesh>
202 nda::array<nda::matrix<dcomplex>, 2>
const &Sigma_static, triqs::lattice::bz_int_options
const &opt) {
208 auto Gloc =
gloc(obe, mu, Sigma_dynamic, Sigma_static, opt);
210 for (
auto sigma : range(n_sigma)) {
211 n += real(nda::trace(
density(Gloc(0, sigma))));
232 template <
typename Mesh>
234 nda::array<nda::matrix<dcomplex>, 2>
const &Sigma_static, triqs::lattice::bz_int_options
const &opt,
235 std::string method =
"dichotomy",
double precision = 1.e-5,
bool verbosity =
true) {
236 std::function<double(
double)> f = [&obe, &Sigma_dynamic, &Sigma_static, &opt](
double x) {
237 return density(obe, x, Sigma_dynamic, Sigma_static, opt);
239 return std::get<0>(
triqs::root_finder(method, f, 0.0, target_density, precision, 0.5, 1000,
"Chemical Potential",
"Total Density", verbosity));
256 template <
typename Mesh>
258 triqs::lattice::bz_int_options
const &opt, std::string method =
"dichotomy",
double precision = 1.e-5,
259 bool verbosity =
true) {
262 auto Sigma_static = nda::array<nda::matrix<dcomplex>, 2>(1, obe.
C_space.
n_sigma());
263 for (
auto [i, j] : Sigma_static.indices()) { Sigma_static(i, j) = nda::zeros<dcomplex>(obe.
C_space.
dim(), obe.
C_space.
dim()); }
264 return find_chemical_potential(target_density, obe, Sigma_dynamic, Sigma_static, opt, method, precision, verbosity);
270 template block2_gf<mesh::imfreq, matrix_valued>
gloc(one_body_elements_tb
const &obe,
double mu,
271 block2_gf<mesh::imfreq, matrix_valued>
const &Sigma_dynamic,
272 nda::array<nda::matrix<dcomplex>, 2>
const &Sigma_static,
273 triqs::lattice::bz_int_options
const &opt);
275 template block2_gf<mesh::imfreq, matrix_valued>
gloc(mesh::imfreq
const &mesh, one_body_elements_tb
const &obe,
double mu,
276 triqs::lattice::bz_int_options
const &opt);
278 template double density(one_body_elements_tb
const &obe,
double mu, block2_gf<mesh::imfreq, matrix_valued>
const &Sigma_dynamic,
279 nda::array<nda::matrix<dcomplex>, 2>
const &Sigma_static, triqs::lattice::bz_int_options
const &opt);
282 block2_gf<mesh::imfreq, matrix_valued>
const &Sigma_dynamic,
283 nda::array<nda::matrix<dcomplex>, 2>
const &Sigma_static, triqs::lattice::bz_int_options
const &opt,
284 std::string method,
double precision,
bool verbosity);
286 template double find_chemical_potential(
double const target_density, one_body_elements_tb
const &obe, mesh::imfreq
const &mesh,
287 triqs::lattice::bz_int_options
const &opt, std::string method,
double precision,
bool verbosity);
Describe the atomic orbitals within downfolded space.
long n_sigma() const
Dimension of the index.
long dim() const
Dimension of the correlated space.
C2PY_IGNORE gf_struct2_t Gc_block_shape() const
Shape of the Green function in the correlated space, without block decomposition.
block2_gf< Mesh, matrix_valued > gloc(one_body_elements_on_grid const &obe, double mu, block2_gf< Mesh, matrix_valued > const &Sigma_dynamic, nda::array< nda::matrix< dcomplex >, 2 > const &Sigma_static)
Compute local Green's function on a mesh.
nda::array< nda::matrix< dcomplex >, 2 > impurity_levels(one_body_elements_on_grid const &obe)
Compute the local impurity levels from the single-particle dispersion.
double find_chemical_potential(double const target_density, one_body_elements_on_grid const &obe, double beta, std::string method="dichotomy", double precision=1.e-5, bool verbosity=true)
Find the chemical potenital from the local Green's function given a target density.
double density(one_body_elements_on_grid const &obe, double mu, block2_gf< Mesh, matrix_valued > const &Sigma_dynamic, nda::array< nda::matrix< dcomplex >, 2 > const &Sigma_static)
Compute the density of the lattice Green's function with a self-energy using Woodbury.
one_body_elements_tb one_body_elements_from_wannier90(std::string const &wannier_file_path, spin_kind_e spin_kind, std::vector< atomic_orbs > atomic_shells)
Construct a one-body elements TB object from Wannier90 in the case of a single spin index.
block2_gf< Mesh, matrix_valued > make_block2_gf(Mesh const &mesh, gf_struct2_t const &gf_s)
gf_struct_t get_struct(block_gf< Mesh > const &g)
one_body_elements_tb make_obe_from_tb(std::vector< tb_hamiltonian > H_sigma, spin_kind_e spin_kind, std::vector< atomic_orbs > atomic_shells)
Helper to contruct and return an OBE_tb object given a list of tb_Hamiltonians of length n_sigma.
one_body_elements_tb rotate(one_body_elements_tb const &obe, nda::matrix< dcomplex > const &U)
Rotate a tight-binding Hamiltonian by a unitary matrix .
one_body_elements_tb fold(tb::superlattice const &sl, one_body_elements_tb const &obe)
spin_kind_e
Kind of σ index.
nda::array< nda::matrix< dcomplex >, 2 > Hloc(std::vector< tb_hamiltonian > const &H_sigma, std::vector< atomic_orbs > const &atomic_shells)
Compute given tight binding Hamiltonians.
std::pair< double, double > root_finder(std::string method, std::function< double(double)> f, double x_init, double y_value, double precision, double delta_x, long max_loops=1000, std::string x_name="", std::string y_name="", bool verbosity=false)
Root finder .
static constexpr auto r_all
generator< std::pair< long, nda::range > > enumerated_sub_slices(auto sub_div)
A one-body elements using a tight-binding Hamiltonian.
std::vector< tb_hamiltonian > H
List of TB Hamiltonians.
local_space C_space
Local space.