14 namespace fs = std::filesystem;
23 template <
typename InitialData,
typename IterationData>
class checkpoint {
29 std::string group_name;
32 h5path path_initial_data = h5path{_dirname.string() +
"/initial_data.h5",
"initial_data"};
33 std::string iteration_file_path = _dirname.string() +
"/iterations.h5";
35 [[nodiscard]] h5path path_iteration(
long n_iter)
const {
return {iteration_file_path, std::to_string(n_iter)}; }
37 void write(h5path p,
auto const &x)
const { h5::write(h5::file(p.file,
'a'), p.group_name, x); }
39 template <
typename T> [[nodiscard]] T read(h5path p)
const {
return h5::read<T>(h5::file(p.file,
'r'), p.group_name); }
47 if (!fs::exists(
dirname))
throw std::runtime_error{fmt::format(
"Checkpoint: dirname '{}' does not exist",
dirname)};
48 if (!fs::is_directory(
dirname))
throw std::runtime_error{fmt::format(
"Checkpoint: dirname '{}' exists but is not a directory",
dirname)};
51 auto file = h5::file(iteration_file_path,
'r');
52 _n_iter = long(h5::group{file}.get_all_subgroup_dataset_names().
size());
61 if (fs::exists(
dirname))
throw std::runtime_error{fmt::format(
"Checkpoint: dirname '{}' already exists",
dirname)};
63 auto f = h5::file(path_initial_data.file,
'w');
64 auto root = h5::group{f};
65 h5::write(root, path_initial_data.group_name,
initial_data);
67 auto g = root.create_group(
"logging");
71 [[nodiscard]] std::string
dirname()
const {
return _dirname.string(); }
73 [[nodiscard]] InitialData
initial_data()
const {
return read<InitialData>(path_initial_data); }
75 void append(IterationData
const &x) {
76 write(path_iteration(_n_iter), x);
81 if (i < 0) i +=
size();
82 if (i < 0 || i >=
size())
throw std::out_of_range{fmt::format(
"Checkpoint: index {} out of range [0, {}]", i,
size())};
83 return read<IterationData>(path_iteration(i));
86 [[nodiscard]]
long size()
const {
return _n_iter; }
106 auto g2 = g.create_group(name);
107 h5::write(g2,
"one_body_elements_on_grid", data.
obe);
108 h5::write(g2,
"embedding", data.
embed);
113 auto g2 = g.create_group(name);
114 h5::read(g2,
"one_body_elements_on_grid", data.
obe);
115 h5::read(g2,
"embedding", data.
embed);
147 auto g2 = g.create_group(name);
148 h5::write(g2,
"mu", data.
mu);
159 auto g2 = g.open_group(name);
160 h5::read(g2,
"mu", data.
mu);
176 template class checkpoint<initial_data, iteration_data>;
A checkpoint manager for logging data after each DMFT iteration.
InitialData initial_data() const
void append(IterationData const &x)
checkpoint(std::string dirname)
Open checkpoint from an existing file (rw).
IterationData operator[](long i) const
std::string dirname() const
checkpoint(std::string dirname, InitialData const &initial_data)
Create a new checkpoint from initial_data.
block_gf< imfreq, matrix_valued > block_gf_imfreq_t
block_gf< imtime, matrix_valued > block_gf_imtime_t
void h5_write(h5::group g, std::string const &name, initial_data const &data)
std::vector< nda::matrix< dcomplex > > block_mat_t
void h5_read(h5::group g, std::string const &name, initial_data &data)
embedding embed
Embedding.
one_body_elements_on_grid obe
One body elements.
std::vector< block_gf_imtime_t > Gimp_time_list
Impurities Green's functions.
std::vector< block_gf_imfreq_t > Sigma_dc_list
Impurities self-energies.
double mu
Chemical potential.
std::vector< block_gf_imfreq_t > Gimp_freq_list
Impurities Green's functions.
block_mat_t Sigma_hartree_list
Sigma Hartree.
std::vector< block_gf_imfreq_t > Sigma_imp_list
Impurities self-energies.
A one-body elements struct where all of the underlying data exists on a fixed momentum grid.