O P A R - Open Architecture Particle in Cell Simulation - Version 3.0
Plasma simulations with dust particles
 All Classes Files Functions Variables Friends Macros Groups Pages
diagnostic.h
Go to the documentation of this file.
1 
5 #ifndef DIAGNOSTIC_H
6 #define DIAGNOSTIC_H
7 #include "normalization.h"
8 #include "dimensionality.h"
9 #include "task.h"
10 #include "parameter.h"
11 #include "simulation.h"
12 #include "numeric.h"
13 #include <vector>
14 #include <fstream>
15 //---------------------------------------------------------------------------------------------------------------------
16 class Species;
17 
19 #define ID_DIAGPORT "DiagPort"
20 #define ID_DIAGNOSTIC "Diagnostic"
21 
22 
23 
25 #define GID_1DGRID "1d-grid"
26 #define GID_VALUE "scalar"
27 #define GID_1DPOS "1d-vec"
28 #define GID_1DPS "4d-vec"
29 
34 
35 #define DOUBLEVEC std::vector<double>
36 
44 class DiagPort : public Task {
45  protected:
47  bool Series;
50  public:
52  DiagPort () : Sim(NULL) {};
54  virtual ~DiagPort () {};
56  std::string GetClassName () const {return ID_DIAGPORT;};
57 
62  void Init ();
63 
67  bool Execute () {return true;};
68 
70  virtual void BeginStep (const std::string& strType = "", const std::string& strName = "") = 0;
71  virtual void EndStep () = 0;
72  virtual void Out (const double d) = 0;
73  virtual void Out (const Position &pos) = 0;
74  virtual void Out (const DOUBLEVEC& vec) = 0;
75  virtual void Out (const Velocity& V, double dF = 1.0) = 0;
76  virtual void Out (const grid<double>& g, double dF = 1.0) = 0;
77  virtual void Out (const grid<Position>& g, double dF = 1.0) = 0;
78  virtual void Out (const grid<Velocity>& g, double dF = 1.0) = 0;
79 
91 
92  protected:
93  PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm);
94 };
95 
104 class File : public DiagPort {
105  protected:
107  std::string FileName;
109  std::ofstream outfile;
110  public:
112  File () {};
114  virtual ~File () { if (outfile) outfile.close(); };
115 
121  virtual void Init ();
122 
126  virtual void BeginStep (const std::string& strType = "", const std::string& strName = "");
128  virtual void EndStep ();
129 
134  virtual void Out (double d);
135  virtual void Out (const Position &pos);
136 
141  virtual void Out (const DOUBLEVEC& vec);
142 
147  virtual void Out (const Velocity& V, double dF = 1.0);
148 
152  virtual void Out (const grid<double>& g, double dF = 1.0);
153 
157  virtual void Out (const grid<Position>& g, double dF = 1.0);
158 
162  virtual void Out (const grid<Velocity>& g, double dF = 1.0);
163  protected:
165  std::string ParseFileName (std::string strFile) const;
166  // Serialization
167  protected:
168  virtual PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm = NULL);
169 };
170 
176 class Diagnostic : public Task {
177  private:
179  std::string strDiagPort;
180  protected:
183  DiagPort* DP;
184  public:
186  Diagnostic () : DP(NULL), Sim(NULL) {}
188  virtual ~Diagnostic () {}
190  virtual std::string GetClassName () const { return ID_DIAGNOSTIC; }
191 
196  virtual void Init ();
197  protected:
198  virtual PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm = NULL);
199 };
200 
206 class Trajectory : public Diagnostic {
207  protected:
212  public:
214  Trajectory () : pS(NULL) {};
216  virtual ~Trajectory () {};
217 
222  virtual void Init ();
223 
228  virtual bool Execute ();
229  protected:
230  virtual PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm = NULL);
231 };
232 
233 // Diagnostic to write out the complete phase space of a Species
234 class PhaseSpace : public Diagnostic {
235  protected:
238  public:
240  PhaseSpace () : pS(NULL) {};
242  virtual ~PhaseSpace () {};
243 
248  virtual void Init ();
249 
255  virtual bool Execute ();
256 };
257 
263 template<class TYPE>
264 class DiagValue : public Diagnostic {
265  private:
267  int Mean, F;
269  TYPE Val;
271  TYPE* pObj;
272  protected:
274  int LastOne;
275  private:
277  DiagValue();
278  public:
280  DiagValue (TYPE* pobj);
282  virtual ~DiagValue ();
283 
289  virtual bool Execute ();
290  protected:
291  virtual PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm = NULL);
292 };
293 
300 template<class TYPE>
301 class DiagGrid : public Diagnostic {
302  private:
304  grid<TYPE> G;
306  grid<TYPE>* pG;
307  protected:
309  int LastOne;
311  int Mean;
312  int F;
314  double Scale;
315  private:
317  DiagGrid ();
318  public:
320  DiagGrid (grid<TYPE>* apG);
322  virtual ~DiagGrid ();
324  virtual void Init ();
326  virtual bool Execute ();
327  protected:
328  virtual PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm = NULL);
329 };
330 
331 #ifndef ONE_DIMENSIONAL
332 
339 template<class TYPE>
340 class DiagGridLine : public Diagnostic {
341  protected:
343  int line,dir;
346  private:
348  DiagGridLine ();
349  public:
351  DiagGridLine (grid<TYPE>* apG);
353  virtual ~DiagGridLine ();
355  virtual void Init ();
357  virtual bool Execute ();
358  protected:
359  virtual PARAMETERMAP* MakeParamMap (PARAMETERMAP* pm = NULL);
360 };
361 #endif
362 template<class TYPE>
363 DiagValue<TYPE>::DiagValue (TYPE* pobj) : pObj(pobj) {
364  F = 0;
365  Val = 0;
366  LastOne = 0;
367 }
368 template<class TYPE>
370 template<class TYPE>
372  if (nEnd<0) return true;
373  int nCycle = pProcess->GetCycle();
374  // Accumulate average
375  if (nCycle>LastOne+nStep-Mean) {
376  F++;
377  Val += (*pObj);
378  }
379  if (!DoNow()) return false;
380  DP->BeginStep(GID_VALUE, strName);
381  DP->Out( Val/double(F) );
382  DP->EndStep();
383  // reset values for next calculation of average
384  F = 0;
385  Val = 0;
386  LastOne = nCycle;
387  return false;
388 };
389 
390 template<class TYPE>
391 PARAMETERMAP* DiagValue<TYPE>::MakeParamMap (PARAMETERMAP* pm) {
392  pm = Diagnostic::MakeParamMap(pm);
393  (*pm)["mean"] = WParameter(new ParameterValue<int>(&Mean, 1));
394  return pm;
395 };
396 //--diagnostic.t-------------------------------------------------------------------------------------------------------
397 template<class TYPE>
399 template<class TYPE>
401 template<class TYPE>
404  GridPosition Nx = pG->Size();
405  G.Resize(Nx);
406  G = 0.0;
407  F = 0;
408  LastOne = nStart;
409 };
410 template<class TYPE>
412  if (nEnd < 0) return true;
413  int nCycle = pProcess->GetCycle();
414  if (nCycle>LastOne+nStep-Mean) {
415  F++;
416  // Accumulate values
417  G += *pG;
418  }
419  if (!DoNow()) return false;
420  DP->BeginStep(GID_1DGRID, strName);
421  DP->Out(G, 1 / (F*Scale));
422  DP->EndStep();
423  // Reset averaging grid and count
424  G = 0.0;
425  F = 0;
426  LastOne = nCycle;
427  return false;
428 };
429 template<class TYPE>
430 //---------------------------------------------------------------------------------------------------------------------
431 PARAMETERMAP* DiagGrid<TYPE>::MakeParamMap(PARAMETERMAP* pm) {
432  pm = Diagnostic::MakeParamMap(pm);
433  (*pm)["mean"] = WParameter(new ParameterValue<int>(&Mean, 1));
434  (*pm)["scale"] = WParameter(new ParameterValue<double>(&Scale, 1.0));
435  return pm;
436 };
437 //---------------------------------------------------------------------------------------------------------------------
438 // DiagGridLine
439 #ifndef ONE_DIMENSIONAL
440 template<class TYPE>
442 template<class TYPE>
444 template<class TYPE>
447  // error if the direction is not within the dimensional range
448  if ((dir<0) || (dir>=Dimension)) {
449  std::cerr << "Invalid direction " << dir << " in " << GetName() << std::endl;
450  dir = 0;
451  }
452 };
453 template<class TYPE>
455  if (nEnd < 0) return true;
456  int nCycle = pProcess->GetCycle();
457  if (!DoNow()) return false;
458  DP->BeginStep(GID_1DGRID, strName);
459  // set all components to line
460  GridPosition i =line;
461  GridPosition NX = pG->Size();
462  // and iterate through the component specified by direction
463  for (i[dir]=0; i[dir]<=NX[dir]; i[dir]++) DP->Out((*pG)[i]);
464  DP->EndStep();
465  return false;
466 }
467 template<class TYPE>
468 PARAMETERMAP* DiagGridLine<TYPE>::MakeParamMap (PARAMETERMAP* pm) {
469  pm = Diagnostic::MakeParamMap(pm);
470  (*pm)["line"] = WParameter(new ParameterValue<int>(&line, 1));
471  (*pm)["direction"] = WParameter(new ParameterValue<int>(&dir, 0));
472  return pm;
473 }
474 #endif
475 #endif // DIAGNOSTIC_H
476 
477 
478 
479 
480