34 std::string tb_filename = w90_path_and_seedname +
"_tb.dat";
35 std::ifstream file(tb_filename);
36 if (!file.is_open())
throw std::runtime_error(
"Could not open *_tb.dat file with provided name " + tb_filename);
39 for ([[maybe_unused]]
auto i : detail::read_N<std::string>(file, 5)) {}
42 auto latt_vec = nda::matrix<double>(3, 3);
43 for (
auto x : {0, 1, 2})
44 for (
auto y : {0, 1, 2}) { latt_vec(x, y) = detail::read<double>(file); }
47 int n_wannier = detail::read<int>(file);
48 int n_r = detail::read<int>(file);
51 std::vector<int> r_degeneracies;
52 for (
auto i : detail::read_N<int>(file, n_r)) { r_degeneracies.push_back(i); };
55 std::vector<std::array<long, 3>> r_vectors;
56 std::vector<nda::array<dcomplex, 2>> H_r;
57 std::vector<nda::array<dcomplex, 3>> position_op_r;
59 for ([[maybe_unused]]
auto r : nda::range(n_r)) {
60 r_vectors.emplace_back(std::array<long, 3>{0, 0, 0});
61 H_r.emplace_back(n_wannier, n_wannier);
62 position_op_r.emplace_back(n_wannier, n_wannier, 3);
66 std::array<long, 3> R{};
67 for (
auto ir : nda::range(n_r)) {
69 file >> R[0] >> R[1] >> R[2];
70 for ([[maybe_unused]]
auto [x, y] : product(nda::range(n_wannier), nda::range(n_wannier))) {
72 double re = 0.0, im = 0.0;
74 file >> ii >> jj >> re >> im;
79 if ((ii == 1) and (jj == 1))
80 for (
int i : {0, 1, 2}) r_vectors[ir][i] = R[i];
83 H_r[ir](ii - 1, jj - 1) = dcomplex{re, im} / r_degeneracies[ir];
89 for (
auto ir : nda::range(n_r)) {
91 file >> R[0] >> R[1] >> R[2];
92 for ([[maybe_unused]]
auto [x, y] : product(nda::range(n_wannier), nda::range(n_wannier))) {
94 std::array<double, 3> re{}, im{};
96 file >> ii >> jj >> re[0] >> im[0] >> re[1] >> im[1] >> re[2] >> im[2];
98 for (
auto idx_cart : {0, 1, 2})
99 position_op_r[ir](ii - 1, jj - 1, idx_cart) = dcomplex{re[idx_cart], im[idx_cart]} / r_degeneracies[ir];
102 return {std::move(r_vectors), std::move(H_r), std::move(position_op_r), std::move(latt_vec)};
108 std::string hr_filename = w90_path_and_seedname +
"_hr.dat";
109 std::ifstream file(hr_filename);
110 if (!file.is_open())
throw "Could not open *_hr.dat file with provided seedname: " + w90_path_and_seedname;
113 for ([[maybe_unused]]
auto i : detail::read_N<std::string>(file, 5)) {}
116 int n_wannier = detail::read<int>(file);
117 int n_r = detail::read<int>(file);
120 std::vector<int> r_degeneracies;
121 for (
auto i : detail::read_N<int>(file, n_r)) { r_degeneracies.push_back(i); };
124 std::vector<std::array<long, 3>> r_vectors;
125 std::vector<nda::array<dcomplex, 2>> H_r;
126 for ([[maybe_unused]]
auto r : nda::range(n_r)) {
127 r_vectors.emplace_back(std::array<long, 3>{0, 0, 0});
128 H_r.emplace_back(n_wannier, n_wannier);
132 std::array<long, 3> R{};
133 for (
auto [ir, _unused1, _unused2] : product(nda::range(n_r), nda::range(n_wannier), nda::range(n_wannier))) {
135 double re = 0.0, im = 0.0;
137 file >> R[0] >> R[1] >> R[2] >> ii >> jj >> re >> im;
142 if ((ii == 1) and (jj == 1))
143 for (
int i : {0, 1, 2}) r_vectors[ir][i] = R[i];
146 H_r[ir](ii - 1, jj - 1) = dcomplex{re, im} / r_degeneracies[ir];
148 return {std::move(r_vectors), std::move(H_r)};
std::tuple< r_vector_list_t, hopping_list_t, position_op_list_t, nda::matrix< double > > w90_tb_data_t
Data read from a Wannier90 *_tb.dat file: lattice vectors, hopping matrices, position operators and U...