107 selected_components_extractor_.prepare_extraction(state_vector);
108 auto selected_components = selected_components_extractor_.view().extract();
114 auto data_out = std::make_unique<dealii::DataOut<dim>>();
116 const auto attach_data_vector = [&](
auto &data,
const auto &name) {
117 const auto &dof_handler_cg = offline_data_->dof_handler_cg();
118 const auto &dof_handler_dg = offline_data_->dof_handler_dg();
120 if (data.size() == dof_handler_cg.n_dofs()) {
121 offline_data_->affine_constraints_cg().distribute(data);
122 data.update_ghost_values();
123 data_out->add_data_vector(dof_handler_cg, data, name);
125 }
else if (data.size() == dof_handler_dg.n_dofs()) {
126 offline_data_->affine_constraints_dg().distribute(data);
127 data.update_ghost_values();
128 data_out->add_data_vector(dof_handler_dg, data, name);
133 dealii::ExcMessage(
"The selected solution component »" + name +
134 "« is associated with an unknown dof handler"));
138 for (
unsigned int d = 0; d < selected_components.size(); ++d) {
139 attach_data_vector(selected_components[d], vtu_output_quantities_[d]);
142 const auto n_quantities = postprocessor_->n_quantities();
143 for (
unsigned int i = 0; i < n_quantities; ++i) {
145 data_out->add_data_vector(offline_data_->dof_handler(),
146 postprocessor_->quantities()[i],
147 postprocessor_->component_names()[i]);
150 DataOutBase::VtkFlags flags(
151 t, cycle,
true, DataOutBase::CompressionLevel::best_speed);
152 data_out->set_flags(flags);
154 const auto &discretization = offline_data_->discretization();
155 const auto &mapping = discretization.mapping();
156 const auto patch_order =
157 std::max(1u, discretization.polynomial_degree()) - 1u;
162 data_out->build_patches(
163 mapping, patch_order, DataOut<dim>::curved_inner_cells);
167 data_out->write_vtu_in_parallel(
168 name +
"_" + Utilities::to_string(cycle, 6) +
".vtu",
169 mpi_ensemble_.ensemble_communicator());
171 data_out->write_vtu_with_pvtu_record(
172 "", name, cycle, mpi_ensemble_.ensemble_communicator(), 6);
176 if (output_levelsets && manifolds_.size() != 0) {
182 std::vector<std::shared_ptr<FunctionParser<dim>>> level_set_functions;
183 for (
const auto &expression : manifolds_)
184 level_set_functions.emplace_back(
185 std::make_shared<FunctionParser<dim>>(expression));
187 data_out->set_cell_selection([level_set_functions](
const auto &cell) {
188 if (!cell->is_active() || cell->is_artificial())
191 for (
const auto &function : level_set_functions) {
193 unsigned int above = 0;
194 unsigned int below = 0;
196 for (
unsigned int v : cell->vertex_indices()) {
197 const auto vertex = cell->vertex(v);
198 constexpr auto eps = std::numeric_limits<Number>::epsilon();
199 if (function->value(vertex) >= 0. - 100. * eps)
201 if (function->value(vertex) <= 0. + 100. * eps)
203 if (above > 0 && below > 0)
210 data_out->build_patches(
211 mapping, patch_order, DataOut<dim>::curved_inner_cells);
215 data_out->write_vtu_in_parallel(
216 name +
"-levelsets_" + Utilities::to_string(cycle, 6) +
".vtu",
217 mpi_ensemble_.ensemble_communicator());
219 data_out->write_vtu_with_pvtu_record(
223 mpi_ensemble_.ensemble_communicator(),