106 auto data_out = std::make_unique<dealii::DataOut<dim>>();
108 const auto attach_data_vector = [&](
auto &data,
const auto &name) {
109 const auto &dof_handler_cg = offline_data_->dof_handler_cg();
110 const auto &dof_handler_dg = offline_data_->dof_handler_dg();
112 if (data.size() == dof_handler_cg.n_dofs()) {
113 offline_data_->affine_constraints_cg().distribute(data);
114 data.update_ghost_values();
115 data_out->add_data_vector(dof_handler_cg, data, name);
117 }
else if (data.size() == dof_handler_dg.n_dofs()) {
118 offline_data_->affine_constraints_dg().distribute(data);
119 data.update_ghost_values();
120 data_out->add_data_vector(dof_handler_dg, data, name);
125 dealii::ExcMessage(
"The selected solution component »" + name +
126 "« is associated with an unknown dof handler"));
130 for (
unsigned int d = 0; d < selected_components.size(); ++d) {
131 attach_data_vector(selected_components[d], vtu_output_quantities_[d]);
134 const auto n_quantities = postprocessor_->n_quantities();
135 for (
unsigned int i = 0; i < n_quantities; ++i) {
137 data_out->add_data_vector(offline_data_->dof_handler(),
138 postprocessor_->quantities()[i],
139 postprocessor_->component_names()[i]);
142 DataOutBase::VtkFlags flags(
143 t, cycle,
true, DataOutBase::CompressionLevel::best_speed);
144 data_out->set_flags(flags);
146 const auto &discretization = offline_data_->discretization();
147 const auto &mapping = discretization.mapping();
148 const auto patch_order =
149 std::max(1u, discretization.polynomial_degree()) - 1u;
154 data_out->build_patches(
155 mapping, patch_order, DataOut<dim>::curved_inner_cells);
159 data_out->write_vtu_in_parallel(
160 name +
"_" + Utilities::to_string(cycle, 6) +
".vtu",
161 mpi_ensemble_.ensemble_communicator());
163 data_out->write_vtu_with_pvtu_record(
164 "", name, cycle, mpi_ensemble_.ensemble_communicator(), 6);
168 if (output_levelsets && manifolds_.size() != 0) {
174 std::vector<std::shared_ptr<FunctionParser<dim>>> level_set_functions;
175 for (
const auto &expression : manifolds_)
176 level_set_functions.emplace_back(
177 std::make_shared<FunctionParser<dim>>(expression));
179 data_out->set_cell_selection([level_set_functions](
const auto &cell) {
180 if (!cell->is_active() || cell->is_artificial())
183 for (
const auto &function : level_set_functions) {
185 unsigned int above = 0;
186 unsigned int below = 0;
188 for (
unsigned int v : cell->vertex_indices()) {
189 const auto vertex = cell->vertex(v);
190 constexpr auto eps = std::numeric_limits<Number>::epsilon();
191 if (function->value(vertex) >= 0. - 100. * eps)
193 if (function->value(vertex) <= 0. + 100. * eps)
195 if (above > 0 && below > 0)
202 data_out->build_patches(
203 mapping, patch_order, DataOut<dim>::curved_inner_cells);
207 data_out->write_vtu_in_parallel(
208 name +
"-levelsets_" + Utilities::to_string(cycle, 6) +
".vtu",
209 mpi_ensemble_.ensemble_communicator());
211 data_out->write_vtu_with_pvtu_record(
215 mpi_ensemble_.ensemble_communicator(),