TRIQS/TRIQS 4.0.0
Researching Interacting Quantum Systems
Loading...
Searching...
No Matches
Mesh types

A mesh is the discretized domain of a Green's function: it defines the points at which the function is stored and the rule used to evaluate it in between. This example constructs each of the mesh types provided by Meshes and iterates over its points, printing for every point its index, its linear data index (the offset into the underlying array), and — where the mesh carries values — its coordinate.

Each section below is a self-contained main() whose source lives in doc/doxygen/examples/ and is built by doc/doxygen/examples/CMakeLists.txt, so it cannot drift out of sync with the library.

For the equivalent Python usage, see the Python user guide.

Brillouin-zone mesh

#include <fmt/ranges.h>
#include <triqs/mesh.hpp>
#include <numbers>
int main() {
using std::numbers::pi;
// initialize a mesh on a cubic BZ with a = 2pi and a 2x2x3 k-point grid
// loop over all mesh points and print their index, data index and value (k-point)
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {::.4f}", i++, mp.index(), mp.data_index(), mp.value());
}
}
A Brillouin zone class.
Brillouin zone mesh type.
Definition brzone.hpp:104
Umbrella header for the TRIQS mesh types.

Output:

mesh point #0: index = [0, 0, 0], data index = 0, value = [0.0000, 0.0000, 0.0000]
mesh point #1: index = [0, 0, 1], data index = 1, value = [0.0000, 0.0000, 0.3333]
mesh point #2: index = [0, 0, 2], data index = 2, value = [0.0000, 0.0000, 0.6667]
mesh point #3: index = [0, 1, 0], data index = 3, value = [0.0000, 0.5000, 0.0000]
mesh point #4: index = [0, 1, 1], data index = 4, value = [0.0000, 0.5000, 0.3333]
mesh point #5: index = [0, 1, 2], data index = 5, value = [0.0000, 0.5000, 0.6667]
mesh point #6: index = [1, 0, 0], data index = 6, value = [0.5000, 0.0000, 0.0000]
mesh point #7: index = [1, 0, 1], data index = 7, value = [0.5000, 0.0000, 0.3333]
mesh point #8: index = [1, 0, 2], data index = 8, value = [0.5000, 0.0000, 0.6667]
mesh point #9: index = [1, 1, 0], data index = 9, value = [0.5000, 0.5000, 0.0000]
mesh point #10: index = [1, 1, 1], data index = 10, value = [0.5000, 0.5000, 0.3333]
mesh point #11: index = [1, 1, 2], data index = 11, value = [0.5000, 0.5000, 0.6667]

Chebyshev mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a Chebyshev mesh with beta = 10, fermionic statistics and 5 points
triqs::mesh::chebyshev m{10, triqs::mesh::Fermion, 5};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m)
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
Chebyshev imaginary time mesh type.
Definition chebyshev.hpp:71

Output:

mesh point #0: index = 0, data index = 0, value = 0.24471741852423234
mesh point #1: index = 1, data index = 1, value = 2.061073738537635
mesh point #2: index = 2, data index = 2, value = 5
mesh point #3: index = 3, data index = 3, value = 7.938926261462366
mesh point #4: index = 4, data index = 4, value = 9.755282581475768

Cyclic-lattice mesh

#include <fmt/ranges.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a mesh on a cubic lattice with a = 0.5 and a 2x2x3 supercell
triqs::mesh::cyclat m{triqs::mesh::bravais_lattice{nda::eye<double>(3) * 0.5}, {2, 2, 3}};
// loop over all mesh points and print their index, data index and value (lattice vector)
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), nda::vector<double>{mp.value()});
}
}
Cyclic lattice mesh type for Bravais lattices with Born-von Karman periodic boundary conditions.
Definition cyclat.hpp:88

Output:

mesh point #0: index = [0, 0, 0], data index = 0, value = [0, 0, 0]
mesh point #1: index = [0, 0, 1], data index = 1, value = [0, 0, 0.5]
mesh point #2: index = [0, 0, 2], data index = 2, value = [0, 0, 1]
mesh point #3: index = [0, 1, 0], data index = 3, value = [0, 0.5, 0]
mesh point #4: index = [0, 1, 1], data index = 4, value = [0, 0.5, 0.5]
mesh point #5: index = [0, 1, 2], data index = 5, value = [0, 0.5, 1]
mesh point #6: index = [1, 0, 0], data index = 6, value = [0.5, 0, 0]
mesh point #7: index = [1, 0, 1], data index = 7, value = [0.5, 0, 0.5]
mesh point #8: index = [1, 0, 2], data index = 8, value = [0.5, 0, 1]
mesh point #9: index = [1, 1, 0], data index = 9, value = [0.5, 0.5, 0]
mesh point #10: index = [1, 1, 1], data index = 10, value = [0.5, 0.5, 0.5]
mesh point #11: index = [1, 1, 2], data index = 11, value = [0.5, 0.5, 1]

