22#ifndef EXADG_POSTPROCESSOR_WRITE_OUTPUT_H_
23#define EXADG_POSTPROCESSOR_WRITE_OUTPUT_H_
29#include <deal.II/base/bounding_box.h>
30#include <deal.II/dofs/dof_handler.h>
31#include <deal.II/dofs/dof_tools.h>
32#include <deal.II/grid/grid_generator.h>
33#include <deal.II/grid/grid_out.h>
34#include <deal.II/grid/grid_tools.h>
35#include <deal.II/numerics/data_out.h>
36#include <deal.II/numerics/data_out_faces.h>
37#include <deal.II/particles/data_out.h>
38#include <deal.II/particles/particle_handler.h>
41#include <exadg/grid/grid_data.h>
42#include <exadg/operators/quadrature.h>
43#include <exadg/postprocessor/output_data_base.h>
44#include <exadg/postprocessor/solution_field.h>
50write_surface_mesh(dealii::Triangulation<dim>
const & triangulation,
51 dealii::Mapping<dim>
const & mapping,
52 unsigned int const n_subdivisions,
53 std::string
const & folder,
54 std::string
const & file,
55 unsigned int const counter,
56 MPI_Comm
const & mpi_comm)
59 dealii::DataOutFaces<dim> data_out_surface(
true );
60 data_out_surface.attach_triangulation(triangulation);
61 data_out_surface.build_patches(mapping, n_subdivisions);
62 data_out_surface.write_vtu_with_pvtu_record(folder, file +
"_surface", counter, mpi_comm, 4);
67write_boundary_IDs(dealii::Triangulation<dim>
const & triangulation,
68 std::string
const & folder,
69 std::string
const & file,
70 MPI_Comm
const & mpi_communicator)
72 unsigned int const rank = dealii::Utilities::MPI::this_mpi_process(mpi_communicator);
73 unsigned int const n_ranks = dealii::Utilities::MPI::n_mpi_processes(mpi_communicator);
75 unsigned int const n_digits =
static_cast<int>(std::ceil(std::log10(std::fabs(n_ranks))));
77 std::string filename = folder + file +
"_boundary_IDs" +
"." +
78 dealii::Utilities::int_to_string(rank, n_digits) +
".vtk";
79 std::ofstream output(filename);
81 dealii::GridOut grid_out;
82 dealii::GridOutFlags::Vtk flags;
83 flags.output_cells =
false;
84 flags.output_faces =
true;
85 flags.output_edges =
false;
86 flags.output_only_relevant =
false;
87 grid_out.set_flags(flags);
88 grid_out.write_vtk(triangulation, output);
93write_grid(dealii::Triangulation<dim>
const & triangulation,
94 dealii::Mapping<dim>
const & mapping,
95 unsigned int const n_subdivisions,
96 std::string
const & folder,
97 std::string
const & file,
98 unsigned int const & counter,
99 MPI_Comm
const & mpi_comm)
101 std::string filename = file +
"_grid";
103 dealii::DataOut<dim> data_out;
105 dealii::DataOutBase::VtkFlags flags;
106 flags.write_higher_order_cells = n_subdivisions > 1;
107 data_out.set_flags(flags);
109 data_out.attach_triangulation(triangulation);
110 data_out.build_patches(mapping, n_subdivisions, dealii::DataOut<dim>::curved_inner_cells);
111 data_out.write_vtu_with_pvtu_record(folder, filename, counter, mpi_comm, 4);
116write_points(dealii::Triangulation<dim>
const & triangulation,
117 dealii::Mapping<dim>
const & mapping,
118 std::vector<dealii::Point<dim>>
const & points,
119 std::string
const & folder,
120 std::string
const & file,
121 unsigned int const counter,
122 MPI_Comm
const & mpi_comm)
124 std::string filename = file +
"_points";
126 dealii::Particles::ParticleHandler<dim, dim> particle_handler(triangulation, mapping);
128 particle_handler.insert_particles(points);
130 dealii::Particles::DataOut<dim, dim> particle_output;
131 particle_output.build_patches(particle_handler);
132 particle_output.write_vtu_with_pvtu_record(folder, filename, counter, mpi_comm);
137write_points_in_dummy_triangulation(std::vector<dealii::Point<dim>>
const & points,
138 std::string
const & folder,
139 std::string
const & file,
140 unsigned int const counter,
141 MPI_Comm
const & mpi_comm)
143 dealii::BoundingBox<dim> bounding_box(points);
144 auto const boundary_points =
145 bounding_box.create_extended(1e-3 * std::pow(bounding_box.volume(), 1.0 / ((
double)dim)))
146 .get_boundary_points();
148 dealii::Triangulation<dim> particle_dummy_tria;
149 dealii::GridGenerator::hyper_rectangle(particle_dummy_tria,
150 boundary_points.first,
151 boundary_points.second);
153 dealii::MappingQGeneric<dim> particle_dummy_mapping(1 );
156 particle_dummy_tria, particle_dummy_mapping, points, folder, file, counter, mpi_comm);
159template<
int dim,
typename Number>
164 unsigned int const & output_counter,
165 MPI_Comm
const & mpi_comm)
166 : output_data(output_data), output_counter(output_counter), mpi_comm(mpi_comm)
169 dealii::DataOutBase::VtkFlags flags;
170 flags.write_higher_order_cells = output_data.write_higher_order;
171 data_out.set_flags(flags);
176 template<
typename VectorType>
179 dealii::DoFHandler<dim>
const & dof_handler,
180 std::vector<std::string>
const & component_names,
181 std::vector<bool>
const & component_is_part_of_vector = {
false})
183 unsigned int n_components = component_names.size();
184 AssertThrow(n_components > 0, dealii::ExcMessage(
"Provide names for each component."));
186 AssertThrow(n_components == component_is_part_of_vector.size(),
187 dealii::ExcMessage(
"Provide names and vector info for each component."));
192 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
193 data_component_interpretation(n_components,
194 dealii::DataComponentInterpretation::component_is_scalar);
195 for(
unsigned int i = 0; i < n_components; ++i)
197 if(component_is_part_of_vector[i])
199 data_component_interpretation[i] =
200 dealii::DataComponentInterpretation::component_is_part_of_vector;
203 data_out.add_data_vector(dof_handler, vector, component_names, data_component_interpretation);
207 data_out.add_data_vector(dof_handler, vector, component_names[0]);
215 for(
auto & additional_field : additional_fields)
217 if(additional_field->get_type() == SolutionFieldType::scalar)
219 data_out.add_data_vector(additional_field->get_dof_handler(),
220 additional_field->get(),
221 additional_field->get_name());
223 else if(additional_field->get_type() == SolutionFieldType::cellwise)
225 data_out.add_data_vector(additional_field->get(), additional_field->get_name());
227 else if(additional_field->get_type() == SolutionFieldType::vector)
229 std::vector<std::string> names(dim, additional_field->get_name());
230 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
231 component_interpretation(
232 dim, dealii::DataComponentInterpretation::component_is_part_of_vector);
234 data_out.add_data_vector(additional_field->get_dof_handler(),
235 additional_field->get(),
237 component_interpretation);
241 AssertThrow(
false, dealii::ExcMessage(
"This `SolutionFieldType` is not implemented."));
247 write_aspect_ratio(dealii::DoFHandler<dim>
const & dof_handler,
248 dealii::Mapping<dim>
const & mapping)
251 if(output_data.write_aspect_ratio)
253 dealii::Triangulation<dim>
const & tria = dof_handler.get_triangulation();
259 aspect_ratios = dealii::GridTools::compute_aspect_ratio_of_cells(mapping, tria, *quadrature);
260 data_out.add_data_vector(aspect_ratios,
"aspect_ratio");
265 write_pvtu(dealii::Mapping<dim>
const * mapping =
nullptr)
268 if(mapping ==
nullptr)
270 data_out.build_patches(output_data.degree);
274 data_out.build_patches(*mapping,
276 dealii::DataOut<dim>::curved_inner_cells);
279 unsigned int constexpr n_groups = 4;
280 data_out.write_vtu_with_pvtu_record(
281 output_data.directory, output_data.filename, output_counter, mpi_comm, n_groups);
286 unsigned int output_counter;
287 dealii::ObserverPointer<dealii::Mapping<dim>
const> mapping;
288 MPI_Comm
const mpi_comm;
290 dealii::Vector<double> aspect_ratios;
292 dealii::DataOut<dim> data_out;
Definition solution_field.h:40
std::shared_ptr< dealii::Quadrature< dim > > create_quadrature(ElementType const &element_type, unsigned int const n_q_points_1d)
Definition quadrature.h:40
ElementType get_element_type(dealii::Triangulation< dim > const &tria)
Definition grid_data.h:70
Definition output_data_base.h:32