Athena++/Atmosphere
Planetary Atmosphere Simulator
outputs.hpp
Go to the documentation of this file.
1 #ifndef OUTPUTS_OUTPUTS_HPP_
2 #define OUTPUTS_OUTPUTS_HPP_
3 //========================================================================================
4 // Athena++ astrophysical MHD code
5 // Copyright(C) 2014 James M. Stone <jmstone@princeton.edu> and other code contributors
6 // Licensed under the 3-clause BSD License, see LICENSE file for details
7 //========================================================================================
9 // \brief provides classes to handle ALL types of data output
10 
11 // C headers
12 
13 // C++ headers
14 #include <cstdio> // std::size_t
15 #include <string>
16 
17 // Athena++ headers
18 #include "../athena.hpp"
19 #include "io_wrapper.hpp"
20 
21 #ifdef HDF5OUTPUT
22 #include <hdf5.h>
23 #endif
24 
25 // forward declarations
26 class Mesh;
27 class ParameterInput;
28 class Coordinates;
29 
30 //----------------------------------------------------------------------------------------
32 // \brief container for parameters read from <output> block in the input file
33 
36  std::string block_name;
37  std::string file_basename;
38  std::string file_id;
39  std::string variable;
40  std::string file_type;
41  std::string data_format;
49  // TODO(felker): some of the parameters in this class are not initialized in constructor
51  output_slicex1(false),output_slicex2(false),output_slicex3(false),
52  output_sumx1(false), output_sumx2(false), output_sumx3(false),
54  islice(0), jslice(0), kslice(0) {}
55 };
56 
57 //----------------------------------------------------------------------------------------
59 // \brief container for output data and metadata; node in nested doubly linked list
60 
61 struct OutputData {
62  std::string type; // one of (SCALARS,VECTORS) used for vtk outputs
63  std::string grid; // (CCC,CCF,CFC,RCC,...)
64  std::string name;
65  std::string long_name;
66  std::string units;
67  AthenaArray<Real> data; // array containing data (usually shallow copy/slice)
68  // ptrs to previous and next nodes in doubly linked list:
70 
71  OutputData() : type("SCALARS"), grid("CCC"), name(""), long_name(""), units(""),
72  pnext(nullptr), pprev(nullptr) {}
73 };
74 
75 //----------------------------------------------------------------------------------------
76 // \brief abstract base class for different output types (modes/formats). Each OutputType
77 // is designed to be a node in a singly linked list created & stored in the Outputs class
78 
79 class OutputType {
80  public:
81  // mark single parameter constructors as "explicit" to prevent them from acting as
82  // implicit conversion functions: for f(OutputType arg), prevent f(anOutputParameters)
83  explicit OutputType(OutputParameters oparams);
84 
85  // rule of five:
86  virtual ~OutputType() = default;
87  // copy constructor and assignment operator (pnext_type, pfirst_data, etc. are shallow
88  // copied)
89  OutputType(const OutputType& copy_other) = default;
90  OutputType& operator=(const OutputType& copy_other) = default;
91  // move constructor and assignment operator
92  OutputType(OutputType&&) = default;
94 
95  // data
96  int out_is, out_ie, out_js, out_je, out_ks, out_ke; // OutputData array start/end index
97  OutputParameters output_params; // control data read from <output> block
98  OutputType *pnext_type; // ptr to next node in singly linked list of OutputTypes
99 
100  // functions
101  void LoadOutputData(MeshBlock *pmb);
102  void AppendOutputDataNode(OutputData *pdata);
103  void ReplaceOutputDataNode(OutputData *pold, OutputData *pnew);
104  void ClearOutputData();
105  bool TransformOutputData(MeshBlock *pmb);
106  bool SliceOutputData(MeshBlock *pmb, int dim);
107  void SumOutputData(MeshBlock *pmb, int dim);
109  Coordinates *pco);
110  // following pure virtual function must be implemented in all derived classes
111  virtual void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) = 0;
112  virtual void CombineBlocks() {};
113 
114  protected:
115  int num_vars_; // number of variables in output
116  // nested doubly linked list of OutputData nodes (of the same OutputType):
117  OutputData *pfirst_data_; // ptr to head OutputData node in doubly linked list
118  OutputData *plast_data_; // ptr to tail OutputData node in doubly linked list
119 };
120 
121 //----------------------------------------------------------------------------------------
123 // \brief derived OutputType class for debug dumps
124 
125 class DebugOutput: public OutputType {
126 public:
127  explicit DebugOutput(OutputParameters oparams) : OutputType(oparams) {}
128  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override;
129 };
130 
131 
132 //----------------------------------------------------------------------------------------
134 // \brief derived OutputType class for history dumps
135 
136 class HistoryOutput : public OutputType {
137  public:
138  explicit HistoryOutput(OutputParameters oparams) : OutputType(oparams) {}
139  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override;
140 };
141 
142 //----------------------------------------------------------------------------------------
144 // \brief derived OutputType class for formatted table (tabular) data
145 
147  public:
148  explicit FormattedTableOutput(OutputParameters oparams) : OutputType(oparams) {}
149  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override;
150 };
151 
152 //----------------------------------------------------------------------------------------
154 // \brief derived OutputType class for vtk dumps
155 
156 class VTKOutput : public OutputType {
157  public:
158  explicit VTKOutput(OutputParameters oparams) : OutputType(oparams) {}
159  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override;
160 };
161 
162 //----------------------------------------------------------------------------------------
164 // \brief derived OutputType class for restart dumps
165 
166 class RestartOutput : public OutputType {
167  public:
168  explicit RestartOutput(OutputParameters oparams) : OutputType(oparams) {}
169  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override;
170 };
171 
172 #ifdef HDF5OUTPUT
173 //----------------------------------------------------------------------------------------
175 // \brief derived OutputType class for Athena HDF5 files
176 
177 class ATHDF5Output : public OutputType {
178  public:
179  // Function declarations
180  explicit ATHDF5Output(OutputParameters oparams) : OutputType(oparams) {}
181  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override;
182  void MakeXDMF();
183 
184  private:
185  // Parameters
186  static const int max_name_length = 20; // maximum length of names excluding \0
187 
188  // Metadata
189  std::string filename; // name of athdf file
190  float code_time; // time in code unit for XDMF
191  int num_blocks_global; // number of MeshBlocks in simulation
192  int nx1, nx2, nx3; // sizes of MeshBlocks
193  int num_datasets; // count of datasets to output
194  int *num_variables; // list of counts of variables per dataset
195  char (*dataset_names)[max_name_length+1]; // array of C-string names of datasets
196  char (*variable_names)[max_name_length+1]; // array of C-string names of variables
197 };
198 #endif
199 
200 //----------------------------------------------------------------------------------------
202 
203 // \brief root class for all Athena++ outputs. Provides a singly linked list of
204 // OutputTypes, with each node representing one mode/format of output to be made.
205 
206 class Outputs {
207  public:
208  Outputs(Mesh *pm, ParameterInput *pin);
209  ~Outputs();
210 
211  void MakeOutputs(Mesh *pm, ParameterInput *pin, bool wtflag=false);
212 
213  private:
214  OutputType *pfirst_type_; // ptr to head OutputType node in singly linked list
215  // (not storing a reference to the tail node)
216 };
217 #endif // OUTPUTS_OUTPUTS_HPP_
218 
219 
220 //----------------------------------------------------------------------------------------
222 // \brief derived OutputType class for Netcdf dumps
223 
224 class NetcdfOutput : public OutputType {
225 public:
228  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag);
229  void CombineBlocks();
230 };
231 
232 //----------------------------------------------------------------------------------------
234 // \brief derived OutputType class for parallel Netcdf dumps
235 
236 class PnetcdfOutput : public OutputType {
237 public:
240  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag);
241 };
242 
243 //----------------------------------------------------------------------------------------
245 // \brief derived OutputType class for FITS dumps
246 
247 class FITSOutput : public OutputType {
248 public:
251  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag);
252 };
253 
254 //----------------------------------------------------------------------------------------
255 
257 // \brief derived OutputType class for particles dumps
259 public:
262  void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag);
263  //void CombineBlocks();
264 };
265 
267 int getNumVariables(std::string grid, AthenaArray<Real> const& data);
double Real
Definition: athena.hpp:29
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override
Definition: debug.cpp:29
DebugOutput(OutputParameters oparams)
Definition: outputs.hpp:127
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag)
FITSOutput(OutputParameters oparams)
FormattedTableOutput(OutputParameters oparams)
Definition: outputs.hpp:148
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override
HistoryOutput(OutputParameters oparams)
Definition: outputs.hpp:138
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override
Definition: history.cpp:45
Definition: mesh.hpp:203
void CombineBlocks()
NetcdfOutput(OutputParameters oparams)
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag)
virtual ~OutputType()=default
OutputType & operator=(OutputType &&)=default
void AppendOutputDataNode(OutputData *pdata)
Definition: outputs.cpp:864
int out_ie
Definition: outputs.hpp:96
void ClearOutputData()
Definition: outputs.cpp:905
OutputData * plast_data_
Definition: outputs.hpp:118
bool TransformOutputData(MeshBlock *pmb)
Definition: outputs.cpp:945
OutputType(OutputParameters oparams)
Definition: outputs.cpp:108
void CalculateCartesianVector(AthenaArray< Real > &src, AthenaArray< Real > &dst, Coordinates *pco)
Definition: outputs.cpp:1158
void SumOutputData(MeshBlock *pmb, int dim)
Definition: outputs.cpp:1085
int num_vars_
Definition: outputs.hpp:112
int out_ks
Definition: outputs.hpp:96
int out_js
Definition: outputs.hpp:96
virtual void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag)=0
OutputType * pnext_type
Definition: outputs.hpp:98
int out_ke
Definition: outputs.hpp:96
void ReplaceOutputDataNode(OutputData *pold, OutputData *pnew)
Definition: outputs.cpp:879
void LoadOutputData(MeshBlock *pmb)
Definition: outputs.cpp:364
OutputType(OutputType &&)=default
OutputType(const OutputType &copy_other)=default
OutputParameters output_params
Definition: outputs.hpp:97
bool SliceOutputData(MeshBlock *pmb, int dim)
Definition: outputs.cpp:975
int out_is
Definition: outputs.hpp:96
OutputData * pfirst_data_
Definition: outputs.hpp:117
OutputType & operator=(const OutputType &copy_other)=default
virtual void CombineBlocks()
Definition: outputs.hpp:112
int out_je
Definition: outputs.hpp:96
void MakeOutputs(Mesh *pm, ParameterInput *pin, bool wtflag=false)
Definition: outputs.cpp:921
~Outputs()
Definition: outputs.cpp:351
OutputType * pfirst_type_
Definition: outputs.hpp:214
Outputs(Mesh *pm, ParameterInput *pin)
Definition: outputs.cpp:120
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag)
ParticlesTableOutput(OutputParameters oparams)
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag)
PnetcdfOutput(OutputParameters oparams)
RestartOutput(OutputParameters oparams)
Definition: outputs.hpp:168
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override
Definition: restart.cpp:40
void WriteOutputFile(Mesh *pm, ParameterInput *pin, bool flag) override
VTKOutput(OutputParameters oparams)
Definition: outputs.hpp:158
int getNumVariables(std::string grid, AthenaArray< Real > const &data)
OutputData * pnext
Definition: outputs.hpp:69
OutputData()
Definition: outputs.hpp:71
std::string type
Definition: outputs.hpp:62
std::string grid
Definition: outputs.hpp:63
AthenaArray< Real > data
Definition: outputs.hpp:67
std::string name
Definition: outputs.hpp:64
std::string units
Definition: outputs.hpp:66
OutputData * pprev
Definition: outputs.hpp:69
std::string long_name
Definition: outputs.hpp:65
bool output_slicex3
Definition: outputs.hpp:44
bool output_slicex2
Definition: outputs.hpp:44
bool cartesian_vector
Definition: outputs.hpp:46
bool output_slicex1
Definition: outputs.hpp:44
std::string variable
Definition: outputs.hpp:39
std::string data_format
Definition: outputs.hpp:41
bool include_ghost_zones
Definition: outputs.hpp:46
std::string file_type
Definition: outputs.hpp:40
std::string block_name
Definition: outputs.hpp:36
std::string file_id
Definition: outputs.hpp:38
std::string file_basename
Definition: outputs.hpp:37