Discrete mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a discrete mesh with 5 points
// loop over all mesh points and print their index and data index
for (int i = 0; auto mp : m) fmt::println("mesh point #{}: index = {}, data index = {}", i++, mp.index(), mp.data_index());
}
Discrete mesh type.
Definition discrete.hpp:51

Output:

mesh point #0: index = 0, data index = 0
mesh point #1: index = 1, data index = 1
mesh point #2: index = 2, data index = 2
mesh point #3: index = 3, data index = 3
mesh point #4: index = 4, data index = 4

DLR mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a fermionic DLR mesh with beta = 10, omega_max = 0.5 and epsilon = 1e-6
triqs::mesh::dlr m{10, triqs::mesh::Fermion, 0.5, 1e-6};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
}
Discrete Lehmann representation (DLR) mesh type.
Definition dlr.hpp:96

Output:

mesh point #0: index = 0, data index = 0, value = -4.997323654048254
mesh point #1: index = 1, data index = 1, value = -3.831753911537679
mesh point #2: index = 2, data index = 2, value = -2.710662984621819
mesh point #3: index = 3, data index = 3, value = -1.5985695686131243
mesh point #4: index = 4, data index = 4, value = 0.0013381729758728256
mesh point #5: index = 5, data index = 5, value = 2.075899665814476
mesh point #6: index = 6, data index = 6, value = 3.831753911537679
mesh point #7: index = 7, data index = 7, value = 4.997323654048254

DLR imaginary-frequency mesh

#include <fmt/std.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a fermionic imaginary frequency DLR mesh with beta = 10, omega_max = 0.5 and epsilon = 1e-6
triqs::mesh::dlr_imfreq m{10, triqs::mesh::Fermion, 0.5, 1e-6};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), std::complex<double>(mp.value()));
}
}
Imaginary frequency discrete Lehmann representation (DLR) mesh type.

Output:

mesh point #0: index = -6, data index = 0, value = -3.455751918948772i
mesh point #1: index = -3, data index = 1, value = -1.5707963267948966i
mesh point #2: index = -2, data index = 2, value = -0.9424777960769379i
mesh point #3: index = -1, data index = 3, value = -0.3141592653589793i
mesh point #4: index = 0, data index = 4, value = 0.3141592653589793i
mesh point #5: index = 1, data index = 5, value = 0.9424777960769379i
mesh point #6: index = 2, data index = 6, value = 1.5707963267948966i
mesh point #7: index = 5, data index = 7, value = 3.455751918948772i

DLR imaginary-time mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a fermionic imaginary time DLR mesh with beta = 10, omega_max = 0.5 and epsilon = 1e-6
triqs::mesh::dlr_imtime m{10, triqs::mesh::Fermion, 0.5, 1e-6};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
}
Imaginary time discrete Lehmann representation (DLR) mesh type.

Output:

mesh point #0: index = 0, data index = 0, value = 0.012031950007446723
mesh point #1: index = 1, data index = 1, value = 0.6496895210536141
mesh point #2: index = 2, data index = 2, value = 2.0222028313159592
mesh point #3: index = 3, data index = 3, value = 5.283961182488998
mesh point #4: index = 4, data index = 4, value = 7.022202831315959
mesh point #5: index = 5, data index = 5, value = 8.584483769065113
mesh point #6: index = 6, data index = 6, value = 9.550004964934757
mesh point #7: index = 7, data index = 7, value = 9.987968049992553

Imaginary-frequency mesh

#include <fmt/std.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a fermionic imaginary frequency mesh with 3 positive frequencies and beta = 10
triqs::mesh::imfreq m{10, triqs::mesh::Fermion, 3};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), std::complex<double>(mp.value()));
}
}
Imaginary frequency mesh type.
Definition imfreq.hpp:102

Output:

mesh point #0: index = -3, data index = 0, value = -1.5707963267948966i
mesh point #1: index = -2, data index = 1, value = -0.9424777960769379i
mesh point #2: index = -1, data index = 2, value = -0.3141592653589793i
mesh point #3: index = 0, data index = 3, value = 0.3141592653589793i
mesh point #4: index = 1, data index = 4, value = 0.9424777960769379i
mesh point #5: index = 2, data index = 5, value = 1.5707963267948966i

Imaginary-time mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a fermionic imaginary time mesh with 5 points and beta = 10
triqs::mesh::imtime m{10, triqs::mesh::Fermion, 5};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
}
Imaginary time mesh type.
Definition imtime.hpp:68

Output:

mesh point #0: index = 0, data index = 0, value = 0
mesh point #1: index = 1, data index = 1, value = 2.5
mesh point #2: index = 2, data index = 2, value = 5
mesh point #3: index = 3, data index = 3, value = 7.5
mesh point #4: index = 4, data index = 4, value = 10

Legendre mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a Legendre mesh with beta = 10, fermionic statistics and 5 polynomials
triqs::mesh::legendre m{10, triqs::mesh::Fermion, 5};
// loop over all mesh points and print their index and data index
for (int i = 0; auto mp : m) fmt::println("mesh point #{}: index = {}, data index = {}", i++, mp.index(), mp.data_index());
}
Legendre mesh type.
Definition legendre.hpp:76

