110 auto selected_components =
116 initial_precomputed_,
117 {
"alpha",
"smoothness_indicators"},
118 {alpha_, smoothness_indicators_},
119 vtu_output_quantities_);
125 auto data_out = std::make_unique<dealii::DataOut<dim>>();
127 const auto attach_data_vector = [&](
auto &data,
const auto &name) {
128 const auto &dof_handler_cg = offline_data_->dof_handler_cg();
129 const auto &dof_handler_dg = offline_data_->dof_handler_dg();
131 if (data.size() == dof_handler_cg.n_dofs()) {
132 offline_data_->affine_constraints_cg().distribute(data);
133 data.update_ghost_values();
134 data_out->add_data_vector(dof_handler_cg, data, name);
136 }
else if (data.size() == dof_handler_dg.n_dofs()) {
137 offline_data_->affine_constraints_dg().distribute(data);
138 data.update_ghost_values();
139 data_out->add_data_vector(dof_handler_dg, data, name);
144 dealii::ExcMessage(
"The selected solution component »" + name +
145 "« is associated with an unknown dof handler"));
149 for (
unsigned int d = 0; d < selected_components.size(); ++d) {
150 attach_data_vector(selected_components[d], vtu_output_quantities_[d]);
153 const auto n_quantities = postprocessor_->n_quantities();
154 for (
unsigned int i = 0; i < n_quantities; ++i) {
156 data_out->add_data_vector(offline_data_->dof_handler(),
157 postprocessor_->quantities()[i],
158 postprocessor_->component_names()[i]);
161 DataOutBase::VtkFlags flags(
162 t, cycle,
true, DataOutBase::CompressionLevel::best_speed);
163 data_out->set_flags(flags);
165 const auto &discretization = offline_data_->discretization();
166 const auto &mapping = discretization.mapping();
167 const auto patch_order =
168 std::max(1u, discretization.polynomial_degree()) - 1u;
173 data_out->build_patches(mapping, patch_order);
177 data_out->write_vtu_in_parallel(
178 name +
"_" + Utilities::to_string(cycle, 6) +
".vtu",
179 mpi_ensemble_.ensemble_communicator());
181 data_out->write_vtu_with_pvtu_record(
182 "", name, cycle, mpi_ensemble_.ensemble_communicator(), 6);
186 if (output_levelsets && manifolds_.size() != 0) {
192 std::vector<std::shared_ptr<FunctionParser<dim>>> level_set_functions;
193 for (
const auto &expression : manifolds_)
194 level_set_functions.emplace_back(
195 std::make_shared<FunctionParser<dim>>(expression));
197 data_out->set_cell_selection([level_set_functions](
const auto &cell) {
198 if (!cell->is_active() || cell->is_artificial())
201 for (
const auto &function : level_set_functions) {
203 unsigned int above = 0;
204 unsigned int below = 0;
206 for (
unsigned int v : cell->vertex_indices()) {
207 const auto vertex = cell->vertex(v);
208 constexpr auto eps = std::numeric_limits<Number>::epsilon();
209 if (function->value(vertex) >= 0. - 100. * eps)
211 if (function->value(vertex) <= 0. + 100. * eps)
213 if (above > 0 && below > 0)
220 data_out->build_patches(mapping, patch_order);
224 data_out->write_vtu_in_parallel(
225 name +
"-levelsets_" + Utilities::to_string(cycle, 6) +
".vtu",
226 mpi_ensemble_.ensemble_communicator());
228 data_out->write_vtu_with_pvtu_record(
232 mpi_ensemble_.ensemble_communicator(),