TRIQS/triqs_Nevanlinna 4.0.0
A TRIQS application
Loading...
Searching...
No Matches
Caratheodory_kernel.hpp
1#ifndef TRIQS_NEVANLINNA_CARATHEODORY_KERNEL_HPP
2#define TRIQS_NEVANLINNA_CARATHEODORY_KERNEL_HPP
3
4#include "types.hpp"
5#include "kernel.hpp"
6
7#include <triqs/utility/macros.hpp>
8
9namespace triqs_Nevanlinna {
10
17 class Caratheodory_kernel : public kernel {
18 static constexpr double tol = 1e-12;
19
20 public:
26 Caratheodory_kernel(int precision = mp_digits) : kernel(precision) {}
27
34 void init(nda::vector_const_view<std::complex<double>> mesh, nda::array_const_view<std::complex<double>, 3> data) override;
35
42 [[nodiscard]] nda::array<std::complex<double>, 3> evaluate(nda::vector_const_view<std::complex<double>> grid) override;
43
53 [[nodiscard]] nda::array<std::complex<double>, 3> evaluate(nda::vector_const_view<std::complex<double>> grid,
54 nda::array_const_view<std::complex<double>, 3> theta) override {
55 if (theta.shape()[0] != 0) {
56 std::cerr << "Continuation poles optimization has not been implemented in matrix-valued continuation yet." << std::endl;
57 }
58 return evaluate(grid);
59 };
60
62 [[nodiscard]] C2PY_PROPERTY_GET(size) size_t size() const override { return _dim; }
63
65 [[nodiscard]] C2PY_PROPERTY_GET(Pick_eigenvalues) nda::vector<double> get_Pick_eigenvalues() const override;
66
67 private:
68 int _dim = 0;
69 nda::vector<complex_mpt> _mesh{};
70 nda::vector<matrix_cplx_mpt> _data{}; //W_is
71 nda::vector<matrix_cplx_mpt> _Ws{}; //W_is
72 // See Eq. 6 PhysRevB.104.165111
73 nda::vector<matrix_cplx_mpt> _sqrt_one{}; //[1 - W_i * W_i^dagger]^0.5
74 nda::vector<matrix_cplx_mpt> _sqrt_two{}; //[1 - W_i^dagger * W_i]^-0.5
75 nda::vector<double> _Pick_eigenvalues{};
76
84 matrix_cplx_mpt sqrt_m(const matrix_cplx_mpt &M, bool &is_Schur) {
85 Eigen::ComplexEigenSolver<matrix_cplx_mpt> ces;
86 ces.compute(M);
87 matrix_cplx_mpt D = ces.eigenvalues();
88 is_Schur = true;
89 for (int i = 0; i < D.rows(); i++) {
90 if (D(i, 0).real() < tol) { is_Schur = false; }
91 }
92 return ces.eigenvectors() * D.array().sqrt().matrix().asDiagonal() * ces.eigenvectors().inverse().eval();
93 }
94 };
95} // namespace triqs_Nevanlinna
96#endif //TRIQS_NEVANLINNA_CARATHEODORY_KERNEL_HPP
C2PY_PROPERTY_GET(size) size_t size() const override
Number of orbitals (matrix dimension) handled by the kernel.
nda::array< std::complex< double >, 3 > evaluate(nda::vector_const_view< std::complex< double > > grid) override
Evaluate the full matrix-valued real-frequency Green's function on a chosen grid.
nda::array< std::complex< double >, 3 > evaluate(nda::vector_const_view< std::complex< double > > grid, nda::array_const_view< std::complex< double >, 3 > theta) override
Evaluate the full matrix-valued real-frequency Green's function on a chosen grid.
Caratheodory_kernel(int precision=mp_digits)
Construct the full matrix-valued Caratheodory kernel.
void init(nda::vector_const_view< std::complex< double > > mesh, nda::array_const_view< std::complex< double >, 3 > data) override
Build the full matrix-valued Caratheodory continuation from Matsubara-frequency input data.