41 if (overlap_operator ==
nullptr) {
45 int number_of_orbitals =
static_cast<int>(orbitals.size());
46 if (number_of_orbitals == 0) {
49 int number_of_plane_waves =
static_cast<int>(orbitals[0].size());
51 std::vector<Complex> flattened_orbitals(
static_cast<std::size_t
>(number_of_orbitals) *
52 number_of_plane_waves);
53 for (
int orbital_index = 0; orbital_index < number_of_orbitals; orbital_index++) {
54 std::memcpy(flattened_orbitals.data() +
55 static_cast<std::size_t
>(orbital_index) * number_of_plane_waves,
56 orbitals[orbital_index].data(),
57 static_cast<std::size_t
>(number_of_plane_waves) *
sizeof(
Complex));
60 std::vector<Complex> flattened_s_applied(flattened_orbitals.size());
61 overlap_operator->
apply_batch(number_of_plane_waves,
63 flattened_orbitals.data(),
64 flattened_s_applied.data());
66 std::vector<std::vector<Complex>> s_applied_orbitals(
67 number_of_orbitals, std::vector<Complex>(number_of_plane_waves));
68 for (
int orbital_index = 0; orbital_index < number_of_orbitals; orbital_index++) {
69 std::memcpy(s_applied_orbitals[orbital_index].data(),
70 flattened_s_applied.data() +
71 static_cast<std::size_t
>(orbital_index) * number_of_plane_waves,
72 static_cast<std::size_t
>(number_of_plane_waves) *
sizeof(
Complex));
74 return s_applied_orbitals;
86 int number_of_orbitals =
static_cast<int>(orbitals.size());
87 if (number_of_orbitals == 0) {
90 int number_of_plane_waves =
static_cast<int>(orbitals[0].size());
91 std::vector<std::vector<Complex>> s_applied_orbitals =
94 std::vector<Complex> overlap_column_major(
static_cast<std::size_t
>(number_of_orbitals) *
96 for (
int column = 0; column < number_of_orbitals; column++) {
97 for (
int row = 0; row < number_of_orbitals; row++) {
99 for (
int g_index = 0; g_index < number_of_plane_waves; g_index++) {
100 value += std::conj(orbitals[row][g_index]) * s_applied_orbitals[column][g_index];
102 overlap_column_major[
static_cast<std::size_t
>(row) + column * number_of_orbitals] =
106 return overlap_column_major;