32 std::vector<char> file_buffer(4 * 1024 * 1024);
33 std::ofstream output_file;
34 output_file.rdbuf()->pubsetbuf(file_buffer.data(), file_buffer.size());
35 output_file.open(filename, std::ios::binary);
36 if (!output_file.is_open()) {
37 log::warn(
"Cannot open {} for writing", filename);
42 log::error(
"planewave_basis is null in NormConservingPlanewaveKohnShamSCFState during "
43 "charge density serialization");
47 log::error(
"crystal_structure is null during charge density serialization");
52 int number_of_g_vectors = planewave_basis.number_of_g_vectors();
58 int32_t gamma_only = 0;
59 int32_t number_of_g_vectors_header;
60 int32_t number_of_spin_components = 1;
62 header.number_of_g_vectors_header = number_of_g_vectors;
63 record_format.
write_record(output_file, &header,
sizeof(header));
68 double reciprocal_vectors_array[9];
69 for (
int vector_index = 0; vector_index < 3; vector_index++) {
70 for (
int dimension = 0; dimension < 3; dimension++) {
71 reciprocal_vectors_array[3 * vector_index + dimension] =
72 reciprocal_vectors_bohr[vector_index][dimension];
76 output_file, reciprocal_vectors_array,
sizeof(reciprocal_vectors_array));
82 std::vector<int32_t> miller_indices(3 * number_of_g_vectors);
83 const auto& g_vectors = planewave_basis.g_vectors();
84 for (
int g_index = 0; g_index < number_of_g_vectors; g_index++) {
85 miller_indices[3 * g_index + 0] = g_vectors[g_index].miller.x;
86 miller_indices[3 * g_index + 1] = g_vectors[g_index].miller.y;
87 miller_indices[3 * g_index + 2] = g_vectors[g_index].miller.z;
90 miller_indices.data(),
91 static_cast<int32_t
>(miller_indices.size() *
sizeof(int32_t)));
95 charge_density_g.data(),
96 static_cast<int32_t
>(number_of_g_vectors *
sizeof(
Complex)));
98 log::info(
" Wrote charge density: {} ({} G-vectors)", filename, number_of_g_vectors);