TRIQS/triqs_modest 3.3.0
Modular Electronic Structure Toolkit
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 <triqs/utility/macros.hpp>
9#include <type_traits>
10#include "./local_space.hpp"
12#include "utils/nda_supp.hpp"
13
14namespace triqs::modest {
15
25 [[nodiscard]] inline long sigma_to_data_idx(spin_kind_e spin_kind, long sigma) { return (spin_kind == spin_kind_e::Polarized) ? sigma : 0; };
26
40 nda::array<dcomplex, 4> H_k;
41 nda::array<long, 2> n_bands_per_k;
42 nda::array<double, 1> k_weights;
44
46 bool operator==(band_dispersion const &) const = default;
47
49 C2PY_IGNORE friend void mpi_broadcast(band_dispersion &x, mpi::communicator c = {}, int root = 0) {
50 mpi::broadcast(x.spin_kind, c, root);
51 mpi::broadcast(x.H_k, c, root);
52 mpi::broadcast(x.n_bands_per_k, c, root);
53 mpi::broadcast(x.k_weights, c, root);
54 mpi::broadcast(x.matrix_valued, c, root);
55 }
56
57 // public:
58 // /// Constructor
59 // band_dispersion(spin_kind_e spin_kind, nda::array<dcomplex, 4> H_k, nda::array<long, 2> n_bands_per_k,
60 // nda::array<double, 1> k_weights)
61 // : spin_kind(spin_kind),
62 // H_k(std::move(H_k)),
63 // n_bands_per_k(std::move(n_bands_per_k)),
64 // _k_weights(std::move(k_weights)) {
65 // // TODO add some checks on the data ?
66 // }
67
76 [[nodiscard]] nda::matrix_const_view<dcomplex> H(long sigma, long k_idx) const {
77 auto sigma_p = sigma_to_data_idx(spin_kind, sigma);
78 auto R_nu = nda::range(n_bands_per_k(k_idx, sigma_p));
79 return H_k(k_idx, sigma_p, R_nu, R_nu);
80 }
81
83 [[nodiscard]] long N_nu(long sigma, long k_idx) const { return n_bands_per_k(k_idx, sigma_to_data_idx(spin_kind, sigma)); }
84
86 [[nodiscard]] long n_k() const { return H_k.extent(0); }
87
88 // /// Weight of k point (typically from DFT code).
89 // [[nodiscard]] double k_weights(long k_idx) const { return _k_weights(k_idx); }
90
92 friend std::ostream &operator<<(std::ostream &out, band_dispersion const &bd);
93 };
94
126 nda::array<dcomplex, 4> P_k;
127 nda::array<long, 2> n_bands_per_k;
128
130 bool operator==(downfolding_projector const &) const = default;
131
133 C2PY_IGNORE friend void mpi_broadcast(downfolding_projector &x, mpi::communicator c = {}, int root = 0) {
134 mpi::broadcast(x.spin_kind, c, root);
135 mpi::broadcast(x.P_k, c, root);
136 mpi::broadcast(x.n_bands_per_k, c, root);
137 }
138
139 // public:
140 // /// Constructor
141 // downfolding_projector(spin_kind_e spin_kind, nda::array<dcomplex, 4> P_k, nda::array<long, 2> n_bands_per_k)
142 // : spin_kind(spin_kind), P_k(std::move(P_k)), n_bands_per_k(std::move(n_bands_per_k)) {}
143
144 // ----------------- accessors --------------------
145 // FIXME : SWAP k and sigma in data
146
155 [[nodiscard]] nda::matrix_const_view<dcomplex> P(long sigma, long k_idx) const {
156 auto sigma_p = sigma_to_data_idx(spin_kind, sigma);
157 auto R_nu = nda::range(n_bands_per_k(k_idx, sigma_p));
158 return P_k(k_idx, sigma_p, r_all, R_nu);
159 }
160
162 downfolding_projector rotate_local_basis(nda::array<nda::matrix<dcomplex>, 2> const &U) const;
163
165 friend std::ostream &operator<<(std::ostream &out, downfolding_projector const &proj);
166 };
167
168 // ------------------------------------------------------------
177 std::optional<ibz_symmetry_ops> ibz_symm_ops = {};
178
180 bool operator==(one_body_elements_on_grid const &) const = default;
181
183 C2PY_IGNORE friend void mpi_broadcast(one_body_elements_on_grid &x, mpi::communicator c = {}, int root = 0) {
184 mpi::broadcast(x.H, c, root);
185 mpi::broadcast(x.C_space, c, root);
186 mpi::broadcast(x.P, c, root);
187 mpi::broadcast(x.ibz_symm_ops, c, root);
188 }
189 };
190
191 std::ostream &operator<<(std::ostream &out, one_body_elements_on_grid const &);
192 void h5_read(h5::group g, std::string const &name, one_body_elements_on_grid &x);
193 void h5_write(h5::group g, std::string const &name, one_body_elements_on_grid const &x);
194
195 //-------------------------------------------------------------
196 one_body_elements_on_grid permute_local_space(std::vector<std::vector<long>> const &atom_partition, one_body_elements_on_grid const &x);
197
198 // -------------------------------------------------------------
200 one_body_elements_on_grid rotate_local_basis(nda::array<nda::matrix<dcomplex>, 2> const &U, one_body_elements_on_grid const &x);
201 // -------------------------------------------------------------
202
204
212 nda::array<nda::matrix<dcomplex>, 2> impurity_levels(one_body_elements_on_grid const &obe);
213 // -------------------------------------------------------------
214
215 // These functions are not part of the public API: not documented, not wrapped.
216 namespace detail {
218 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,
219 bool mu_derivative = false);
220 } // namespace detail
221
222} // 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)
Map a spin index to a data index.
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
Number of bands for each k-point and .
C2PY_IGNORE friend void mpi_broadcast(band_dispersion &x, mpi::communicator c={}, int root=0)
MPI broadcast.
bool operator==(band_dispersion const &) const =default
Equality comparison operator.
nda::array< double, 1 > k_weights
Weight in the BZ for each k-point.
nda::array< dcomplex, 4 > H_k
Hamiltonian .
long n_k() const
Number of k-points in the grid.
friend std::ostream & operator<<(std::ostream &out, band_dispersion const &bd)
Print information about a band_dispersion object.
Definition printing.cpp:14
long N_nu(long sigma, long k_idx) const
Number of bands for a given k-point and spin .
nda::matrix_const_view< dcomplex > H(long sigma, long k_idx) const
Get for a given and .
spin_kind_e spin_kind
Spin kind of the one-body data.
The projector that downfolds the energy bands onto a set of localized atomic-like orbitals.
nda::matrix_const_view< dcomplex > P(long sigma, long k_idx) const
Get for a given and .
spin_kind_e spin_kind
Spin kind of the one-body data.
nda::array< dcomplex, 4 > P_k
Projector .
friend std::ostream & operator<<(std::ostream &out, downfolding_projector const &proj)
Print information about a downfolding_projector object.
Definition printing.cpp:26
bool operator==(downfolding_projector const &) const =default
Equality comparison operator.
nda::array< long, 2 > n_bands_per_k
Number of bands for each k-point and .
downfolding_projector rotate_local_basis(nda::array< nda::matrix< dcomplex >, 2 > const &U) const
Rotates the local basis of the downfolding projector.
C2PY_IGNORE friend void mpi_broadcast(downfolding_projector &x, mpi::communicator c={}, int root=0)
MPI broadcast.
A one-body elements struct where all of the underlying data exists on a fixed momentum grid.
std::optional< ibz_symmetry_ops > ibz_symm_ops
IBZ symmetrizer after a k-sum.
bool operator==(one_body_elements_on_grid const &) const =default
Equality comparison operator.
band_dispersion H
Band dispersion.
downfolding_projector P
Downfolding projector .
C2PY_IGNORE friend void mpi_broadcast(one_body_elements_on_grid &x, mpi::communicator c={}, int root=0)
MPI broadcast.