include/meltpooldg/post_processing/postprocessor.hpp Source File

Developer Documentation: include/meltpooldg/post_processing/postprocessor.hpp Source File
Developer Documentation
postprocessor.hpp
Go to the documentation of this file.
1#pragma once
2#include <deal.II/base/exceptions.h>
3#include <deal.II/base/mpi.h>
4
5#include <deal.II/grid/tria.h>
6
7#include <deal.II/lac/generic_linear_algebra.h>
8#include <deal.II/lac/la_parallel_block_vector.h>
9#include <deal.II/lac/la_parallel_vector.h>
10
11#include <deal.II/numerics/data_component_interpretation.h>
12
13#include <deal.II/particles/particle.h>
14#include <deal.II/particles/particle_handler.h>
15
20
21#include <complex>
22#include <string>
23#include <utility>
24#include <vector>
25
26
27// @ todo: !!! clean-up and refactoring !!!
28
29namespace MeltPoolDG
30{
31 template <int dim, typename number>
33 {
34 public:
35 Postprocessor(const MPI_Comm mpi_communicator_in,
36 const OutputData<number> &output_data_in,
38 const dealii::Mapping<dim> &mapping_in,
39 const dealii::Triangulation<dim> &triangulation_in,
40 const ConditionalOStream &pcout_in);
41
45 void
46 process(const int n_time_step,
47 const GenericDataOut<dim, number> &generic_data_out,
48 const number time = -1.0,
49 const bool force_output = false,
50 const bool force_update_requested_output_variables = false);
51
55 void
56 process(const int n_time_step,
57 const std::function<void(GenericDataOut<dim, number> &)> &attach_output_vectors,
58 const number time = -1.0);
59
67 void
68 process_particles(const int n_time_step, const number time);
69
73 inline bool
74 is_output_timestep(const int n_time_step, const number time) const
75 {
76 if (n_time_step == 0)
77 return true;
78 if (time - time_at_last_output >= output_data.write_time_step_size)
79 return true;
80 return not(n_time_step % output_data.write_frequency);
81 }
82
83 template <class Archive>
84 void
85 serialize(Archive &ar, const unsigned int /*version*/)
86 {
89 }
90
91 void
93 dealii::Particles::ParticleHandler<dim> const *particle_handler,
94 const std::vector<std::string> &property_names,
95 const std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
96 &property_data_component_interpretation)
97 {
98 obstacle_output.particle_handler = particle_handler;
99 obstacle_output.property_names = property_names;
101 property_data_component_interpretation;
102 }
103
116 template <typename ComplexVectorType>
117 void
118 output_complex_valued_vector_to_csv(const int n_time_step,
119 const number time,
120 const ComplexVectorType &output_vector,
121 const std::string &filename,
122 const bool force_output = false) const;
123
124 private:
125 const MPI_Comm mpi_communicator;
127 const dealii::Mapping<dim> &mapping;
128 const dealii::Triangulation<dim> &triangulation;
130 const bool do_simplex;
131 const number end_time;
133
135 {
136 const dealii::Particles::ParticleHandler<dim> *particle_handler = nullptr;
137 std::vector<std::string> property_names;
138 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
141
142 // list of indices for the requested variables
143 std::vector<unsigned int> idx_req_vars;
144
146 std::vector<std::pair<number, std::string>> vector_times_and_names;
147
149 std::vector<std::pair<number, std::string>> particle_times_and_names;
150
158 void
159 clean_pvd(std::vector<std::pair<number, std::string>> &times_and_names);
160
161 void
162 write_paraview_files(const unsigned int n_time_step,
163 const number time,
164 const GenericDataOut<dim, number> &generic_data_out,
165 const bool force_output_all = false);
166
177 void
178 write_particle_paraview_files(const unsigned int n_time_step, const number time);
179
180 void
182 };
183
184 // templated function definitions
185 template <int dim, typename number>
186 template <typename ComplexVectorType>
187 void
189 const int n_time_step,
190 const number time,
191 const ComplexVectorType &output_vector,
192 const std::string &filename,
193 const bool force_output) const
194 {
195 if (not(is_output_timestep(n_time_step, time) or force_output))
196 return;
197
198 static int file_count = 0;
199
200 // Only rank 0 writes the output file to avoid multiple processes writing to the same file in
201 // parallel
202 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0)
203 {
204 std::string full_filename =
205 output_data.directory + '/' + filename + "_" + std::to_string(file_count) + ".csv";
206
207 std::ofstream file(full_filename, std::ios::out | std::ios::trunc);
208 AssertThrow(file, dealii::ExcMessage("Can not open the file: " + full_filename));
209
210 file << "Time: " << time << '\n';
211 file << "N time step: " << n_time_step << '\n';
212 file << '\n';
213 file << "Real part;Imaginary part\n";
214
215 for (const auto &v : output_vector)
216 file << v.real() << ';' << v.imag() << '\n';
217 }
218
219 ++file_count;
220 }
221} // namespace MeltPoolDG
Definition conditional_ostream.hpp:7
A generic utility for managing simulation output data in the MeltPoolDG context.
Definition generic_data_out.hpp:32
Definition postprocessor.hpp:33
void serialize(Archive &ar, const unsigned int)
Definition postprocessor.hpp:85
const dealii::Triangulation< dim > & triangulation
Definition postprocessor.hpp:128
std::vector< std::pair< number, std::string > > particle_times_and_names
Times and filenames of previously written particle output.
Definition postprocessor.hpp:149
std::vector< unsigned int > idx_req_vars
Definition postprocessor.hpp:143
void process_particles(const int n_time_step, const number time)
Definition postprocessor.cpp:107
struct MeltPoolDG::Postprocessor::ObstacleOutput obstacle_output
number time_at_last_output
Definition postprocessor.hpp:132
const bool do_simplex
Definition postprocessor.hpp:130
void output_complex_valued_vector_to_csv(const int n_time_step, const number time, const ComplexVectorType &output_vector, const std::string &filename, const bool force_output=false) const
Definition postprocessor.hpp:188
void process(const int n_time_step, const GenericDataOut< dim, number > &generic_data_out, const number time=-1.0, const bool force_output=false, const bool force_update_requested_output_variables=false)
Definition postprocessor.cpp:54
void write_paraview_files(const unsigned int n_time_step, const number time, const GenericDataOut< dim, number > &generic_data_out, const bool force_output_all=false)
Definition postprocessor.cpp:121
const ConditionalOStream pcout
Definition postprocessor.hpp:129
std::vector< std::pair< number, std::string > > vector_times_and_names
Times and filenames of previously written vector output.
Definition postprocessor.hpp:146
void register_obstacle_output(dealii::Particles::ParticleHandler< dim > const *particle_handler, const std::vector< std::string > &property_names, const std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > &property_data_component_interpretation)
Definition postprocessor.hpp:92
void clean_pvd(std::vector< std::pair< number, std::string > > &times_and_names)
Clean non-existing *.pvtu files from the *.pvd file. This is required if we perform a restart and wri...
Definition postprocessor.cpp:348
void write_particle_paraview_files(const unsigned int n_time_step, const number time)
Writes particles from the registered particle handler to ParaView files, including their positions an...
Definition postprocessor.cpp:288
void print_boundary_ids()
Definition postprocessor.cpp:365
const MPI_Comm mpi_communicator
Definition postprocessor.hpp:125
bool is_output_timestep(const int n_time_step, const number time) const
Definition postprocessor.hpp:74
const OutputData< number > & output_data
Definition postprocessor.hpp:126
const number end_time
Definition postprocessor.hpp:131
const dealii::Mapping< dim > & mapping
Definition postprocessor.hpp:127
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
Definition output_data.hpp:41
Definition postprocessor.hpp:135
std::vector< std::string > property_names
Definition postprocessor.hpp:137
const dealii::Particles::ParticleHandler< dim > * particle_handler
Definition postprocessor.hpp:136
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > property_data_component_interpretation
Definition postprocessor.hpp:139
Definition time_stepping_data.hpp:11