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 <type_traits>
9#include "./local_space.hpp"
11#include "utils/nda_supp.hpp"
12
13namespace triqs::modest {
14
24 [[nodiscard]] inline long sigma_to_data_idx(spin_kind_e spin_kind, long sigma) { return (spin_kind == spin_kind_e::Polarized) ? sigma : 0; };
25
39 nda::array<dcomplex, 4> H_k;
40 nda::array<long, 2> n_bands_per_k;
41 nda::array<double, 1> k_weights;
43
45 bool operator==(band_dispersion const &) const = default;
46
48 friend void mpi_broadcast(band_dispersion &x, mpi::communicator c = {}, int root = 0) {
49 mpi::broadcast(x.spin_kind, c, root);
50 mpi::broadcast(x.H_k, c, root);
51 mpi::broadcast(x.n_bands_per_k, c, root);
52 mpi::broadcast(x.k_weights, c, root);
53 mpi::broadcast(x.matrix_valued, c, root);
54 }
55
56 // public:
57 // /// Constructor
58 // band_dispersion(spin_kind_e spin_kind, nda::array<dcomplex, 4> H_k, nda::array<long, 2> n_bands_per_k,
59 // nda::array<double, 1> k_weights)
60 // : spin_kind(spin_kind),
61 // H_k(std::move(H_k)),
62 // n_bands_per_k(std::move(n_bands_per_k)),
63 // _k_weights(std::move(k_weights)) {
64 // // TODO add some checks on the data ?
65 // }
66
75 [[nodiscard]] nda::matrix_const_view<dcomplex> H(long sigma, long k_idx) const {
76 auto sigma_p = sigma_to_data_idx(spin_kind, sigma);
77 auto R_nu = nda::range(n_bands_per_k(k_idx, sigma_p));
78 return H_k(k_idx, sigma_p, R_nu, R_nu);
79 }
80
82 [[nodiscard]] long N_nu(long sigma, long k_idx) const { return n_bands_per_k(k_idx, sigma_to_data_idx(spin_kind, sigma)); }
83
85 [[nodiscard]] long n_k() const { return H_k.extent(0); }
86
87 // /// Weight of k point (typically from DFT code).
88 // [[nodiscard]] double k_weights(long k_idx) const { return _k_weights(k_idx); }
89
91 friend std::ostream &operator<<(std::ostream &out, band_dispersion const &bd);
92 };
93
125 nda::array<dcomplex, 4> P_k;
126 nda::array<long, 2> n_bands_per_k;
127
129 bool operator==(downfolding_projector const &) const = default;
130
132 friend void mpi_broadcast(downfolding_projector &x, mpi::communicator c = {}, int root = 0) {
133 mpi::broadcast(x.spin_kind, c, root);
134 mpi::broadcast(x.P_k, c, root);
135 mpi::broadcast(x.n_bands_per_k, c, root);
136 }
137
138 // public:
139 // /// Constructor
140 // downfolding_projector(spin_kind_e spin_kind, nda::array<dcomplex, 4> P_k, nda::array<long, 2> n_bands_per_k)
141 // : spin_kind(spin_kind), P_k(std::move(P_k)), n_bands_per_k(std::move(n_bands_per_k)) {}
142
143 // ----------------- accessors --------------------
144 // FIXME : SWAP k and sigma in data
145
154 [[nodiscard]] nda::matrix_const_view<dcomplex> P(long sigma, long k_idx) const {
155 auto sigma_p = sigma_to_data_idx(spin_kind, sigma);
156 auto R_nu = nda::range(n_bands_per_k(k_idx, sigma_p));
157 return P_k(k_idx, sigma_p, r_all, R_nu);
158 }
159
161 downfolding_projector rotate_local_basis(nda::array<nda::matrix<dcomplex>, 2> const &U) const;
162
164 friend std::ostream &operator<<(std::ostream &out, downfolding_projector const &proj);
165 };
166
167 // ------------------------------------------------------------
176 std::optional<ibz_symmetry_ops> ibz_symm_ops = {};
177
179 bool operator==(one_body_elements_on_grid const &) const = default;
180
182 friend void mpi_broadcast(one_body_elements_on_grid &x, mpi::communicator c = {}, int root = 0) {
183 mpi::broadcast(x.H, c, root);
184 mpi::broadcast(x.C_space, c, root);
185 mpi::broadcast(x.P, c, root);
186 mpi::broadcast(x.ibz_symm_ops, c, root);
187 }
188 };
189
190 std::ostream &operator<<(std::ostream &out, one_body_elements_on_grid const &);
191 void h5_read(h5::group g, std::string const &name, one_body_elements_on_grid &x);
192 void h5_write(h5::group g, std::string const &name, one_body_elements_on_grid const &x);
193
194 //-------------------------------------------------------------
195 one_body_elements_on_grid permute_local_space(std::vector<std::vector<long>> const &atom_partition, one_body_elements_on_grid const &x);
196
197 // -------------------------------------------------------------
199 one_body_elements_on_grid rotate_local_basis(nda::array<nda::matrix<dcomplex>, 2> const &U, one_body_elements_on_grid const &x);
200 // -------------------------------------------------------------
201
203
211 nda::array<nda::matrix<dcomplex>, 2> impurity_levels(one_body_elements_on_grid const &obe);
212 // -------------------------------------------------------------
213
214 // These functions are not part of the public API: not documented, not wrapped.
215 namespace detail {
217 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,
218 bool mu_derivative = false);
219 } // namespace detail
220
221} // namespace triqs::modest
Describe the atomic orbitals within downfolded space.
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 .
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.
friend void mpi_broadcast(band_dispersion &x, mpi::communicator c={}, int root=0)
MPI broadcast.
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.
friend void mpi_broadcast(downfolding_projector &x, mpi::communicator c={}, int root=0)
MPI broadcast.
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.
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.
friend void mpi_broadcast(one_body_elements_on_grid &x, mpi::communicator c={}, int root=0)
MPI broadcast.
bool operator==(one_body_elements_on_grid const &) const =default
Equality comparison operator.
band_dispersion H
Band dispersion.
downfolding_projector P
Downfolding projector .