OSHUN  beta
Arbitrary Order Spherical-Harmonic 1D-3P Vlasov-Fokker-Planck-Maxwell code
export.h
Go to the documentation of this file.
1 
7 //--------------------------------------------------------------
8 
9  #ifndef DECL_EXPORT_H
10  #define DECL_EXPORT_H
11 
12 //--------------------------------------------------------------
13 //--------------------------------------------------------------
14 namespace Export_Files{
15 
16  namespace ofconventions {
17  const int ofile_digits = 5;
18  const string ofile_extension = ".txt";
19  const int ofile_precision = 6;
20 
21  const int rfile_digits = 3;
22  const int rank_digits = 6;
23  const string rfile_extension = ".dat";
24 
25  const string h5file_extension = ".h5";
26  }
27 //--------------------------------------------------------------
28 
29 // Folder and filename functions
30  template<typename T> inline std::string stringify(T const& x) {
31  std::ostringstream out;
32  out << x;
33  return out.str();
34  }
35 
36  int Makefolder(string _name);
37 
38  void Folders();
39 
40 
41 //--------------------------------------------------------------
42 
43 // Contains all the info you need to construct an output axis
44  class DefaultTags {
45  public:
46 // Contents
47  vector<string> time;
48  vector<string> space;
49  vector<string> fld;
50  vector<string> mom;
51  vector<string> pvsx;
52  vector<string> fvsx;
53  vector<string> pvspvsx;
54 
55  DefaultTags(size_t species);
57  };
58 //--------------------------------------------------------------
59 
60 // redefinitions of "<<" operator for data containers
61  template <class T>
62  ofstream& operator<<(ofstream& s, const vector<T>& v) {
63  s << setprecision(ofconventions::ofile_precision);
64  s << 1 <<"\n";
65  s << v.size()<<"\n";
66  for (size_t i(0); i < v.size(); ++i) {
67  s << v[i]<<"\n";
68  }
69  return s;
70  }
71 
72  template <class T>
73  ofstream& operator<<(ofstream& s, const valarray<T>& v) {
74  s << setprecision(ofconventions::ofile_precision);
75  s << 1 <<"\n";
76  s << v.size()<<"\n";
77  for (size_t i(0); i < v.size(); ++i) {
78  s << v[i]<<"\n";
79  }
80  return s;
81  }
82 
83  template <class T>
84  ofstream& operator<<(ofstream& s, const Array2D<T>& array2D) {
85  s << setprecision(ofconventions::ofile_precision);
86  s << 2 <<"\n";
87  s << array2D.dim1()<<"\n";
88  s << array2D.dim2()<<"\n";
89  for (size_t i(0); i < array2D.dim(); ++i) {
90  s << array2D(i)<<"\n";
91  }
92  return s;
93  }
94 
95  template <class T>
96  ofstream& operator<<(ofstream& s, const Array3D<T>& array3D) {
97  s << setprecision(ofconventions::ofile_precision);
98  s << 3 <<"\n";
99  s << array3D.dim1()<<"\n";
100  s << array3D.dim2()<<"\n";
101  s << array3D.dim3()<<"\n";
102  for (size_t i(0); i < array3D.dim(); ++i) {
103  s << array3D(i)<<"\n";
104  }
105  return s;
106  }
107 //--------------------------------------------------------------
108 
109 //--------------------------------------------------------------
110 
111 // Contains all the info you need to construct an output axis
112  class oAxis {
113  public:
114 // Contents
115  string label; // e.g. label = cm
116  string units;
117  float min, max;
118  size_t sz;
119 
120 // Constructors
121  oAxis();
122  oAxis(const float _m, const float _M, const size_t _sz);
123  oAxis(const string _l, const string _u, const float _m, const float _M,
124  const size_t _sz);
125 
126 // Copy constructor
127  oAxis(const oAxis& other);
128  ~oAxis(){}
129  };
130 //--------------------------------------------------------------
131 
132 //--------------------------------------------------------------
133 // Facilitates the generation of a header
134  class Header {
135 //--------------------------------------------------------------
136  public:
137 // Constructor
138  Header() { };
139  Header(oAxis _x, // 1D
140  string _Ql, float _Qc, string _tl, string _tu, float _tc, string _oD);
141  Header(oAxis _x, oAxis _y, // 2D
142  string _Ql, float _Qc, string _tl, string _tu, float _tc, string _oD);
143  Header(oAxis _x, oAxis _y, oAxis _z, // 3D
144  string _Ql, float _Qc, string _tl, string _tu, float _tc, string _oD);
145  Header(vector< oAxis > _xyz, // xD
146  string _Ql, float _Qc, string _tl, string _tu, float _tc, string _oD);
147  size_t dim();
148 
149  valarray<float> axis(const size_t i); // this is axis 0, 1, 2
150  string label(const size_t i);
151  string units(const size_t i);
152  float conv(const size_t i);
153 
154  float min(const size_t i) {return(xyz_axis[i].min);}
155  float max(const size_t i) {return(xyz_axis[i].max);}
156 
157  string Title_label();
158  float Title_conv();
159  string Time_label();
160  float Time_conv();
161  string Directory();
162 
163  private:
164  vector< oAxis > xyz_axis; // axis 0, 1, 2 : size 0-2
165  string title, time, timeU;
166  float titleC, timeC;
167  string oDir;
168  };
169 //--------------------------------------------------------------
170 
171 //--------------------------------------------------------------
172 // Main facility for exporting data
173  class Xport {
174 //--------------------------------------------------------------
175  public:
176 // Constructor
178  const vector< string > oTags,
179  string homedir="");
180 
181  void Export_h5(const std::string tag, std::valarray<float> ex,
182  const size_t& step, const int spec = -1);
183  void Export_h5(const std::string tag, Array2D<float> ex,
184  const size_t& step, const int spec = -1);
185  void Export_h5(const std::string tag, Array3D<float> ex,
186  const size_t& step, const int spec = -1);
187 
188  H5::H5File hmake_file(string ofilename);
189  void hclose_file(H5::H5File &file);
190  void hinit_attr(H5::H5File &hfilehandle, const std::string tag,
191  size_t step, float xmax, float xmin);
192  void hinit_attr2(H5::H5File &hfilehandle, const std::string tag,
193  size_t step, float xmax[], float xmin[]);
194  void haxis(H5::Group &hgrouphandle, string axismainname, float axisrange[2],
195  string axislongname, string axisname,
196  string axistype, string axisunits);
197  void hfile_add_attr(H5::H5File &hfilehandle, string attrname, int attrdata);
198  void hfile_add_attr2(H5::H5File &hfilehandle, string attrname, int attrdata[2]);
199  void hfile_add_attr(H5::H5File &hfilehandle, string attrname, float attrdata);
200  void hfile_add_attr2(H5::H5File &hfilehandle, string attrname, float attrdata[2]);
201  void hfile_add_attr(H5::H5File &hfilehandle, string attrname, string attrdata);
202  void hfile_add_attr_todataset(H5::DataSet &hdatasethandle, string attrname, string attrdata);
203 
204 
205  private:
206  map< string, Header > Hdr; // Dictionary of headers
207  string oH5Fextension(size_t step, int species = -1);
208 
209  };
210 //--------------------------------------------------------------
211 
212 //--------------------------------------------------------------
214 //--------------------------------------------------------------
215  public:
216  Restart_Facility(const int rank, string homedir="");
217 
218  void Read(const int rank, const size_t re_step, State1D& Y);
219  void Write(const int rank, const size_t re_step, State1D& Y);
220 
221  private:
222  string hdir;
223  string rFextension(const int rank, const size_t rstep);
224  };
225 //--------------------------------------------------------------
226 }
227 //**************************************************************
228 
229 
230 
231 //**************************************************************
232 //--------------------------------------------------------------
233 namespace Output_Data{
234 //--------------------------------------------------------------
235 //--------------------------------------------------------------
236 // LEGENDRE VALUES
237 // A 2D space is generated from px, |p| axis. The cos8 for
238 // this 2D space is calculated and then the Legendre polynomials
239 // for each cos8 are calculated. We end up with a 1D array for l
240 // containing 2D matrices of the polynomials for each cos8
241  class PLegendre1D {
242  public:
243 // Constructors/Destructors
244  PLegendre1D(size_t Nl, size_t Nm, size_t Np, float pmin, float pmax,
245  size_t Npx );
246  PLegendre1D(const PLegendre1D& other);
247  ~PLegendre1D();
248 
249 // Access
250  size_t dim() const { return (*plegendre).size(); }
251  Array2D<float>& operator()(size_t i) { return (*plegendre)[i]; }
252  Array2D<float> operator()(size_t i) const { return (*plegendre)[i]; }
253 
254 private:
255  vector< Array2D<float> > *plegendre;
256  size_t lmax;
257  };
258 //--------------------------------------------------------------
259 
260 //--------------------------------------------------------------
261 // LEGENDRE VALUES
262 // A 2D space is generated from px, |p| axis. The cos8 for
263 // this 2D space is calculated and then the Legendre polynomials
264 // for each cos8 are calculated. We end up with a 1D array for l
265 // containing 2D matrices of the polynomials for each cos8
266  class PLegendre2D {
267  public:
268 // Constructors/Destructors
269  PLegendre2D(size_t Nl, size_t Nm, size_t Np, float pmin, float pmax,
270  size_t Npx , size_t Npy);
271  PLegendre2D(const PLegendre2D& other);
272  ~PLegendre2D();
273 
274 // Access
275  size_t dim() const { return (*plegendre).size(); }
276  Array2D<float>& operator()(size_t i) { return (*plegendre)[i]; }
277  Array2D<float> operator()(size_t i) const { return (*plegendre)[i]; }
278 
279 private:
280  vector< Array2D<float> > *plegendre;
281  size_t lmax;
282  };
283 //--------------------------------------------------------------
284 
285 
286 //--------------------------------------------------------------
287 // This class converts the state Y at a specific location
288 // "x0" and calculates the integral \int\int f*dpy*dpz
289 //--------------------------------------------------------------
290  class p1x1_1D {
291 //--------------------------------------------------------------
292  public:
293 // Constructor/Destructor
294  p1x1_1D(const Grid_Info& _G);
295  p1x1_1D(const p1x1_1D& other);
296 
297  ~p1x1_1D();
298 
299 // Methods
300  valarray<float> operator()(DistFunc1D& df, size_t x0, size_t s) ;
301 
302 // Access
303  size_t Species() const { return p1x1.size(); }
304 // size_t Nl(size_t s) const { return Pl[s].dim(); }
305 // size_t Npx(size_t s) const { return polarR[s].dim1(); }
306 // size_t Np(size_t s) const { return polarR[s].dim2(); }
307  float Pmin(size_t s) const { return pmin[s]; }
308  float Pmax(size_t s) const { return pmax[s]; }
309 
310 // PLegendre1D PL(size_t s) const { return Pl[s]; }
311  valarray<float> p1_x1(size_t s) const { return p1x1[s]; }
312 // Array2D<float> PolarR(size_t s) const { return polarR[s]; }
313 
314  private:
315 // vector< PLegendre1D > Pl;
316 // vector< Array2D<float> > polarR;
317 
318  vector< valarray<float> > p1x1;
319  vector<float> pmin, pmax;
320  };
321 //--------------------------------------------------------------
322 
323 //--------------------------------------------------------------
324 // This class converts the state Y at a specific location
325 // "x0" and calculates the integral \int\int f*dpy*dpz
326 //--------------------------------------------------------------
327  class p2p1x1_1D {
328 //--------------------------------------------------------------
329  public:
330 // Constructor/Destructor
331  p2p1x1_1D(const Grid_Info& _G);
332  p2p1x1_1D(const p2p1x1_1D& other);
333 
334  ~p2p1x1_1D();
335 
336 // Methods
337  Array2D<float> operator()(DistFunc1D& df, size_t x0, size_t s) ;
338 
339 // Access
340  size_t Species() const { return p2p1x1.size(); }
341  size_t Nl(size_t s) const { return numl[s]; }
342  size_t Nm(size_t s) const { return numm[s]; }
343  size_t Npx(size_t s) const { return Pl[s](0).dim1(); }
344  size_t Npy(size_t s) const { return Pl[s](0).dim2(); }
345  // size_t Np(size_t s) const { return polarR[s].dim2(); }
346  float Pmin(size_t s) const { return pmin[s]; }
347  float Pmax(size_t s) const { return pmax[s]; }
348 
349 
350  PLegendre2D PL(size_t s) const { return Pl[s]; }
351  Array2D<float> p2p1_x1(size_t s) const { return p2p1x1[s]; }
352  Array2D<float> prad(size_t s) const { return pr[s]; }
353  Array2D<size_t> npcell(size_t s) const {return nextpcell[s];}
354  Array2D<float> dcell(size_t s) const {return distancetothatcell[s];}
355 
356  private:
357  vector<float> pmin, pmax;
358  vector<size_t> numl, numm;
359  vector< PLegendre2D > Pl;
360  vector< Array2D<float> > pr;
361  vector< Array2D<size_t> > nextpcell;
362  vector< Array2D<float> > distancetothatcell;
363 
364  vector< Array2D<float> > p2p1x1;
365 
366  };
367 //--------------------------------------------------------------
368 
369 //--------------------------------------------------------------
370 // This class converts the state Y at a specific location
371 // "x0" and calculates the integral \int\int f*dpy*dpz
372 //--------------------------------------------------------------
373  class fx1_1D {
374 //--------------------------------------------------------------
375  public:
376 // Constructor/Destructor
377  fx1_1D(const Grid_Info& _G);
378  fx1_1D(const fx1_1D& other);
379 
380  ~fx1_1D();
381 
382 // Methods
383  Array2D<float> operator()(DistFunc1D& df, size_t l, size_t m, size_t x0, size_t s) ;
384 
385 // Access
386  size_t Species() const { return nump.size(); }
387  // size_t Npx(size_t s) const { return f0x1[s].size(); }
388  size_t Np(size_t s) const { return nump[s]; }
389  float Pmin(size_t s) const { return pmin[s]; }
390  float Pmax(size_t s) const { return pmax[s]; }
391 
392 
393  // valarray<float> f_x1(size_t s) const { return f0x1[s]; }
394 
395 
396  private:
397  // vector< valarray<float> > f0x1;
398  vector<float> pmin, pmax;
399  vector<float> nump;
400 
401  };
402 //--------------------------------------------------------------
403 
404 //--------------------------------------------------------------
405 // Output Functor
407 //--------------------------------------------------------------
408  public:
409 // Constructor
411  const vector< string > _oTags,
412  string homedir="")
413  : expo( _grid.axis, _oTags, homedir),
414  px_x( _grid ), //pxpy_x( _grid),
415  f_x( _grid),
416  oTags(_oTags) { }
417 
418 // Functor
419 // void operator()(const State1D& Y, const size_t tout);
420 // void operator()(const State1D& Y, const Grid_Info& grid, const size_t tout,
421 // const Parallel_Environment_1D& PE);
422  void operator()(const State1D& Y, const Grid_Info& grid, const size_t tout,
423  const Parallel_Environment_1D& PE);
424  void distdump(const State1D& Y, const Grid_Info& grid, const size_t tout,
425  const Parallel_Environment_1D& PE);
426 
427  private:
428  size_t Nbc;
432 // p2p1x1_1D pxpy_x;
433  vector< string > oTags;
434 
435  void Ex(const State1D& Y, const Grid_Info& grid, const size_t tout,
436  const Parallel_Environment_1D& PE);
437  void Ey(const State1D& Y, const Grid_Info& grid, const size_t tout,
438  const Parallel_Environment_1D& PE);
439  void Ez(const State1D& Y, const Grid_Info& grid, const size_t tout,
440  const Parallel_Environment_1D& PE);
441  void Bx(const State1D& Y, const Grid_Info& grid, const size_t tout,
442  const Parallel_Environment_1D& PE);
443  void By(const State1D& Y, const Grid_Info& grid, const size_t tout,
444  const Parallel_Environment_1D& PE);
445  void Bz(const State1D& Y, const Grid_Info& grid, const size_t tout,
446  const Parallel_Environment_1D& PE);
447  void px(const State1D& Y, const Grid_Info& grid, const size_t tout,
448  const Parallel_Environment_1D& PE);
449 // void pxpy(const State1D& Y, const Grid_Info& grid, const size_t tout,
450 // const Parallel_Environment_1D& PE);
451  void f0(const State1D& Y, const Grid_Info& grid, const size_t tout,
452  const Parallel_Environment_1D& PE);
453  void f10(const State1D& Y, const Grid_Info& grid, const size_t tout,
454  const Parallel_Environment_1D& PE);
455  void f11(const State1D& Y, const Grid_Info& grid, const size_t tout,
456  const Parallel_Environment_1D& PE);
457  void f20(const State1D& Y, const Grid_Info& grid, const size_t tout,
458  const Parallel_Environment_1D& PE);
459  void fl0(const State1D& Y, const Grid_Info& grid, const size_t tout,
460  const Parallel_Environment_1D& PE);
461  void n(const State1D& Y, const Grid_Info& grid, const size_t tout,
462  const Parallel_Environment_1D& PE);
463  void T(const State1D& Y, const Grid_Info& grid, const size_t tout,
464  const Parallel_Environment_1D& PE);
465  void Jx(const State1D& Y, const Grid_Info& grid, const size_t tout,
466  const Parallel_Environment_1D& PE);
467  void Jy(const State1D& Y, const Grid_Info& grid, const size_t tout,
468  const Parallel_Environment_1D& PE);
469  void Jz(const State1D& Y, const Grid_Info& grid, const size_t tout,
470  const Parallel_Environment_1D& PE);
471  void Qx(const State1D& Y, const Grid_Info& grid, const size_t tout,
472  const Parallel_Environment_1D& PE);
473  void Qy(const State1D& Y, const Grid_Info& grid, const size_t tout,
474  const Parallel_Environment_1D& PE);
475  void Qz(const State1D& Y, const Grid_Info& grid, const size_t tout,
476  const Parallel_Environment_1D& PE);
477  void vNx(const State1D& Y, const Grid_Info& grid, const size_t tout,
478  const Parallel_Environment_1D& PE);
479  void vNy(const State1D& Y, const Grid_Info& grid, const size_t tout,
480  const Parallel_Environment_1D& PE);
481  void vNz(const State1D& Y, const Grid_Info& grid, const size_t tout,
482  const Parallel_Environment_1D& PE);
483 
484  void Ux(const State1D& Y, const Grid_Info& grid, const size_t tout,
485  const Parallel_Environment_1D& PE);
486  void Uy(const State1D& Y, const Grid_Info& grid, const size_t tout,
487  const Parallel_Environment_1D& PE);
488  void Uz(const State1D& Y, const Grid_Info& grid, const size_t tout,
489  const Parallel_Environment_1D& PE);
490  void Z(const State1D& Y, const Grid_Info& grid, const size_t tout,
491  const Parallel_Environment_1D& PE);
492  void ni(const State1D& Y, const Grid_Info& grid, const size_t tout,
493  const Parallel_Environment_1D& PE);
494  void Ti(const State1D& Y, const Grid_Info& grid, const size_t tout,
495  const Parallel_Environment_1D& PE);
496 
497 
498  };
499 
500 }
501 
502  #endif
Array2D< float > dcell(size_t s) const
Definition: export.h:354
float Pmin(size_t s) const
Definition: export.h:307
Output_Preprocessor_1D(const Grid_Info &_grid, const vector< string > _oTags, string homedir="")
Definition: export.h:410
float Pmax(size_t s) const
Definition: export.h:308
size_t Species() const
Definition: export.h:340
vector< float > pmin
Definition: export.h:319
float min(const size_t i)
Definition: export.h:154
int Makefolder(string _name)
Definition: export.cpp:51
float Pmax(size_t s) const
Definition: export.h:347
std::string stringify(T const &x)
Definition: export.h:30
vector< float > pmin
Definition: export.h:357
Export_Files::Xport expo
Definition: export.h:429
float Pmin(size_t s) const
Definition: export.h:346
const string ofile_extension
Definition: export.h:18
Array2D< float > operator()(size_t i) const
Definition: export.h:252
const int ofile_precision
Definition: export.h:19
vector< valarray< float > > p1x1
Definition: export.h:318
vector< string > fvsx
Definition: export.h:52
Array2D< float > & operator()(size_t i)
Definition: export.h:251
vector< Array2D< float > > distancetothatcell
Definition: export.h:362
float max(const size_t i)
Definition: export.h:155
void Folders()
Definition: export.cpp:74
float Pmax(size_t s) const
Definition: export.h:390
vector< string > mom
Definition: export.h:50
vector< string > pvsx
Definition: export.h:51
Array2D< float > & operator()(size_t i)
Definition: export.h:276
vector< string > fld
Definition: export.h:49
size_t Np(size_t s) const
Definition: export.h:388
vector< Array2D< float > > * plegendre
Definition: export.h:280
vector< Array2D< float > > pr
Definition: export.h:360
Definition: state.h:577
vector< Array2D< float > > * plegendre
Definition: export.h:255
size_t Species() const
Definition: export.h:386
size_t Npx(size_t s) const
Definition: export.h:343
vector< size_t > numm
Definition: export.h:358
vector< PLegendre2D > Pl
Definition: export.h:359
vector< float > pmin
Definition: export.h:398
Array2D< float > operator()(size_t i) const
Definition: export.h:277
size_t dim() const
Definition: export.h:275
vector< string > pvspvsx
Definition: export.h:53
PLegendre2D PL(size_t s) const
Definition: export.h:350
vector< Array2D< float > > p2p1x1
Definition: export.h:364
vector< string > time
Definition: export.h:47
Array2D< size_t > npcell(size_t s) const
Definition: export.h:353
size_t Npy(size_t s) const
Definition: export.h:344
Array2D< float > prad(size_t s) const
Definition: export.h:352
vector< string > space
Definition: export.h:48
size_t Species() const
Definition: export.h:303
vector< float > nump
Definition: export.h:399
float Pmin(size_t s) const
Definition: export.h:389
Array2D< float > p2p1_x1(size_t s) const
Definition: export.h:351
size_t dim() const
Definition: export.h:250
const string h5file_extension
Definition: export.h:25
vector< Array2D< size_t > > nextpcell
Definition: export.h:361
vector< oAxis > xyz_axis
Definition: export.h:164
size_t Nm(size_t s) const
Definition: export.h:342
size_t Nl(size_t s) const
Definition: export.h:341
The 1D distribution function is the container for all SHarmonic1D per species.
Definition: state.h:376
valarray< float > p1_x1(size_t s) const
Definition: export.h:311
const string rfile_extension
Definition: export.h:23
map< string, Header > Hdr
Definition: export.h:206