52class PVDWriter :
public PVDDetail::WriterStorage<VTKWriter>,
53 public TimeSeriesGridWriter<typename VTKWriter::Grid> {
54 using Storage = PVDDetail::WriterStorage<VTKWriter>;
55 using ParentType = TimeSeriesGridWriter<typename VTKWriter::Grid>;
58 explicit PVDWriter(VTKWriter&& writer, std::string base_filename)
59 : Storage(std::move(writer))
60 , ParentType(Storage::_writer().grid(), Storage::_writer().writer_options())
61 , _base_filename{std::move(base_filename)}
62 , _pvd_filename{_base_filename +
".pvd"}
64 _xml.set_attribute(
"type",
"Collection");
65 _xml.set_attribute(
"version",
"1.0");
66 _xml.add_child(
"Collection");
67 this->_writer().clear();
71 std::string _write(
double _time)
override {
72 const auto time_step_index = _xml.get_child(
"Collection").number_of_children();
73 const auto vtk_filename = _write_time_step_file(time_step_index);
74 _add_dataset(_time, vtk_filename);
76 const auto& communicator = Traits::CommunicatorAccess<VTKWriter>::get(this->_writer());
78 Parallel::invoke_collectively(communicator, [&] () {
79 if (Parallel::rank(communicator) == 0) {
80 write_to(_pvd_filename, [&] (std::ostream& s) {
81 write_xml_with_version_header(_xml, s, Indentation{{.width = 2}});
84 },
"Writing '" + _pvd_filename.string() +
"'");
89 std::string _write_time_step_file(
const std::integral
auto index) {
90 this->copy_fields(this->_writer());
91 const auto filename = this->_writer().write(
92 _base_filename +
"-" + _get_file_number_string(index)
94 this->_writer().clear();
98 std::string _get_file_number_string(
const std::integral
auto index)
const {
99 std::ostringstream file_number;
100 file_number << std::setw(5) << std::setfill(
'0') << index;
101 return file_number.str();
104 XMLElement& _add_dataset(
const Concepts::Scalar
auto _time,
const std::string& filename) {
105 auto& dataset = _xml.get_child(
"Collection").add_child(
"DataSet");
106 dataset.set_attribute(
"timestep", _time);
107 dataset.set_attribute(
"group",
"");
108 dataset.set_attribute(
"part",
"0");
109 dataset.set_attribute(
"name",
"");
110 dataset.set_attribute(
"file", std::filesystem::path{filename}.filename());
114 std::string _base_filename;
115 std::filesystem::path _pvd_filename;