Я новый программист. Я пытаюсь выполнить следующую задачу:
if hdf5 file exists in the current directory {
// overwrite existing entries in sys.pos and
// sys.s_bias vectors with read-in values from
// h5 file
resume("nameofhdf5.h5", sys.pos, sys.s_bias);
} else {
// initialize positions of all beads
init_pos(sys.pos, box, mt, p);
// initialize entropies of all states
init_s(sys.s_bias, nbonds);
}
Что я делаю, это:
Я запускаю симуляцию, прогресс которой я иногда хочу проверить. Во время работы программы я периодически сохраняю позиции своих шариков и энтропии конфигураций шариков в файл hdf5. Иногда я хочу проверить, насколько далеко продвинулась моя симуляция, поэтому я хочу прервать симуляцию и открыть файл hdf5.
Однако, когда я запускаю свою программу изначально, файл hdf5 еще не существует. Поэтому я хочу иметь возможность инициализировать позиции и энтропии, используя функции init_pos и init_s. Если файл hdf5 существует (то есть, я возобновляю симуляцию), я не хочу, чтобы позиции и энтропии снова инициализировались. Я хочу, чтобы они читались в векторах sys.pos и sys.s_bias.
Я написал все необходимые мне функции (например, резюме и функцию, которая периодически сохраняет позиции и энтропии в файл hdf5). ). Я просто не знаю, как проверить, существует ли файл hdf5 в каталоге. Как мне это сделать? Чем заменить первую строку в моем коде выше?
Для справки, вот так выглядит функция возобновления:
void resume(const std::string snapshot_name, std::vector<Vec3>& pos, std::vector<double>& s_bias) {
// read in snapshot file
H5::H5File file(snapshot_name, H5F_ACC_RDONLY);
// read in positions
{
const H5::DataSet dataset_pos = file.openDataSet("pos");
const H5::DataSpace filespace = dataset_pos.getSpace();
hsize_t filedims[2];
filespace.getSimpleExtentDims(filedims);
pos.resize(filedims[0]);
const hsize_t mem_dims[2] = {pos.size(), 3};
H5::DataSpace mem_space(2, mem_dims);
dataset_pos.read(pos.data(), H5::PredType::NATIVE_DOUBLE, mem_space);
}
// read in biased entropy
{
const H5::DataSet dataset_s_bias = file.openDataSet("s_bias");
const H5::DataSpace filespace = dataset_s_bias.getSpace();
hsize_t filedims[2];
filespace.getSimpleExtentDims(filedims);
s_bias.resize(filedims[0]);
const hsize_t mem_dims[2] = {s_bias.size(), 1};
H5::DataSpace mem_space(2, mem_dims);
dataset_s_bias.read(s_bias.data(), H5::PredType::NATIVE_DOUBLE, mem_space);
}
}