TRIQS/triqs_modest 3.3.0
Brillouin zone summation
Loading...
Searching...
No Matches
obe_tb.hpp
Go to the documentation of this file.
1// Copyright (c) 2025--present, The Simons Foundation
2// This file is part of TRIQS/modest and is licensed under the terms of GPLv3 or later.
3// SPDX-License-Identifier: GPL-3.0-or-later
4// See LICENSE in the root of this distribution for details.
5
6#pragma once
7#include <triqs/lattice/tb_hamiltonian.hpp>
8#include <stdexcept>
9#include <triqs/mesh/imfreq.hpp>
10#include "loaders.hpp"
11#include "triqs/lattice/bz_integrators.hpp"
12#include "triqs/lattice/gloc.hpp"
14#include <nda/nda.hpp>
15#include <triqs/gfs/functions/density.hpp>
16#include "./root_finder.hpp"
17#include "triqs/lattice/superlattice.hpp"
18
19namespace triqs::modest {
20
21 using triqs::lattice::superlattice;
22
25 std::vector<tb_hamiltonian> H; // positibility to have two spin channels for spin pol
26 //downfolding_projector P;
27 //C2PY_IGNORE std::optional<ibz_symmetry_ops> ibz_symm_ops = {}; //< IBZ symmetrizer after a k-sum
28 };
29
40 one_body_elements_tb one_body_elements_from_wannier90(std::string const &wannier_file_path, spin_kind_e spin_kind,
41 std::vector<atomic_orbs> atomic_shells);
42
55 one_body_elements_tb one_body_elements_from_wannier90(std::string const &wannier_file_path_up, std::string const &wannier_file_path_dn,
56 spin_kind_e spin_kind, std::vector<atomic_orbs> atomic_shells);
57
59 C2PY_IGNORE one_body_elements_tb make_obe_from_tb(std::vector<tb_hamiltonian> const tb_H_sigma, spin_kind_e spin_kind,
60 std::vector<atomic_orbs> atomic_shells);
61
68 nda::array<nda::matrix<dcomplex>, 2> Hloc(std::vector<tb_hamiltonian> const &H_sigma, std::vector<atomic_orbs> const &atomic_shells);
69
77 nda::array<nda::matrix<dcomplex>, 2> impurity_levels(one_body_elements_tb const &obe);
78
86 one_body_elements_tb fold(superlattice const &sl, one_body_elements_tb const &obe);
87
88 // -----------------------------------------------------------------------
89
104 template <typename Mesh>
105 block2_gf<Mesh, matrix_valued> gloc(one_body_elements_tb const &obe, double mu, block2_gf<Mesh, matrix_valued> const &Sigma_dynamic,
106 nda::array<nda::matrix<dcomplex>, 2> const &Sigma_static, triqs::lattice::bz_int_options const &opt) {
107
108 auto &mesh = Sigma_dynamic(0, 0).mesh();
109 auto n_sigma = obe.C_space.n_sigma();
110 auto gloc_result = make_block2_gf(mesh, obe.C_space.Gc_block_shape());
111 // TODO also check safety of orbital space sizes...
112 if (n_sigma != Sigma_static.shape(1)) { throw std::runtime_error("Mismatch between the spin channels in Sigma_Static and Sigma_Dynamic"); }
113 if (n_sigma != obe.H.size()) { throw std::runtime_error("Mismatch between the spin channels in Sigma and spin channels in Hamiltonian."); }
114
115 // Embedding decomposition from structure of Sigma -- provides a list of block names
116 auto embedding_decomp = get_struct(Sigma_dynamic).dims(r_all, 0) | tl::to<std::vector>();
117
118 for (auto sigma : range(n_sigma)) {
119
120 // spin index
121 auto Sigma_full_space = gfs::gf(mesh, {obe.H[sigma].n_orbitals(), obe.H[sigma].n_orbitals()}); //
122 for (auto &&[block, R] : enumerated_sub_slices(embedding_decomp)) {
123 for (auto [n, w] : enumerate(mesh)) {
124 Sigma_full_space.data()(n, R, R) = Sigma_dynamic(block, sigma).data()(n, r_all, r_all) + Sigma_static(block, sigma);
125 }
126 }
127 // Call the TRIQS version of this function
128 gloc_result(0, sigma) = gloc(obe.H[sigma], mu, Sigma_full_space, opt);
129 }
130 return gloc_result;
131 }
132
146 template <typename Mesh>
147 block2_gf<Mesh, matrix_valued> gloc(Mesh const &mesh, one_body_elements_tb const &obe, double mu, triqs::lattice::bz_int_options const &opt) {
148 auto result = make_block2_gf(mesh, obe.C_space.Gc_block_shape());
149 for (auto sigma : range(obe.C_space.n_sigma())) { result(0, sigma) = gloc(mesh, obe.H[sigma], mu, opt); }
150 return result;
151 }
152
153 // -----------------------------------------------------------------------
154
167 template <typename Mesh>
168 double density(one_body_elements_tb const &obe, double mu, block2_gf<Mesh, matrix_valued> const &Sigma_dynamic,
169 nda::array<nda::matrix<dcomplex>, 2> const &Sigma_static, triqs::lattice::bz_int_options const &opt) {
170
171 //auto n_blocks = Sigma_dynamic.size1();
172 auto n_sigma = obe.C_space.n_sigma();
173
174 double n = 0;
175 auto Gloc = gloc(obe, mu, Sigma_dynamic, Sigma_static, opt); // returns block2gf (1, nsigma, {norb, norb})
176 // return type of Gloc is a B2GF with dimensions (1, nspin, {norb, norb})
177 for (auto sigma : range(n_sigma)) { // spin index
178 n += real(nda::trace(density(Gloc(0, sigma))));
179 }
180 return n;
181 }
182
183 // -----------------------------------------------------------------------
199 template <typename Mesh>
200 double find_chemical_potential(double const target_density, one_body_elements_tb const &obe, block2_gf<Mesh, matrix_valued> const &Sigma_dynamic,
201 nda::array<nda::matrix<dcomplex>, 2> const &Sigma_static, triqs::lattice::bz_int_options const &opt,
202 std::string method = "dichotomy", double precision = 1.e-5, bool verbosity = true) {
203 std::function<double(double)> f = [&obe, &Sigma_dynamic, &Sigma_static, &opt](double x) {
204 return density(obe, x, Sigma_dynamic, Sigma_static, opt);
205 };
206 return std::get<0>(triqs::root_finder(method, f, 0.0, target_density, precision, 0.5, 1000, "Chemical Potential", "Total Density", verbosity));
207 }
208
223 template <typename Mesh>
224 double find_chemical_potential(double const target_density, one_body_elements_tb const &obe, Mesh const &mesh,
225 triqs::lattice::bz_int_options const &opt, std::string method = "dichotomy", double precision = 1.e-5,
226 bool verbosity = true) {
227
228 auto Sigma_dynamic = make_block2_gf(mesh, obe.C_space.Gc_block_shape());
229 auto Sigma_static = nda::array<nda::matrix<dcomplex>, 2>(1, obe.C_space.n_sigma());
230 for (auto [i, j] : Sigma_static.indices()) { Sigma_static(i, j) = nda::zeros<dcomplex>(obe.C_space.dim(), obe.C_space.dim()); }
231 return find_chemical_potential(target_density, obe, Sigma_dynamic, Sigma_static, opt, method, precision, verbosity);
232 }
233
234 // -------- instantiations --------------
235
237 template block2_gf<mesh::imfreq, matrix_valued> gloc(one_body_elements_tb const &obe, double mu,
238 block2_gf<mesh::imfreq, matrix_valued> const &Sigma_dynamic,
239 nda::array<nda::matrix<dcomplex>, 2> const &Sigma_static,
240 triqs::lattice::bz_int_options const &opt);
241
242 template block2_gf<mesh::imfreq, matrix_valued> gloc(mesh::imfreq const &mesh, one_body_elements_tb const &obe, double mu,
243 triqs::lattice::bz_int_options const &opt);
244
245 template double density(one_body_elements_tb const &obe, double mu, block2_gf<mesh::imfreq, matrix_valued> const &Sigma_dynamic,
246 nda::array<nda::matrix<dcomplex>, 2> const &Sigma_static, triqs::lattice::bz_int_options const &opt);
247
248 template double find_chemical_potential(double const target_density, one_body_elements_tb const &obe,
249 block2_gf<mesh::imfreq, matrix_valued> const &Sigma_dynamic,
250 nda::array<nda::matrix<dcomplex>, 2> const &Sigma_static, triqs::lattice::bz_int_options const &opt,
251 std::string method, double precision, bool verbosity);
252
253 template double find_chemical_potential(double const target_density, one_body_elements_tb const &obe, mesh::imfreq const &mesh,
254 triqs::lattice::bz_int_options const &opt, std::string method, double precision, bool verbosity);
255
258} // namespace triqs::modest
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.
#define C2PY_IGNORE
Definition defs.hpp:17
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 Gš“’ local Green's function on Mesh(MxM)
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.
Definition density.hpp:199
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.
Definition density.hpp:93
block2_gf< Mesh, matrix_valued > make_block2_gf(Mesh const &mesh, gf_struct2_t const &gf_s)
Definition gf_supp.hpp:41
gf_struct_t get_struct(block_gf< Mesh > const &g)
Definition gf_supp.hpp:51
one_body_elements_tb fold(lattice::superlattice const &sl, one_body_elements_tb const &obe)
Definition obe_tb.cpp:145
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.
Definition obe_tb.cpp:126
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 Hloc = H(R=0) given n_sigma tight_binding Hamiltonians.
Definition obe_tb.cpp:64
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 obe_tb from Wannier90 in the case of a single spin index.
Definition obe_tb.cpp:23
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 f(x) = 0.
static constexpr auto r_all
Definition defs.hpp:40
generator< std::pair< long, nda::range > > enumerated_sub_slices(auto sub_div)
std::vector< tb_hamiltonian > H
Definition obe_tb.hpp:25