35 const auto& eigenvalue_matrix = iterator.
eigenvalues();
36 int local_number_of_kpoint_states = eigenvalue_matrix.
rows();
37 int number_of_bands = eigenvalue_matrix.cols();
47 int number_of_values_per_state = 2 * number_of_bands + 4;
48 std::vector<Real> local_state_data(
static_cast<std::size_t
>(local_number_of_kpoint_states) *
49 number_of_values_per_state);
50 for (
int kpoint_index_state = 0; kpoint_index_state < local_number_of_kpoint_states;
51 ++kpoint_index_state) {
52 int local_physical_kpoint_index = kpoint_index_state % local_number_of_physical_kpoints;
53 std::size_t state_offset =
54 static_cast<std::size_t
>(kpoint_index_state) * number_of_values_per_state;
55 for (
int band_index = 0; band_index < number_of_bands; band_index++) {
56 local_state_data[state_offset + band_index] =
57 eigenvalue_matrix(kpoint_index_state, band_index);
58 local_state_data[state_offset + number_of_bands + band_index] =
59 iterator.
occupation(kpoint_index_state, band_index);
61 const auto& kpoint = iterator.
kpoint_grid()[local_physical_kpoint_index];
62 local_state_data[state_offset + 2 * number_of_bands] = kpoint.weight;
63 local_state_data[state_offset + 2 * number_of_bands + 1] = kpoint.coordinates.x;
64 local_state_data[state_offset + 2 * number_of_bands + 2] = kpoint.coordinates.y;
65 local_state_data[state_offset + 2 * number_of_bands + 3] = kpoint.coordinates.z;
68 std::vector<Real> global_state_data =
71 local_number_of_physical_kpoints,
72 number_of_spin_components,
73 number_of_values_per_state);
74 int global_number_of_kpoint_states =
75 static_cast<int>(global_state_data.size()) / number_of_values_per_state;
76 generated::EigenvaluesAtKpoints eigenvalues;
77 eigenvalues.name = generated::EigenvaluesAtKpointsNameEnum::EIGENVALUES_AT_KPOINTS;
78 eigenvalues.units = generated::EigenvaluesAtKpointsUnitsEnum::RY;
79 for (
int kpoint_index_state = 0; kpoint_index_state < global_number_of_kpoint_states;
80 ++kpoint_index_state) {
82 global_state_data.begin() +
83 static_cast<std::ptrdiff_t
>(kpoint_index_state) * number_of_values_per_state;
84 generated::EigenvaluesAtKpointsBandEnergies channel;
85 channel.energies.assign(state, state + number_of_bands);
87 std::vector<double>(state + number_of_bands, state + 2 * number_of_bands);
88 generated::EigenvaluesAtKpointsEigenvaluesAtKPoint kpoint;
89 kpoint.weight = state[2 * number_of_bands];
91 std::vector<double>(state + 2 * number_of_bands + 1, state + 2 * number_of_bands + 4);
92 kpoint.eigenvalues = {channel};
93 eigenvalues.values.push_back(kpoint);
107 const std::vector<std::vector<Real>>& local_blocks,
108 int values_per_state) {
111 std::vector<Real> local_data;
112 local_data.reserve(local_blocks.size() *
static_cast<std::size_t
>(values_per_state));
113 for (
const auto& block : local_blocks) {
114 local_data.insert(local_data.end(), block.begin(), block.end());
116 const std::vector<Real> global_data =
119 local_number_of_physical_kpoints,
120 number_of_spin_components,
122 std::vector<std::vector<Real>> global_blocks(global_data.size() / values_per_state);
123 for (std::size_t state_index = 0; state_index < global_blocks.size(); ++state_index) {
124 global_blocks[state_index].assign(
125 global_data.begin() +
static_cast<std::ptrdiff_t
>(state_index * values_per_state),
126 global_data.begin() +
127 static_cast<std::ptrdiff_t
>((state_index + 1) * values_per_state));
129 return global_blocks;