Если файл HDF5 существует, прочитайте данные, иначе выполните другие задачи - PullRequest
0 голосов
/ 01 апреля 2020

Я новый программист. Я пытаюсь выполнить следующую задачу:

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);
    }
}
...