TRIQS/triqs_Nevanlinna 4.0.0
A TRIQS application
Loading...
Searching...
No Matches
Nevanlinna_kernel.cpp
1#include "Nevanlinna_kernel.hpp"
2
3namespace triqs_Nevanlinna {
4
5 void Nevanlinna_kernel::init(nda::vector_const_view<std::complex<double>> mesh, nda::array_const_view<std::complex<double>, 3> data) {
6 _factorizations.clear();
7 size_t N = data.shape()[1];
8 size_t nw = std::count_if(mesh.begin(), mesh.end(), [](const std::complex<double> &w) { return w.imag() > 0; });
9 nda::vector<std::complex<double>> data_in(nw);
10 nda::vector<std::complex<double>> mesh_in(nw);
11 _N_im_freq = nw;
12 for (size_t n = 0; n < N; ++n) {
13 for (size_t iw = 0, iww = 0; iw < mesh.shape()[0]; ++iw) {
14 if (mesh(iw).imag() < 0) continue;
15 data_in(iww) = data(iw, n, n);
16 mesh_in(iww) = mesh(iw);
17 ++iww;
18 }
20 f.build(mesh_in, data_in);
21 _factorizations.push_back(f);
22 }
23 }
24
25 nda::array<std::complex<double>, 3> Nevanlinna_kernel::evaluate(nda::vector_const_view<std::complex<double>> grid) {
26 return evaluate(grid, nda::array_const_view<std::complex<double>, 3>());
27 }
28
29 nda::array<std::complex<double>, 3> Nevanlinna_kernel::evaluate(nda::vector_const_view<std::complex<double>> grid,
30 nda::array_const_view<std::complex<double>, 3> theta) {
31 nda::array<std::complex<double>, 3> results(grid.shape()[0], size(), size());
32 nda::vector<std::complex<double>> theta_(theta.shape()[0]);
33 for (size_t n = 0; n < size(); ++n) {
34 for (size_t iwm = 0; iwm < theta.shape()[0]; ++iwm) { theta_(iwm) = theta(iwm, n, n); }
35 nda::vector<std::complex<double>> data = _factorizations[n].evaluate(grid, theta_);
36 for (size_t iw = 0; iw < grid.shape()[0]; ++iw) { results(iw, n, n) = data(iw); }
37 }
38 return results;
39 }
40 nda::vector<double> Nevanlinna_kernel::get_Pick_eigenvalues() const {
41 if (size() == 0) { return {}; }
42 nda::vector<double> pick_eigenvalues(_N_im_freq * size());
43
44 for (size_t n = 0; n < size(); ++n) {
45 nda::vector<double> eigenvalues = _factorizations[n].get_Pick_eigenvalues();
46 std::copy(eigenvalues.begin(), eigenvalues.end(), pick_eigenvalues.begin() + _N_im_freq * n);
47 }
48 std::sort(pick_eigenvalues.begin(), pick_eigenvalues.end());
49 return pick_eigenvalues;
50 }
51} // namespace triqs_Nevanlinna
void build(nda::vector_const_view< std::complex< double > > mesh, nda::vector_const_view< std::complex< double > > data)
nda::array< std::complex< double >, 3 > evaluate(nda::vector_const_view< std::complex< double > > grid) override
Evaluate the diagonal real-frequency Green's function on a chosen grid.
void init(nda::vector_const_view< std::complex< double > > mesh, nda::array_const_view< std::complex< double >, 3 > data) override
Initialize the diagonal Nevanlinna continuation from Matsubara-frequency input data.