ASPECT
visualization.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2011-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 
16 #ifndef _aspect_postprocess_visualization_h
17 #define _aspect_postprocess_visualization_h
18 
21 #include <aspect/plugins.h>
22 
27 
28 #include <thread>
29 
30 namespace aspect
31 {
32  namespace Postprocess
33  {
34  namespace VisualizationPostprocessors
35  {
39  inline void average_quantities(std::vector<Vector<double>> &quantities)
40  {
41  const unsigned int N = quantities.size();
42  const unsigned int M = quantities[0].size();
43  for (unsigned int m=0; m<M; ++m)
44  {
45  double sum = 0;
46  for (unsigned int q=0; q<N; ++q)
47  sum += quantities[q](m);
48 
49  const double average = sum/N;
50  for (unsigned int q=0; q<N; ++q)
51  quantities[q](m) = average;
52  }
53  }
54 
117  template <int dim>
119  {
120  public:
140  explicit Interface (const std::string &physical_units = "");
141 
153  virtual
154  std::string
155  get_physical_units () const;
156 
171  virtual
172  std::list<std::string>
174 
175  private:
179  const std::string physical_units;
180  };
181 
182 
183 
196  template <int dim>
197  class CellDataVectorCreator : public Interface<dim>
198  {
199  public:
205  explicit CellDataVectorCreator (const std::string &physical_units = "");
206 
210  ~CellDataVectorCreator () override = default;
211 
230  virtual
231  std::pair<std::string, std::unique_ptr<Vector<float>>>
232  execute () const = 0;
233  };
234 
235 
242  template <int dim>
244  {
245  public:
251  virtual
252  ~SurfaceOnlyVisualization () = default;
253  };
254  }
255 
256 
272  template <int dim>
273  class Visualization : public Interface<dim>, public ::aspect::SimulatorAccess<dim>
274  {
275  public:
279  Visualization ();
280 
284  std::pair<std::string,std::string>
285  execute (TableHandler &statistics) override;
286 
290  void
291  update () override;
292 
311  static
312  void
313  register_visualization_postprocessor (const std::string &name,
314  const std::string &description,
315  void (*declare_parameters_function) (ParameterHandler &),
316  std::unique_ptr<VisualizationPostprocessors::Interface<dim>>(*factory_function) ());
317 
325  std::list<std::string>
326  required_other_postprocessors () const override;
327 
331  static
332  void
334 
338  void
339  parse_parameters (ParameterHandler &prm) override;
340 
344  void save (std::map<std::string, std::string> &status_strings) const override;
345 
349  void load (const std::map<std::string, std::string> &status_strings) override;
350 
355  template <class Archive>
356  void serialize (Archive &ar, const unsigned int version);
357 
367  static
368  void
369  write_plugin_graph (std::ostream &output_stream);
370 
375  bool output_pointwise_stress_and_strain() const;
376 
380  DeclException1 (ExcPostprocessorNameNotFound,
381  std::string,
382  << "Could not find entry <"
383  << arg1
384  << "> among the names of registered postprocessors.");
385 
386  private:
395 
401 
410 
415  unsigned int last_output_timestep;
416 
421  unsigned int output_file_number;
422 
427  std::string output_format;
428 
436  unsigned int group_files;
437 
447 
460 
470 
478 
492 
501 
511 
520 
529 
539 
548  void set_last_output_time (const double current_time);
549 
554  void mesh_changed_signal ();
555 
562  static
563  void writer (const std::string &filename,
564  const std::string &temporary_filename,
565  const std::string &file_contents);
566 
571  std::list<std::unique_ptr<VisualizationPostprocessors::Interface<dim>>> postprocessors;
572 
580  {
584  OutputHistory ();
585 
591  ~OutputHistory ();
592 
597  template <class Archive>
598  void serialize (Archive &ar, const unsigned int version);
599 
605 
610  std::string last_mesh_file_name;
611 
620  std::vector<std::pair<double,std::string>> times_and_pvtu_names;
621 
627  std::vector<std::vector<std::string>> output_file_names_by_timestep;
628 
635  std::vector<XDMFEntry> xdmf_entries;
636 
642  std::thread background_thread;
643  };
644 
650 
656 
674  template <typename DataOutType>
675  void write_description_files (const DataOutType &data_out,
676  const std::string &solution_file_prefix,
677  const std::vector<std::string> &filenames,
678  OutputHistory &output_history) const;
679 
680 
690  template <typename DataOutType>
691  std::string write_data_out_data(DataOutType &data_out,
692  OutputHistory &output_history,
693  const std::map<std::string,std::string> &visualization_field_names_and_units) const;
694  };
695  }
696 
697 
704 #define ASPECT_REGISTER_VISUALIZATION_POSTPROCESSOR(classname,name,description) \
705  template class classname<2>; \
706  template class classname<3>; \
707  namespace ASPECT_REGISTER_VISUALIZATION_POSTPROCESSOR_ ## classname \
708  { \
709  aspect::internal::Plugins::RegisterHelper<aspect::Postprocess::VisualizationPostprocessors::Interface<2>,classname<2>> \
710  dummy_ ## classname ## _2d (&aspect::Postprocess::Visualization<2>::register_visualization_postprocessor, \
711  name, description); \
712  aspect::internal::Plugins::RegisterHelper<aspect::Postprocess::VisualizationPostprocessors::Interface<3>,classname<3>> \
713  dummy_ ## classname ## _3d (&aspect::Postprocess::Visualization<3>::register_visualization_postprocessor, \
714  name, description); \
715  }
716 }
717 
718 
719 #endif
virtual void parse_parameters(ParameterHandler &prm)
void write_plugin_graph(std::ostream &output_stream)
std::vector< std::pair< double, std::string > > times_and_pvtu_names
virtual std::list< std::string > required_other_postprocessors() const
virtual void load(const std::map< std::string, std::string > &status_strings)
std::list< std::unique_ptr< VisualizationPostprocessors::Interface< dim > > > postprocessors
Interface(const std::string &physical_units="")
void average_quantities(std::vector< Vector< double >> &quantities)
Definition: visualization.h:39
std::vector< std::vector< std::string > > output_file_names_by_timestep
virtual void save(std::map< std::string, std::string > &status_strings) const
void average(const AveragingOperation operation, const typename DoFHandler< dim >::active_cell_iterator &cell, const Quadrature< dim > &quadrature_formula, const Mapping< dim > &mapping, const MaterialProperties::Property &requested_properties, MaterialModelOutputs< dim > &values_out)
static void declare_parameters(ParameterHandler &prm)
DeclException1(ProbabilityFunctionNegative, Point< dim >,<< "Your probability density function in the particle generator " "returned a negative probability density for the following position: "<< arg1<< ". Please check your function expression.")