PlasCom2  1.0
XPACC Multi-physics simluation application
PrimitiveTypes.H
Go to the documentation of this file.
1 #ifndef _PRIMITIVETYPES_H_
7 #define _PRIMITIVETYPES_H_
8 #include <vector>
9 #include <list>
10 #include <map>
11 #include <cassert>
12 #include <sstream>
13 
14 namespace ix {
15 
17  namespace primitive {
18 
22  template<typename IndexType,typename ValType>
23  class IndexedVectorObj : public std::vector<std::pair<IndexType,ValType> >
24  {};
25 
29  template<typename DataType>
30  class DummyStepper {
31  private:
32  DataType _l;
33  DataType _cur;
34  DataType _interval;
35  size_t _N;
36  public:
37  virtual ~DummyStepper(){};
38  DummyStepper() : _l(static_cast<DataType>(0)),
39  _cur(static_cast<DataType>(0)),
40  _interval(static_cast<DataType>(1)),
41  _N(0)
42  {};
43  DummyStepper(const DataType &lval) : _l(lval),
44  _cur(lval),
45  _interval(static_cast<DataType>(1)),
46  _N(0)
47  {};
48  DummyStepper(const DataType &lval,const DataType &inint) :
49  _l(lval),
50  _cur(lval),
51  _interval(inint),
52  _N(0)
53  {};
54  DataType SetInterval(const DataType &inint)
55  {
56  _interval = inint;
57  return(_cur);
58  };
59  DataType Interval() const { return(_interval); };
60  size_t Reset(const DataType &lval)
61  {
62  _l = lval;
63  _cur=lval;
64  _N = 0;
65  return(_N);
66  };
67  size_t Reset()
68  {
69  _cur = _l;
70  _N = 0;
71  return(_N);
72  };
73  size_t GetStep(){return(_N);};
74  DataType Value() const { return(_cur); };
75  virtual DataType operator++()
76  {
77  _N++;
78  return(_cur+=_interval);
79  };
80  virtual DataType operator++(int)
81  {
82  DataType rval = _cur;
83  _cur+=_interval;
84  _N++;
85  return(rval);
86  };
87  virtual DataType operator--()
88  {
89  _N--;
90  return(_cur-=_interval);
91  };
92  virtual DataType operator--(int)
93  {
94  DataType rval = _cur;
95  _cur-=_interval;
96  _N--;
97  return(rval);
98  };
99  };
100 
101 
105  template<typename DataType>
106  class Stepper {
107  private:
108  bool _good;
109  bool _done;
110  std::pair<DataType,DataType> _limits;
111  std::vector<DataType> _values;
112  typename std::vector<DataType>::iterator _curstep;
113  public:
114  virtual ~Stepper(){};
115  Stepper() : _good(false), _done(false) {};
116  Stepper(const DataType &l,const DataType &u,size_t N)
117  {
118  Init(l,u,N);
119  }
120  Stepper(const DataType &l,const DataType &u,const DataType &interval)
121  {
122  Init(l,u,interval);
123  };
124  virtual DataType Init(const DataType &l,const DataType &u,size_t N)
125  {
126  _limits.first = l;
127  _limits.second = u;
128  _values.resize(N);
129  DataType interval = (u - l)/static_cast<DataType>(N);
130  for(size_t i = 0;i < (N-1);i++)
131  _values[i] = l + i*interval;
132  _values[N-1] = u;
133  _curstep = _values.begin();
134  _good = true;
135  _done = false;
136  return(*_curstep);
137  };
138  virtual DataType Init(const DataType &l,const DataType &u,const DataType &interval)
139  {
140  _limits.first = l;
141  _limits.second = u;
142  size_t N = static_cast<size_t>((u - l)/interval);
143  for(size_t i = 0;i < (N-1);i++)
144  _values[i] = l + i*interval;
145  _values[N-1] = u;
146  _curstep = _values.begin();
147  _good = true;
148  _done = false;
149  return(*_curstep);
150  };
151  virtual size_t GetStep() const { return(_curstep-_values.begin()+1); };
152  virtual DataType GetNext() { return (*++_curstep);};
153  virtual DataType Value() const { return (*_curstep);};
154  virtual DataType Value(size_t n) const
155  {
156  assert(n <= _values.size());
157  return (_values[n-1]);
158  };
159  virtual DataType Restart()
160  {
161  _curstep = _values.begin();
162  return(*_curstep);
163  };
164  virtual DataType Refine(size_t N){return Value();};
165  virtual DataType Reset(size_t N) {return(Init(_limits.first,_limits.second,N));};
166  virtual void Finish()
167  {
168  _done = true;
169  _curstep = _values.end();
170  };
171  virtual DataType operator++()
172  {
173  return(*++_curstep);
174  };
175  virtual DataType operator++(int) {
176  return(*(_curstep++));};
177  virtual DataType operator--() { return(*--_curstep);};
178  virtual DataType operator--(int) { return(*(_curstep--));};
179  virtual bool Done() const {
180  if(_curstep == _values.end())
181  return(true);
182  return (_done);
183  };
184  virtual bool Good() const { return (_good); };
185  virtual bool Bad() const { return (!_good); };
186  virtual void SetBad() { _good = false; };
187  virtual const std::vector<DataType> &Values() { return(_values); };
188  };
189 
193  template<typename K,typename V>
194  class KeyValuePairObj : public std::pair<K,V>
195  {
196  public:
197  KeyValuePairObj(const std::pair<K,V> &p){
198  this->first = p.first;
199  this->second = p.second;
200  };
201  KeyValuePairObj(const K &k,const V &v){
202  this->first = k;
203  this->second = v;
204  };
206  K Key() const{ return this->first; };
207  V Value() const{ return this->second; };
208  K &Key() { return this->first; };
209  V &Value() { return this->second; };
210  K &Key(const K &k) { this->first = k; return(this->first); };
211  V &Value(const V &v) { this->second = v; return(this->second); };
212  // virtual std::ostream &Dump(std::ostream &Ostr){
213  // Ostr << Key() << ":" << Value();
214  // return(Ostr);
215  // };
216  };
217 
221  template<typename DataType>
222  class Vector {
223  private:
224  bool _mydata;
225  size_t _size;
226  protected:
227  DataType *D;
228  public:
229  Vector(size_t size = 0)
230  : _size(size)
231  {
232  _create();
233  };
234  Vector(const Vector &p1,const Vector &p2)
235  {
236  assert(p1._size == p2._size);
237  _size = p1._size;
238  _create();
239  Copy(p2-p1);
240  };
241  Vector(DataType *a,size_t size=0)
242  : _size(size)
243  {
244  _mydata = false;
245  D = a;
246  };
248  {
249  _size = v._size;
250  _create();
251  Copy(v);
252  };
254  {
255  _mydata = false;
256  _size = v._size;
257  D = v.D;
258  };
259  Vector(std::vector<DataType> &v)
260  {
261  _mydata = false;
262  _size = v.size();
263  D = &v[0];
264  };
265  Vector(const std::vector<DataType> &v)
266  {
267  _size = v.size();
268  _create();
269  size_t i = 0;
270  typename std::vector<DataType>::const_iterator vi = v.begin();
271  while(vi != v.end())
272  D[i++] = *vi++;
273  };
275  {
276  _destroy();
277  };
279  {
280  for(size_t i = 0;i < _size;i++)
281  D[i] = v[i];
282  return(*this);
283  };
284  // C3Vector &Init(const double *a)
285  // {
286  // V[0] = a[0];
287  // V[1] = a[1];
288  // V[2] = a[2];
289  // return(*this);
290  // };
291  // C3Vector &Init(const C3Vector &v)
292  // {
293  // V[0] = v[0];
294  // V[1] = v[1];
295  // V[2] = v[2];
296  // return(*this);
297  // };
298  // C3Vector &Init(double ix,double iy,double iz)
299  // {
300  // V[0] = ix;
301  // V[1] = iy;
302  // V[2] = iz;
303  // return(*this);
304  // };
305  // C3Vector &Init(const C3Vector &p1,const C3Vector &p2)
306  // {
307  // Copy(p2 - p1);
308  // return(*this);
309  // };
310  // C3Vector &Init()
311  // {
312  // V[0] = V[1] = V[2] = 0.0;
313  // return(*this);
314  // };
315  // C3Vector &Clear()
316  // {
317  // V[0] = V[1] = V[2] = 0.0;
318  // return(*this);
319  // };
320  // double Norm() const
321  // {
322  // return(sqrt((V[0] * V[0]) + (V[1] * V[1]) + (V[2] * V[2])));
323  // };
324  // double Mag() const
325  // {
326  // return (Norm());
327  // };
328  // double Mag2() const
329  // {
330  // return ((V[0]*V[0])+(V[1]*V[1])+(V[2]*V[2]));
331  // };
332  // C3Vector &Normalize()
333  // {
334  // double n = Norm();
335  // V[0] /= n;
336  // V[1] /= n;
337  // V[2] /= n;
338  // return(*this);
339  // };
340  // C3Vector Unit() const
341  // {
342  // C3Vector v(*this);
343  // return(v.Normalize());
344  // };
345  // ///
346  // /// \brief Dot Product
347  // ///
348  // double operator*(const C3Vector &v2) const
349  // {
350  // return((V[0] * v2.V[0]) +
351  // (V[1] * v2.V[1]) +
352  // (V[2] * v2.V[2]));
353  // };
354  // ///
355  // /// \brief Scaling
356  // ///
357  // C3Vector operator*(double num) const
358  // {
359  // C3Vector rv(num*V[0],num*V[1],num*V[2]);
360  // return(rv);
361  // };
362  // C3Vector &operator*=(double num)
363  // {
364  // V[0] *= num;
365  // V[1] *= num;
366  // V[2] *= num;
367  // return(*this);
368  // };
369  // ///
370  // /// \brief Cross Product
371  // ///
372  // C3Vector operator%(const C3Vector &v2) const
373  // {
374  // C3Vector v;
375  // v.V[0] = ((v2.V[2] * V[1]) - (v2.V[1] * V[2]));
376  // v.V[1] = ((v2.V[0] * V[2]) - (v2.V[2] * V[0]));
377  // v.V[2] = ((v2.V[1] * V[0]) - (v2.V[0] * V[1]));
378  // return(v);
379  // };
380  // C3Vector &operator=(const C3Vector &v2)
381  // {
382  // return(Copy(v2));
383  // };
384  // C3Vector &operator%=(const C3Vector &v2)
385  // {
386  // double t0 = V[0];
387  // double t1 = V[1];
388  // double t2 = V[2];
389  // V[0] = ((v2.V[2] * t1) - (v2.V[1] * t2));
390  // V[1] = ((v2.V[0] * t2) - (v2.V[2] * t0));
391  // V[2] = ((v2.V[1] * t0) - (v2.V[0] * t1));
392  // return(*this);
393  // };
394  // C3Vector operator+(const C3Vector &v2) const
395  // {
396  // C3Vector v(V[0] + v2.V[0], V[1] + v2.V[1], V[2] + v2.V[2]);
397  // return(v);
398  // };
399  // C3Vector operator-(const C3Vector &v2) const
400  // {
401  // return((*this) + (-1.0 * v2));
402  // };
403  // C3Vector &operator+=(const C3Vector &v2)
404  // {
405  // V[0] += v2.V[0];
406  // V[1] += v2.V[1];
407  // V[2] += v2.V[2];
408  // return(*this);
409  // };
410  // C3Vector &operator-=(const C3Vector &v2)
411  // {
412  // V[0] -= v2.V[0];
413  // V[1] -= v2.V[1];
414  // V[2] -= v2.V[2];
415  // return(*this);
416  // };
417  // double &x()
418  // {
419  // return(V[0]);
420  // };
421  // double x() const
422  // {
423  // return(V[0]);
424  // };
425  // C3Vector &x(double i)
426  // {
427  // V[0] = i;
428  // return(*this);
429  // };
430  // double &y()
431  // {
432  // return(V[1]);
433  // };
434  // double y() const
435  // {
436  // return(V[1]);
437  // };
438  // C3Vector &y(double i)
439  // {
440  // V[1] = i;
441  // return(*this);
442  // };
443  // double &z()
444  // {
445  // return(V[2]);
446  // };
447  // double z() const
448  // {
449  // return(V[2]);
450  // };
451  // C3Vector &z(double i)
452  // {
453  // V[2] = i;
454  // return(*this);
455  // };
456  // const double &operator[](unsigned int i) const
457  // {
458  // assert(i>0 && i<4);
459  // return(V[i-1]);
460  // };
461  // double &operator[](unsigned int i)
462  // {
463  // assert(i>0 && i<4);
464  // return(V[i-1]);
465  // };
466  // bool operator==(const C3Vector &v) const
467  // {
468  // return( (fabs(V[0] - v.V[0]) < TOL) &&
469  // (fabs(V[1] - v.V[1]) < TOL) &&
470  // (fabs(V[2] - v.V[2]) < TOL) );
471  // };
472  // bool operator<(const C3Vector &v) const
473  // {
474  // return (Mag2() < v.Mag2());
475  // };
476  // bool operator>(const C3Vector &v) const
477  // {
478  // return (Mag2() > v.Mag2());
479  // };
480  // bool operator<=(const C3Vector &v) const
481  // {
482  // return ( (*this < v) ||
483  // (*this == v));
484  // };
485  // bool operator>=(const C3Vector &v) const
486  // {
487  // return ( (*this > v) ||
488  // (*this == v) );
489  // };
490  // void DestroyData() { _destroy(); };
491  // void SetData(double *d) {
492  // V = d;
493  // _mydata = false;
494  // };
495  private:
496  void _create()
497  {
498  if(_size > 0){
499  D = new DataType [_size];
500  _mydata = true;
501  }
502  else{
503  _size = 0;
504  _mydata = false;
505  D = NULL;
506  }
507  };
508  void _destroy()
509  {
510  if(_mydata){
511  delete [] D;
512  _mydata = false;
513  D = NULL;
514  }
515  };
516  };
517 
518  typedef char byte;
519  typedef unsigned char ubyte;
520 
521 
522  typedef unsigned int IndexType;
523  typedef std::vector<std::list<IndexType> > IndexVecList;
524  typedef std::list<IndexType> IndexList;
525  typedef std::vector<IndexType> IndexVec;
526  template<typename DataType,typename InIndexType = IndexType>
528  public:
529  typedef std::vector<std::vector<DataType> > VecVec;
530  typedef std::vector<std::map<DataType,InIndexType> > VecMap;
531  typedef std::vector<std::list<DataType> > VecList;
532  };
533  //
534  // No such thing as typedef templates - but there
535  // should be!
536  //
537  // template<typename DataType>
538  // typedef std::vector<std::map<DataType> > VecMap;
539  // typedef std::vector<std::vector<DataType> > MultiVec;
540  };
541 
543  namespace meta {
544 
545  class DataObject : public std::map<std::string,std::string>
546  {
547  // friend std::ostream &operator<<(std::ostream &oSt,
548  // const meta::DataObject &md);
549  // friend std::istream &operator>>(std::istream &iSt,
550  // meta::DataObject &pv);
551  private:
553  bool _own;
554  public:
555  DataObject() : std::map<std::string,std::string>(), _mymd(NULL), _own(false)
556  {};
558  if(_mymd && _own)
559  delete _mymd;
560  };
561  meta::DataObject *InternalMetaData() { return (_mymd); };
562  const meta::DataObject *InternalMetaData() const { return ((const meta::DataObject *)_mymd); };
564  if(_mymd && _own)
565  delete _mymd;
566  if(indata){
567  _mymd = indata;
568  _own = false;
569  }
570  else {
571  _mymd = new meta::DataObject;
572  _own = true;
573  }
574  return(_mymd);
575  };
576 
577  std::string GetValue(const std::string &key) const
578  {
579  std::string retval;
580  meta::DataObject::const_iterator vi = this->find(key);
581  if(vi != this->end())
582  retval = vi->second;
583  return(retval);
584  };
585 
586  template<typename T>
587  T GetValue(const std::string &key) const
588  {
589  T retval;
590  meta::DataObject::const_iterator vi = this->find(key);
591  if(vi != this->end()){
592  std::istringstream Istr(vi->second);
593  Istr >> retval;
594  }
595  return(retval);
596  };
597 
598  template<typename T>
599  T ReadValue(const std::string &key) const
600  {
601  T retval;
602  meta::DataObject::const_iterator vi = this->find(key);
603  if(vi != this->end()){
604  std::istringstream Istr(vi->second);
605  Istr.read(reinterpret_cast<char *>(&retval),sizeof(T));
606  }
607  return(retval);
608  };
609 
610  template<typename T>
611  std::vector<T> GetValueVector(const std::string &key) const
612  {
613  std::vector<T> retval;
614  meta::DataObject::const_iterator vi = this->find(key);
615  if(vi != this->end()){
616  std::istringstream Istr(vi->second);
617  T tmpval;
618  while(Istr >> tmpval)
619  retval.push_back(tmpval);
620  }
621  return(retval);
622  };
623 
624  template<typename T>
625  std::vector<T> ReadValueVector(const std::string &key) const
626  {
627  std::vector<T> retval;
628  meta::DataObject::const_iterator vi = this->find(key);
629  if(vi != this->end()){
630  std::istringstream Istr(vi->second);
631  T tmpval;
632  while(Istr.read(reinterpret_cast<char *>(&tmpval),sizeof(T)))
633  retval.push_back(tmpval);
634  }
635  return(retval);
636  };
637  // int ReadFromStream(std::istream &Is);
638  // std::string Param(const std::string &Key) const;
639  };
640  // std::ostream &operator<<(std::ostream &oSt,const util::Parameters &pv);
641  // std::istream &operator>>(std::istream &iSt,util::Parameters &pv);
642  };
643 };
644 #endif
virtual DataType operator--(int)
Type agnostic stepper.
virtual DataType Value(size_t n) const
meta::DataObject * InternalMetaData()
std::vector< std::map< DataType, InIndexType > > VecMap
virtual bool Bad() const
virtual DataType operator--()
const meta::DataObject * InternalMetaData() const
KeyValuePairObj(const std::pair< K, V > &p)
virtual DataType Refine(size_t N)
std::vector< DataType > _values
Vector & Copy(const Vector< DataType > &v)
virtual DataType operator++(int)
virtual DataType Value() const
DummyStepper(const DataType &lval)
STL namespace.
T ReadValue(const std::string &key) const
Defines MPI-specific parallel global and program classes.
meta::DataObject * SetInternalMetaData(meta::DataObject *indata=NULL)
Stepper(const DataType &l, const DataType &u, const DataType &interval)
DummyStepper(const DataType &lval, const DataType &inint)
KeyValuePairObj(const K &k, const V &v)
std::pair< DataType, DataType > _limits
virtual const std::vector< DataType > & Values()
virtual DataType operator--(int)
virtual size_t GetStep() const
virtual DataType operator++()
Vector(const Vector< DataType > &v)
std::vector< T > ReadValueVector(const std::string &key) const
std::vector< std::vector< DataType > > VecVec
virtual bool Done() const
virtual DataType operator++(int)
std::vector< std::list< IndexType > > IndexVecList
std::vector< T > GetValueVector(const std::string &key) const
unsigned int IndexType
virtual DataType operator++()
Type agnostic dummy stepper.
virtual DataType Init(const DataType &l, const DataType &u, const DataType &interval)
std::vector< DataType >::iterator _curstep
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double * a
meta::DataObject * _mymd
Generic vector.
std::vector< IndexType > IndexVec
virtual DataType Init(const DataType &l, const DataType &u, size_t N)
virtual DataType Reset(size_t N)
void const size_t const size_t const size_t const int const double * V
Vector(std::vector< DataType > &v)
Stepper(const DataType &l, const DataType &u, size_t N)
virtual bool Good() const
virtual DataType operator--()
Vector(const std::vector< DataType > &v)
unsigned char ubyte
std::string GetValue(const std::string &key) const
virtual DataType GetNext()
DataType SetInterval(const DataType &inint)
std::vector< std::list< DataType > > VecList
T GetValue(const std::string &key) const
Simple key-value pair.
Vector(Vector< DataType > &v)
Vector(const Vector &p1, const Vector &p2)
Vector(DataType *a, size_t size=0)
std::list< IndexType > IndexList
Vector(size_t size=0)
virtual DataType Restart()
size_t Reset(const DataType &lval)