TRIQS/triqs_modest 3.3.0
Brillouin zone summation
Loading...
Searching...
No Matches
downfolding.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/gfs.hpp>
8#include <type_traits>
9#include "./local_space.hpp"
11#include "utils/nda_supp.hpp"
12
13namespace triqs::modest {
14
15 // In NonPolarized case, σ logically has 2 values, but
16 // the data are the same, so we store only on.
17 // this method maps σ to its index for the data arrays
18 [[nodiscard]] inline long sigma_to_data_idx(spin_kind_e spin_kind, long sigma) { return (spin_kind == spin_kind_e::Polarized) ? sigma : 0; };
19
29 nda::array<dcomplex, 4> H_k;
30 nda::array<long, 2> n_bands_per_k;
31 nda::array<double, 1> k_weights;
33
34 // public:
35 // /// Constructor
36 // band_dispersion(spin_kind_e spin_kind, nda::array<dcomplex, 4> H_k, nda::array<long, 2> n_bands_per_k,
37 // nda::array<double, 1> k_weights)
38 // : spin_kind(spin_kind),
39 // H_k(std::move(H_k)),
40 // n_bands_per_k(std::move(n_bands_per_k)),
41 // _k_weights(std::move(k_weights)) {
42 // // TODO add some checks on the data ?
43 // }
44
46 [[nodiscard]] nda::matrix_const_view<dcomplex> H(long sigma, long k_idx) const {
47 auto sigma_p = sigma_to_data_idx(spin_kind, sigma);
48 auto R_nu = nda::range(n_bands_per_k(k_idx, sigma_p));
49 return H_k(k_idx, sigma_p, R_nu, R_nu);
50 }
51
53 [[nodiscard]] long N_nu(long sigma, long k_idx) const { return n_bands_per_k(k_idx, sigma_to_data_idx(spin_kind, sigma)); }
54
56 [[nodiscard]] long n_k() const { return H_k.extent(0); }
57
58 // /// Weight of k point (typically from DFT code).
59 // [[nodiscard]] double k_weights(long k_idx) const { return _k_weights(k_idx); }
60
62 friend std::ostream &operator<<(std::ostream &out, band_dispersion const &bd);
63 };
64
74 nda::array<dcomplex, 4> P_k;
75 nda::array<long, 2> n_bands_per_k;
76
77 // public:
78 // /// Constructor
79 // downfolding_projector(spin_kind_e spin_kind, nda::array<dcomplex, 4> P_k, nda::array<long, 2> n_bands_per_k)
80 // : spin_kind(spin_kind), P_k(std::move(P_k)), n_bands_per_k(std::move(n_bands_per_k)) {}
81
82 // ----------------- accessors --------------------
83 // FIXME : SWAP k and sigma in data
85 [[nodiscard]] nda::matrix_const_view<dcomplex> P(long sigma, long k_idx) const {
86 auto sigma_p = sigma_to_data_idx(spin_kind, sigma);
87 auto R_nu = nda::range(n_bands_per_k(k_idx, sigma_p));
88 return P_k(k_idx, sigma_p, r_all, R_nu);
89 }
91 downfolding_projector rotate_local_basis(nda::array<nda::matrix<dcomplex>, 2> const &U) const;
93 friend std::ostream &operator<<(std::ostream &out, downfolding_projector const &proj);
94 };
95
96 // ------------------------------------------------------------
107
108 std::ostream &operator<<(std::ostream &out, one_body_elements_on_grid const &);
109 void h5_read(h5::group g, std::string const &name, one_body_elements_on_grid &x);
110 void h5_write(h5::group g, std::string const &name, one_body_elements_on_grid const &x);
111
112 //-------------------------------------------------------------
113 one_body_elements_on_grid permute_local_space(std::vector<std::vector<long>> const &atom_partition, one_body_elements_on_grid const &x);
114
115 // -------------------------------------------------------------
117 one_body_elements_on_grid rotate_local_basis(nda::array<nda::matrix<dcomplex>, 2> const &U, one_body_elements_on_grid const &x);
118 // -------------------------------------------------------------
119
121
129 nda::array<nda::matrix<dcomplex>, 2> impurity_levels(one_body_elements_on_grid const &obe);
130 // -------------------------------------------------------------
131
132 // These functions are not part of the public API: not documented, not wrapped.
133 namespace detail {
135 nda::array<dcomplex, 3> G0_C_k_sigma(one_body_elements_on_grid const &obe, double mu, long k_idx, long sigma, std::vector<dcomplex> const &omegas,
136 bool mu_derivative = false);
137 } // namespace detail
138
139} // namespace triqs::modest
Describe the atomic orbitals within downfolded space.
#define C2PY_IGNORE
Definition defs.hpp:17
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.
one_body_elements_on_grid rotate_local_basis(nda::array< nda::matrix< dcomplex >, 2 > const &U, one_body_elements_on_grid const &x)
Rotates the local basis of the downfolding projector.
std::ostream & operator<<(std::ostream &out, one_body_elements_on_grid const &)
Definition printing.cpp:73
void h5_write(h5::group g, std::string const &name, initial_data const &data)
long sigma_to_data_idx(spin_kind_e spin_kind, long sigma)
spin_kind_e
Kind of σ index.
one_body_elements_on_grid permute_local_space(std::vector< std::vector< long > > const &atom_partition, one_body_elements_on_grid const &obe)
void h5_read(h5::group g, std::string const &name, initial_data &data)
static constexpr auto r_all
Definition defs.hpp:40
The one-body dispersion as a function of momentum.
bool matrix_valued
Is the dispersion matrix-valued?
nda::array< long, 2 > n_bands_per_k
n_bands_per_k [k_idx, σ'] = # of nu
nda::array< double, 1 > k_weights
k_weights[k_idx]
nda::array< dcomplex, 4 > H_k
H_k [k_idx, σ', nu, nu'].
long n_k() const
Number of k points in the grid.
friend std::ostream & operator<<(std::ostream &out, band_dispersion const &bd)
printing
Definition printing.cpp:14
long N_nu(long sigma, long k_idx) const
Number of bands #ν
nda::matrix_const_view< dcomplex > H(long sigma, long k_idx) const
H^σ(k)_ν, returned as a MATRIX in (ν, ν)
spin_kind_e spin_kind
Spin kind of the one-body data.
The projector that downfolds the one-body dispersion (ν) onto local orbitals (m).
nda::matrix_const_view< dcomplex > P(long sigma, long k_idx) const
P^σ(k)_mν, returned as a matrix in (m ν)
nda::array< dcomplex, 4 > P_k
Pk[alpha][k_idx, σ', m_alpha, nu].
friend std::ostream & operator<<(std::ostream &out, downfolding_projector const &proj)
printing
Definition printing.cpp:26
nda::array< long, 2 > n_bands_per_k
n_bands_per_k [k_idx, σ'] = # of nu
downfolding_projector rotate_local_basis(nda::array< nda::matrix< dcomplex >, 2 > const &U) const
Rotates the local basis of the downfolding projector.
A one-body elements struct where all of the underlying data exists on a fixed momentum grid.
C2PY_IGNORE std::optional< ibz_symmetry_ops > ibz_symm_ops
IBZ symmetrizer after a k-sum.