Output:

mesh point #0: index = 0, data index = 0
mesh point #1: index = 1, data index = 1
mesh point #2: index = 2, data index = 2
mesh point #3: index = 3, data index = 3
mesh point #4: index = 4, data index = 4

Product mesh

#include <fmt/ranges.h>
#include <triqs/mesh.hpp>
#include <numbers>
int main() {
using std::numbers::pi;
// initialize a mesh on a bravais lattice with a = 1 and a 2x2x1 meshpoints
auto bl = triqs::mesh::bravais_lattice{nda::eye<double>(3)};
auto bl_m = triqs::mesh::cyclat{bl, {2, 2, 1}};
// initialize a bosonic imaginary frequency mesh with 2 positive frequencies and beta = 10
triqs::mesh::imfreq iw_m{10, triqs::mesh::Boson, 2};
// combine the two meshes into a product mesh
auto m = triqs::mesh::prod{bl_m, iw_m};
// loop over all mesh points and print their index and data index tuples
for (int i = 0; auto mp : m) { fmt::println("mesh point #{}: index = {}, data index = {}", i++, mp.index(), mp.data_index()); }
}
Product mesh type for combining multiple meshes.
Definition prod.hpp:138

Output:

mesh point #0: index = ([0, 0, 0], -1), data index = (0, 0)
mesh point #1: index = ([0, 0, 0], 0), data index = (0, 1)
mesh point #2: index = ([0, 0, 0], 1), data index = (0, 2)
mesh point #3: index = ([0, 1, 0], -1), data index = (1, 0)
mesh point #4: index = ([0, 1, 0], 0), data index = (1, 1)
mesh point #5: index = ([0, 1, 0], 1), data index = (1, 2)
mesh point #6: index = ([1, 0, 0], -1), data index = (2, 0)
mesh point #7: index = ([1, 0, 0], 0), data index = (2, 1)
mesh point #8: index = ([1, 0, 0], 1), data index = (2, 2)
mesh point #9: index = ([1, 1, 0], -1), data index = (3, 0)
mesh point #10: index = ([1, 1, 0], 0), data index = (3, 1)
mesh point #11: index = ([1, 1, 0], 1), data index = (3, 2)

Real-frequency mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a real frequency mesh with 5 points on the interval [-5, 5]
triqs::mesh::refreq m{-5, 5, 5};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
}
Real frequency mesh type.
Definition refreq.hpp:72

Output:

mesh point #0: index = 0, data index = 0, value = -5
mesh point #1: index = 1, data index = 1, value = -2.5
mesh point #2: index = 2, data index = 2, value = 0
mesh point #3: index = 3, data index = 3, value = 2.5
mesh point #4: index = 4, data index = 4, value = 5

Logarithmic real-frequency mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a logarithmic mesh with eps=0.1, w_max=10, ratio=2
triqs::mesh::refreq_log m{0.1, 10, 2.0};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m)
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
Logarithmic real frequency mesh type.

Output:

mesh point #0: index = 0, data index = 0, value = -10
mesh point #1: index = 1, data index = 1, value = -5
mesh point #2: index = 2, data index = 2, value = -2.5
mesh point #3: index = 3, data index = 3, value = -1.25
mesh point #4: index = 4, data index = 4, value = -0.625
mesh point #5: index = 5, data index = 5, value = -0.3125
mesh point #6: index = 6, data index = 6, value = -0.15625
mesh point #7: index = 7, data index = 7, value = 0.15625
mesh point #8: index = 8, data index = 8, value = 0.3125
mesh point #9: index = 9, data index = 9, value = 0.625
mesh point #10: index = 10, data index = 10, value = 1.25
mesh point #11: index = 11, data index = 11, value = 2.5
mesh point #12: index = 12, data index = 12, value = 5
mesh point #13: index = 13, data index = 13, value = 10

Custom-point real-frequency mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a refreq_pts mesh from a vector of points
triqs::mesh::refreq_pts m{std::vector<double>{-5.0, -1.0, 0.0, 1.0, 5.0}};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m)
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
Real frequency mesh type from arbitrary sorted frequency points.

Output:

mesh point #0: index = 0, data index = 0, value = -5
mesh point #1: index = 1, data index = 1, value = -1
mesh point #2: index = 2, data index = 2, value = 0
mesh point #3: index = 3, data index = 3, value = 1
mesh point #4: index = 4, data index = 4, value = 5

Real-time mesh

#include <fmt/base.h>
#include <triqs/mesh.hpp>
int main() {
// initialize a real time mesh with 5 points on [-5, 5]
triqs::mesh::retime m{-5, 5, 5};
// loop over all mesh points and print their index, data index and value
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
}
Real time mesh type.
Definition retime.hpp:70

Output:

mesh point #0: index = 0, data index = 0, value = -5
mesh point #1: index = 1, data index = 1, value = -2.5
mesh point #2: index = 2, data index = 2, value = 0
mesh point #3: index = 3, data index = 3, value = 2.5
mesh point #4: index = 4, data index = 4, value = 5