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 <numbers>
int main() {
using std::numbers::pi;
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {::.4f}", i++, mp.index(), mp.data_index(), mp.value());
}
}
Brillouin zone mesh type.
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>
int main() {
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.
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>
int main() {
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.
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>
int main() {
for (int i = 0; auto mp : m) fmt::println("mesh point #{}: index = {}, data index = {}", i++, mp.index(), mp.data_index());
}
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>
int main() {
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.
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>
int main() {
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>
int main() {
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>
int main() {
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.
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>
int main() {
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.
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>
int main() {
for (int i = 0; auto mp : m) fmt::println("mesh point #{}: index = {}, data index = {}", i++, mp.index(), mp.data_index());
}
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 <numbers>
int main() {
using std::numbers::pi;
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.
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>
int main() {
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.
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>
int main() {
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>
int main() {
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>
int main() {
for (int i = 0; auto mp : m) {
fmt::println("mesh point #{}: index = {}, data index = {}, value = {}", i++, mp.index(), mp.data_index(), mp.value());
}
}
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