TRIQS/triqs_Nevanlinna 4.0.0
A TRIQS application
Loading...
Searching...
No Matches
solver_core.cpp
1#include <cmath>
2#include "solver_core.hpp"
3#include "kernel_factory.hpp"
4
5namespace triqs_Nevanlinna {
6
7 void solver_core::solve(triqs::gfs::gf_const_view<triqs::mesh::imfreq> g_iw) {
8 auto mesh = nda::vector<std::complex<double>>(g_iw.mesh().size());
9 for (auto i : range(g_iw.mesh().size())) mesh[i] = g_iw.mesh()[i];
10 _kernel->init(mesh, g_iw.data());
11 }
12
13 triqs::gfs::gf<triqs::mesh::refreq> solver_core::evaluate(const triqs::mesh::refreq &grid, double eta) {
14 return evaluate(grid, eta, nda::array_const_view<std::complex<double>, 3>());
15 }
16
17 [[nodiscard]] triqs::gfs::gf<triqs::mesh::refreq> solver_core::evaluate(const triqs::mesh::refreq &grid, double eta,
18 nda::array_const_view<std::complex<double>, 3> theta) {
19 triqs::gfs::gf<triqs::mesh::refreq> result(grid, {static_cast<long>(_kernel->size()), static_cast<long>(_kernel->size())});
20 size_t nw = grid.size();
21 nda::vector<std::complex<double>> mesh(nw);
22 for (auto i : range(nw)) mesh[i] = grid[i] + 1i * eta;
23 nda::array<std::complex<double>, 3> data = _kernel->evaluate(mesh, theta);
24 for (size_t n = 0; n < _kernel->size(); ++n) {
25 for (size_t m = 0; m < _kernel->size(); ++m) {
26 for (int w = 0; w < nw; ++w) { result.data()(w, n, m) = data(w, n, m); }
27 }
28 }
29 return result;
30 }
31
32 solver_core::solver_core(Nevanlinna_parameters_t const &p) : _kernel(kernel_factory::get_kernel(p)) {}
33
34} // namespace triqs_Nevanlinna
solver_core(Nevanlinna_parameters_t const &p)
Construct the solver.
triqs::gfs::gf< triqs::mesh::refreq > evaluate(const triqs::mesh::refreq &grid, double eta)
Evaluate diagonal part of the real-frequency Green's function on a chosen grid.
void solve(triqs::gfs::gf_const_view< triqs::mesh::imfreq > g_iw)
Perform a Nevanlinna factorization for a matrix-valued Matsubara frequency Green's function.
Construction parameters for the Nevanlinna solver_core.