PlasCom2  1.0
XPACC Multi-physics simluation application
PCPPFieldData.H
Go to the documentation of this file.
1 #ifndef __PCPP_FIELD_DATA_H__
2 #define __PCPP_FIELD_DATA_H__
3 
4 #include <ostream>
5 #include <istream>
6 #include <vector>
7 #include <string>
8 #include <sstream>
9 
10 #include "PCPPTypes.H"
11 
12 namespace pcpp {
13 
14  namespace field {
15 
16  // typedef pcpp::ConfigType ConfigurationType;
17 
18  class databuffer {
19 
20  public:
21 
22  friend std::ostream &operator<<(std::ostream &Ostr,const databuffer &buf);
23  friend std::istream &operator>>(std::istream &Istr,databuffer &buf);
24 
25  public:
26 
28  size_t DataSize[5];
29 
30  private:
31 
32  char *_data_ptr;
33  size_t _item_size;
34  bool _my_data;
36  // int _mysize;
37  public:
38 
39  databuffer() : _data_ptr(NULL), _item_size(1),
40  _my_data(false), _number_of_items(0) //, _mysize(0)
41  {
42  DataSize[0] = DataSize[1] = 1;
43  DataSize[2] = DataSize[3] = 4;
44  DataSize[4] = 8;
45  };
46 
47  databuffer(const databuffer &inBuffer) : _my_data(false)
48  {
49  Copy(inBuffer);
50  };
51 
52  databuffer(void *buf,size_t number,size_t type) : _data_ptr(reinterpret_cast<char *>(buf)),
53  _item_size(type), _my_data(false),
54  _number_of_items(number)
55  {//_mysize = _number_of_items * DataSize[_item_size];
56  DataSize[0] = DataSize[1] = 1;
57  DataSize[2] = DataSize[3] = 4;
58  DataSize[4] = 8;
59  };
60 
61  databuffer(size_t number,size_t type) : _data_ptr(NULL), _item_size(type),_my_data(false),
62  _number_of_items(number) // , _mysize(0)
63  {
64  DataSize[0] = DataSize[1] = 1;
65  DataSize[2] = DataSize[3] = 4;
66  DataSize[4] = 8;
67  };
68 
69  ~databuffer() { Destroy(); };
70 
71  bool Empty()
72  {
73  return(_number_of_items == 0);
74  };
75 
76  databuffer &operator=(const databuffer &inBuffer)
77  {
78  if(this != &inBuffer){
79  Copy(inBuffer);
80  }
81  return(*this);
82  };
83 
84  void Copy(const databuffer &inBuffer)
85  {
86  Destroy();
87  _item_size = inBuffer._item_size;
88  _my_data = true;
89  _number_of_items = inBuffer._number_of_items;
90  size_t bufsize = _number_of_items*_item_size;
91  _data_ptr = new char [bufsize];
92  std::memcpy(_data_ptr,inBuffer._data_ptr,bufsize);
93  };
94 
95  void Destroy()
96  {
97  if(_my_data && _data_ptr){
98  if((_item_size > 1) || (_number_of_items > 1))
99  delete [] _data_ptr;
100  else
101  delete _data_ptr;
102  }
103  _item_size = 1;
104  _data_ptr = NULL;
105  _number_of_items = 0;
106  _my_data = false;
107  // _mysize = 0;
108  };
109 
110  template<class T>
111  T *Data() { return(reinterpret_cast<T *>(_data_ptr));};
112 
113  template<class T>
114  const T *Data() const { return(reinterpret_cast<const T *>(_data_ptr)); };
115 
116  inline size_t ItemSize() const { return(_item_size); };
117 
118  inline size_t NItems() const { return(_number_of_items); };
119 
120  inline size_t &ItemSize() { return(_item_size); };
121 
122  inline size_t &NItems() { return(_number_of_items); };
123 
124  void CopyData(const void *buf, size_t start = 0,size_t nitems = 0)
125  {
126  if(!buf)
127  return;
128  if(!_data_ptr)
129  return;
130  if(nitems == 0)
131  nitems = _number_of_items;
132  size_t numData = nitems*_item_size;
133  size_t realStart = start*_item_size;
134  if(numData <= 0)
135  return;
136  if((realStart + numData) > _number_of_items*_item_size)
137  return;
138  std::memcpy(&(_data_ptr[realStart]),buf,numData);
139  return;
140  };
141 
142  void Set(void *buf = NULL,size_t nitems = 0,size_t itemsize = 0)
143  {
144  if(nitems <= 0)
145  nitems = _number_of_items;
146  if(itemsize <= 0)
147  itemsize = _item_size;
148  Destroy();
149  _my_data = false;
150  _data_ptr = reinterpret_cast<char *>(buf);
151  _number_of_items = nitems;
152  _item_size = itemsize;
153  // _mysize = _number_of_items * DataSize[_item_size];
154  };
155 
156  int Allocate()
157  {
158  Destroy();
159  size_t bufsize = _number_of_items * _item_size;
160  if(bufsize > 0)
161  _data_ptr = new char [bufsize];
162  _my_data = true;
163  return(bufsize);
164  };
165 
166  int Allocate(size_t nitems)
167  {
168  Destroy();
169  _number_of_items = nitems;
170  size_t bufsize = _number_of_items * _item_size;
171  if(bufsize > 0)
172  _data_ptr = new char [bufsize];
173  _my_data = true;
174  return(bufsize);
175  };
176 
177  int Allocate(size_t nitems,size_t isize)
178  {
179  Destroy();
180  _number_of_items = nitems;
181  _item_size = isize;
182  size_t bufsize = _number_of_items * _item_size;
183  if(bufsize > 0)
184  _data_ptr = new char [bufsize];
185  _my_data = true;
186  return(bufsize);
187  };
188 
189  size_t size() const
190  {
191  return(_data_ptr ? (_number_of_items * _item_size) : 0);
192  };
193 
194  size_t resize(size_t newsize)
195  {
196  size_t save_item_size = _item_size;
197  size_t save_nitems = _number_of_items;
198  Destroy();
199  if(newsize > 0){
200  if((newsize%save_item_size) == 0){
201  _item_size = save_item_size;
202  _number_of_items = (newsize/_item_size);
203  }
204  _data_ptr = new char [newsize];
205  _my_data = true;
206  }
207  return(_number_of_items * _item_size);
208  };
209 
210  const char *data() const { return(_data_ptr); };
211  char *data() { return(_data_ptr); };
212 
213  template<class T>
214  std::ostream &OutputToStream(std::ostream &Ostr) const
215  {
216  char delimiter;
217  std::ostringstream OutStr;
218  if(sizeof(T) != 1)
219  delimiter = ' ';
220  T *dataptr = (T *)_data_ptr;
221  for(size_t i = 0;i < _number_of_items;i++){
222  OutStr << *dataptr++;
223  if(i != (_number_of_items - 1))
224  OutStr << delimiter;
225  }
226  OutStr << std::endl;
227  Ostr << OutStr.str();
228  return(Ostr);
229  };
230 
231  template<class T>
232  std::istream &ReadFromStream(std::istream &Istr)
233  {
234  T *dataptr = (T *)_data_ptr;
235  std::string line;
236  std::getline(Istr,line);
237  std::istringstream InStr(line);
238  for(size_t i = 0;i < _number_of_items;i++)
239  InStr >> *dataptr++;
240  return(Istr);
241  };
242  };
243 
244 
245 
246  class metadata {
247 
248  public:
249 
250  friend std::istream &operator>>(std::istream &IStr,metadata &md);
251  friend std::ostream &operator<<(std::ostream &OStr,const metadata &md);
252 
253  public:
254 
255  std::string name;
256  std::string unit;
257  char loc;
258  unsigned int ncomp;
259  unsigned int dsize;
260 
261  bool operator==(const metadata &inMeta) const
262  {
263  return((name == inMeta.name) && (unit == inMeta.unit) &&
264  (loc == inMeta.loc) && (ncomp == inMeta.ncomp) &&
265  (dsize == inMeta.dsize));
266  }
267 
268  bool operator!=(const metadata &inMeta) const
269  {
270  return(!(operator==(inMeta)));
271  }
272 
273  };
274 
275  class metadataset : public std::vector<metadata>
276  {
277  public:
278 
279  friend std::istream &operator>>(std::istream &IStr,metadataset &md);
280  friend std::ostream &operator<<(std::ostream &OStr,const metadataset &md);
281 
282  public:
283 
284  metadataset &operator=(const metadataset &inMetaData)
285  {
286  Copy(inMetaData);
287  return(*this);
288  };
289 
290  void Append(const metadataset &inMetaData)
291  {
292  std::vector<metadata>::const_iterator imdIt = inMetaData.begin();
293  while(imdIt != inMetaData.end())
294  this->push_back(*imdIt++);
295  return;
296  };
297 
298  void Copy(const metadataset &inMetaData)
299  {
300  this->resize(0);
301  std::vector<metadata>::const_iterator imdIt = inMetaData.begin();
302  while(imdIt != inMetaData.end())
303  this->push_back(*imdIt++);
304  return;
305  };
306 
307  void ReadFromStream(std::istream &InStr)
308  {
309  int num_vars;
310  std::string line;
311  while(line.empty())
312  std::getline(InStr,line);
313  std::istringstream Istr(line);
314  Istr >> num_vars;
315  this->resize(num_vars);
316  int num = 0;
317  while(num < num_vars){
318  std::getline(InStr,line);
319  std::istringstream IStr(line);
320  IStr >> (*this)[num++];
321  }
322  };
323 
324  void WriteToStream(std::ostream &OutStr)
325  {
326  int num_vars = this->size();
327  int num = 0;
328  OutStr << num_vars << std::endl;
329  while(num < num_vars)
330  OutStr << (*this)[num++] << std::endl;
331  };
332 
333  void AddField(const std::string &name,char loc,unsigned int ncomp,
334  unsigned int dsize,const std::string &unit)
335  {
336  metadata md;
337  md.name = name;
338  md.unit = unit;
339  md.loc = loc;
340  md.ncomp = ncomp;
341  md.dsize = dsize;
342  this->push_back(md);
343  };
344 
345  void AddField(const std::string &name,metadata &inMeta)
346  {
347  metadata md(inMeta);
348  md.name = name;
349  this->push_back(md);
350  };
351 
352  std::string Report() const
353  {
354  std::ostringstream Ostr;
355  metadataset::const_iterator metaIt = this->begin();
356  while(metaIt != this->end()){
357  const metadata &rMeta(*metaIt++);
358  Ostr << "___" << std::endl;
359  Ostr << "Field Name: " << rMeta.name << std::endl
360  << "Unit: " << (rMeta.unit.empty() ? std::string("unitless") :
361  rMeta.unit) << std::endl
362  << "Components: " << rMeta.ncomp << std::endl
363  << "Location: "
364  << ((rMeta.loc == 's') ? "Simulation-global" :
365  (rMeta.loc == 'd') ? "Domain-global" :
366  (rMeta.loc == 'm' || rMeta.loc == 'm') ?
367  "Mesh/Grid-global" :
368  (rMeta.loc == 'c') ? "Grid cells" :
369  (rMeta.loc == 'n') ? "Grid nodes" :
370  "Unknown location") << std::endl
371  << "DataType: "
372  << ((rMeta.dsize == 1) ? "Byte " :
373  (rMeta.dsize == 4) ? "Integer " :
374  (rMeta.dsize == 8) ? "Real " :
375  "Invalid ") << "data" << std::endl;
376  }
377  Ostr << "___" << std::endl;
378  return(Ostr.str());
379  };
380  };
381 
382  class dataset
383  {
384 
385  public:
386 
388  typedef std::vector<DataBufferType> DataContainerType;
391 
392  protected:
393  DataContainerType data;
394  MetaDataSetType meta;
395  size_t numNodes;
396  size_t numCells;
397  std::vector<int> fieldIndices;
398  std::map<std::string,int> fieldHandles;
399  public:
400  size_t NumNodes() { return(numNodes); };
401  size_t NumCells() { return(numCells); };
402  metadataset &Meta() { return (meta); };
403  const metadataset &Meta() const { return (meta); };
404  DataContainerType &Data() { return (data); };
405  const DataContainerType &Data() const { return (data); };
406  size_t NumData() const { return(data.size()); };
407  size_t NumMeta() const { return(meta.size()); };
409  {
410  metadataset::iterator mdi = meta.begin();
411  int index = 0;
412  while(mdi != meta.end()){
413  std::string &fieldName(mdi++->name);
414  fieldHandles[fieldName] = index++;
415  }
416  return(InitializeFieldIndices());
417  // return;
418  };
419 
421  {
422  fieldIndices.resize(0);
423  fieldIndices.resize(fieldHandles.size(),-1);
424  metadataset::iterator mdi = meta.begin();
425  int index = 0;
426  while(mdi != meta.end()){
427  std::string &fieldName(mdi++->name);
428  std::map<std::string,int>::iterator fieldHandleIt =
429  fieldHandles.find(fieldName);
430  if(fieldHandleIt == fieldHandles.end())
431  return(1);
432  int fieldHandle = fieldHandleIt->second;
433  fieldIndices[fieldHandle] = index++;
434  }
435  return(0);
436  };
437 
438  int GetFieldHandle(const std::string &fieldName) const
439  {
440  std::map<std::string,int>::const_iterator fieldHandleIt =
441  fieldHandles.find(fieldName);
442  if(fieldHandleIt == fieldHandles.end())
443  return(-1);
444  return(fieldHandleIt->second);
445  };
446  int GetFieldIndexByHandle(int fieldHandle) const {
447  if(fieldHandle > fieldIndices.size())
448  return(-1);
449  return(fieldIndices[fieldHandle]);
450  };
451  void SetMetaData(const MetaDataSetType &dataDictionary)
452  {
453  Destroy();
454  meta = dataDictionary;
455  };
456  virtual void Prepare()
457  {
458  if(!meta.empty()){
459  if(data.empty()){
460  // std::cout << "Data was empty." << std::endl;
461  data.resize(meta.size());
462  return;
463  } else {
464  size_t numMeta = meta.size();
465  size_t numData = data.size();
466  if(numMeta == numData){
467  return;
468  } else if(numData > numMeta){
469  data.resize(numMeta);
470  return;
471  } else {
472  while(numMeta > numData){
473  DataBufferType newData;
474  data.push_back(newData);
475  numData++;
476  }
477  }
478  }
479  }
480  return;
481  };
482  virtual void Copy(const dataset &inData)
483  {
484  fieldHandles = inData.fieldHandles;
485  numNodes = inData.numNodes;
486  numCells = inData.numCells;
487  meta = inData.meta;
488  int numBuffers = inData.data.size();
489  data.resize(numBuffers);
490  for(int i = 0;i < numBuffers;i++)
491  data[i].Copy(inData.data[i]);
492  InitializeFieldIndices();
493  };
494 
495  virtual void Copy(const dataset &inData,const std::string &fieldNames)
496  {
497  std::istringstream nameStream(fieldNames);
498  std::string fieldName;
499  std::vector<int> copyFieldIndices;
500  while(nameStream >> fieldName){
501  int fieldIndex = inData.GetDataIndex(fieldName);
502  if(fieldIndex < 0){
503  std::cerr << "pcpp::field::dataset::Copy:ERROR! Cannot find ("
504  << fieldName << ") in input state." << std::endl;
505  return;
506  }
507  copyFieldIndices.push_back(fieldIndex);
508  }
509  Copy(inData,copyFieldIndices);
510  };
511 
512  virtual void Copy(const dataset &inData,const std::vector<int> &copyFieldIndices)
513  {
514  fieldHandles = inData.fieldHandles;
515  numNodes = inData.numNodes;
516  numCells = inData.numCells;
517  int numFields = copyFieldIndices.size();
518  meta.resize(numFields);
519  data.resize(numFields);
520  int index = 0;
521  std::vector<int>::const_iterator copyFieldIndexIt = copyFieldIndices.begin();
522  while(copyFieldIndexIt != copyFieldIndices.end()){
523  int copyFieldIndex = *copyFieldIndexIt++;
524  meta[index] = inData.meta[copyFieldIndex];
525  data[index].Copy(inData.data[copyFieldIndex]);
526  index++;
527  }
528  InitializeFieldIndices();
529  };
530  virtual void Destroy(const std::string &fieldName)
531  {
532  int fieldIndex = GetFieldIndex(fieldName);
533  if(fieldIndex >= 0){
534  data[fieldIndex].Destroy();
535  }
536  };
537  virtual void Destroy()
538  {
539  meta.resize(0);
540  data.resize(0);
541  };
542  virtual size_t ReCreate()
543  {
544  if(meta.empty())
545  return(0);
546  if(numNodes == 0 &&
547  numCells == 0)
548  return(0);
549  unsigned int numMeta = meta.size();
550  unsigned int numData = data.size();
551  if(numMeta > numData){
552  size_t all_data_size = 0;
553  databuffer mydata;
554  data.push_back(mydata);
555  databuffer &newData(data[numData]);
556  while(numMeta > numData){
557  metadata &metaData(meta[numData++]);
558  size_t nitems = ((metaData.loc == 's' || metaData.loc == 'm' ||
559  metaData.loc == 'g' || metaData.loc == 'd') ? 1 :
560  metaData.loc == 'c' ? numCells :
561  metaData.loc == 'n' ? numNodes :
562  0);
563  assert(nitems > 0);
564  size_t total_size = nitems * metaData.dsize * metaData.ncomp;
565  all_data_size += total_size;
566  // DataBufferType newData(nitems*metaData.ncomp,metaData.dsize);
567  newData.Allocate(nitems*metaData.ncomp,metaData.dsize);
568  // data.push_back(newData);
569  numData = data.size();
570  }
571  return(all_data_size);
572  } else if(numMeta < numData) {
573  return(-1);
574  }
575  return(0);
576  };
577 
578  virtual size_t Create(size_t number_of_nodes = 0,size_t number_of_cells = 0)
579  {
580  if(!((number_of_nodes == 0) && (number_of_cells == 0)) ||
581  data.empty()){
582  numNodes = number_of_nodes;
583  numCells = number_of_cells;
584  if(meta.empty())
585  return(0);
586  size_t all_data_size = 0;
587  // if(meta.empty())
588  // return(-1);
589  // assert(!meta.empty());
590 
591  data.resize(meta.size());
592  metadataset::iterator mdi = meta.begin();
593  size_t data_index = 0;
594  while(mdi != meta.end()){
595  // location can be:
596  // (s) - simulation global
597  // (d) - domain global
598  // (m)(g) - mesh/grid global
599  // (c) - mesh/grid cells
600  // (n) - mesh/grid nodes
601  size_t nitems = ((mdi->loc == 's' || mdi->loc == 'm' ||
602  mdi->loc == 'g' || mdi->loc == 'd') ? 1 :
603  mdi->loc == 'c' ? number_of_cells :
604  mdi->loc == 'n' ? number_of_nodes :
605  0);
606  if(nitems == 0){
607  std::cerr << "dataset::Create: Error, unknown location: " << mdi->loc << std::endl;
608  }
609  assert(nitems > 0);
610  // Total size will be the number of components (i.e. scalar = 1, vector = 2,3, etc) times
611  // the number of items (i.e. number of nodes, elements, etc) times the size of each item
612  size_t total_size = nitems * mdi->dsize * mdi->ncomp;
613  all_data_size += total_size;
614  data[data_index++].Allocate(nitems*mdi->ncomp,mdi->dsize);
615  // assert(data[data_index-1].NItems() == nitems*mdi->ncomp);
616  mdi++;
617  }
618  return(all_data_size);
619  } else {
620  return(ReCreate());
621  }
622  return(0);
623  };
624 
625 
626  int GetDataIndex(const std::string &name) const
627  {
628  metadataset::const_iterator mdi = meta.begin();
629  int index = 0;
630  while(mdi != meta.end()){
631  if(mdi++->name == name)
632  return(index);
633  index++;
634  }
635  return(-1);
636  };
637 
638  int GetFieldIndex(const std::string &name) const
639  {
640  return(GetDataIndex(name));
641  };
642 
643  metadata &GetFieldMetaData(const std::string &name)
644  {
645  metadataset::iterator mdi = meta.begin();
646  while(mdi != meta.end()){
647  if(mdi->name == name)
648  return(*mdi);
649  mdi++;
650  }
651  bool invalid_field_name = false;
652  assert(invalid_field_name);
653  return(*mdi); // never get here
654  };
655 
656  DataBufferType &GetFieldData(const std::string &name)
657  {
658 
659  int known_field = GetDataIndex(name);
660  assert(known_field >= 0);
661  return(data[known_field]);
662  };
663 
664  DataBufferType &Field(const std::string &name)
665  {
666 
667  int known_field = GetDataIndex(name);
668  assert(known_field >= 0);
669  return(data[known_field]);
670  };
671 
672  // Dangerous, but faster
673  DataBufferType &Field(int known_field)
674  {
675  return(data[known_field]);
676  };
677 
678  const DataBufferType &Field(int known_field) const
679  {
680  return(data[known_field]);
681  };
682 
683  DataBufferType &GetFieldDataByHandle(int fieldHandle)
684  {
685  int known_field = GetFieldIndexByHandle(fieldHandle);
686  assert(known_field >= 0);
687  return(data[known_field]);
688  };
689 
690  const DataBufferType &GetFieldDataByHandle(int fieldHandle) const
691  {
692  int known_field = GetFieldIndexByHandle(fieldHandle);
693  assert(known_field >= 0);
694  return(data[known_field]);
695  };
696 
697  const DataBufferType &GetFieldData(const std::string &name) const
698  {
699  int known_field = GetDataIndex(name);
700  assert(known_field >= 0);
701  return(data[known_field]);
702  };
703 
704  const DataBufferType &Field(const std::string &name) const
705  {
706  int known_field = GetDataIndex(name);
707  assert(known_field >= 0);
708  return(data[known_field]);
709  };
710 
711  bool FieldEmpty(int known_field = 0)
712  {
713  return(data[known_field].Empty());
714  };
715 
716  void SetFieldBuffer(const std::string &name,void *buf)
717  {
718  int known_field = GetDataIndex(name);
719  assert(known_field >= 0);
720  data[known_field].Set(buf);
721  };
722 
723  // High danger
724  void SetFieldBuffer(int known_field,void *buf)
725  {
726  data[known_field].Set(buf);
727  };
728 
729  template<class BufferDataType>
730  void SetFieldBuffer(const std::string &name,std::vector<BufferDataType> &invec)
731  {
732  size_t dsize = sizeof(BufferDataType);
733  int known_field = GetDataIndex(name);
734  assert(known_field >= 0);
735  data[known_field].Set(&invec[0],invec.size(),dsize);
736  };
737 
738  template<class BufferDataType>
739  void SetFieldBuffer(int known_field,std::vector<BufferDataType> &invec)
740  {
741  size_t dsize = sizeof(BufferDataType);
742  data[known_field].Set(&invec[0],invec.size(),dsize);
743  };
744 
745  template<class BufferDataType>
746  BufferDataType *GetFieldBuffer(const std::string &fieldName)
747  {
748  int known_field = GetDataIndex(fieldName);
749  assert(known_field >= 0);
750  return(data[known_field].Data<BufferDataType>());
751  };
752 
753  template<class BufferDataType>
754  BufferDataType *GetFieldBufferByHandle(int fieldHandle)
755  {
756  int known_field = GetFieldIndexByHandle(fieldHandle);
757  assert(known_field >= 0);
758  return(data[known_field].Data<BufferDataType>());
759  };
760 
761  template<class BufferDataType>
762  const BufferDataType *GetFieldBuffer(const std::string &fieldName) const
763  {
764  int known_field = GetDataIndex(fieldName);
765  assert(known_field >= 0);
766  return(data[known_field].Data<BufferDataType>());
767  };
768 
769  template<class BufferDataType>
770  const BufferDataType *GetFieldBufferByHandle(int fieldHandle)
771  {
772  int known_field = GetFieldIndexByHandle(fieldHandle);
773  assert(known_field >= 0);
774  return(data[known_field].Data<BufferDataType>());
775  };
776 
777  template<class BufferDataType>
778  BufferDataType *GetFieldBuffer(int known_field)
779  {
780  assert(known_field >= 0);
781  return(data[known_field].Data<BufferDataType>());
782  };
783 
784 
785  double *GetRealFieldBuffer(int known_field)
786  {
787  assert(known_field >= 0);
788  return(data[known_field].Data<double>());
789  };
790 
791  double *GetRealFieldBufferByHandle(int fieldHandle)
792  {
793  int known_field = GetFieldIndexByHandle(fieldHandle);
794  assert(known_field >= 0);
795  return(data[known_field].Data<double>());
796  };
797 
798  const double *GetRealFieldBuffer(int known_field) const
799  {
800  assert(known_field >= 0);
801  return(data[known_field].Data<double>());
802  };
803 
804  const double *GetRealFieldBufferByHandle(int fieldHandle) const
805  {
806  int known_field = GetFieldIndexByHandle(fieldHandle);
807  assert(known_field >= 0);
808  return(data[known_field].Data<double>());
809  };
810 
811 
812  const metadata &GetFieldMetaData(const std::string &name) const
813  {
814 
815  metadataset::const_iterator mdi = meta.begin();
816  while(mdi != meta.end()){
817  if(mdi->name == name)
818  return(*mdi);
819  mdi++;
820  }
821  bool invalid_field_name = false;
822  assert(invalid_field_name);
823  return(*mdi); // never get here
824  };
825 
826  const metadata &GetFieldMetaData(int fieldId) const
827  {
828  assert(fieldId < meta.size());
829  return(meta[fieldId]);
830  };
831 
832  const metadata &GetFieldMetaDataByHandle(int fieldHandle) const
833  {
834  MetaDataType returnMeta;
835  int known_field = GetFieldIndexByHandle(fieldHandle);
836  assert(known_field >= 0);
837  return(meta[known_field]);
838  };
839 
840  std::ostream &WriteFieldToStream(std::ostream &OutStream,const std::string &name) const
841  {
842  int known_field = GetDataIndex(name);
843  assert(known_field >= 0);
844  OutStream << data[known_field];
845  // to endl or not to endl?
846  // OutStream << std::endl;
847  return(OutStream);
848  };
849 
850  std::istream &ReadFieldFromStream(std::istream &InStream,const std::string &name)
851  {
852  int known_field = GetDataIndex(name);
853  assert(known_field >= 0);
854  InStream >> data[known_field];
855  return(InStream);
856  };
857 
858  template<typename ValueType>
859  void AssignFieldValue(const std::string &name,ValueType value)
860  {
861  int known_field = GetDataIndex(name);
862  assert(known_field >= 0);
863  ValueType *dataBuffer = data[known_field].Data<ValueType>();
864  int numItems = data[known_field].NItems();
865  for(int iItem = 0;iItem < numItems;iItem++)
866  dataBuffer[iItem] = value;
867 
868  }
869  void AddField(const std::string &name,char loc,unsigned int ncomp,
870  unsigned int dsize,const std::string &unit)
871  {
872  metadata md;
873  md.name = name;
874  md.unit = unit;
875  md.loc = loc;
876  md.ncomp = ncomp;
877  md.dsize = dsize;
878  meta.push_back(md);
879  };
880 
881  void AddField(const std::string &name,metadata &inMeta)
882  {
883  metadata md(inMeta);
884  md.name = name;
885  meta.push_back(md);
886  };
887 
888 
889  int RenameField(int known_field,const std::string &newFieldName)
890  {
891  assert(known_field >= 0);
892  metadata &md(meta[known_field]);
893  md.name = newFieldName;
894  return(0);
895  };
896 
897  int RenameField(const std::string &fieldName,const std::string &newFieldName)
898  {
899  int srcIndex = GetFieldIndex(fieldName);
900  if(srcIndex < 0)
901  return(1);
902  return(RenameField(srcIndex,newFieldName));
903  };
904 
905  int MakeLink(int known_field,const std::string &newFieldName)
906  {
907  assert(known_field >= 0);
908  int targetFieldId = data.size();
909  AddField(newFieldName,meta[known_field]);
910  Create();
911  DataBufferType &srcFieldBuffer(data[known_field]);
912  SetFieldBuffer(targetFieldId,srcFieldBuffer.data());
913  return(0);
914  };
915 
916  int Use(const std::string &fieldNames,dataset &inData)
917  {
918  if(numNodes > 0)
919  assert(numNodes == inData.numNodes);
920  else
921  numNodes = inData.numNodes;
922  if(numCells > 0)
923  assert(numCells == inData.numCells);
924  else
925  numCells = inData.numCells;
926  std::string fieldName;
927  std::istringstream Istr(fieldNames);
928  while(Istr >> fieldName){
929  int srcFieldIndex = inData.GetFieldIndex(fieldName);
930  assert(srcFieldIndex > 0);
931  DataBufferType &srcFieldBuffer(inData.data[srcFieldIndex]);
932  metadata &srcMeta(inData.meta[srcFieldIndex]);
933  int trgFieldIndex(GetFieldIndex(fieldName));
934  if(trgFieldIndex > 0){
935  metadata &trgMeta(meta[trgFieldIndex]);
936  assert(trgMeta == srcMeta);
937  SetFieldBuffer(trgFieldIndex,srcFieldBuffer.data());
938  } else {
939  AddField(fieldName,srcMeta);
940  DataBufferType dataBuffer(srcFieldBuffer);
941  data.push_back(dataBuffer);
948  }
949  }
950  return(0);
951  }
952 
953  metadataset Dictionary(const char loc)
954  {
955  metadataset returnMeta;
956  metadataset::iterator mdIt = meta.begin();
957  while(mdIt != meta.end()){
958  metadata &fieldMetaData(*mdIt++);
959  if(fieldMetaData.loc == loc)
960  returnMeta.push_back(fieldMetaData);
961  }
962  return(returnMeta);
963  }
964 
965  }; // class dataset
966 
967  }
968 }
969 
970  // Solution().Meta().AddField("time",'s',1,8,"s");
971  // Solution().Meta().AddField("dt",'s',1,8,"s");
972  // Solution().Meta().AddField("id",'m',1,4,"");
973  // Solution().Meta().AddField("displacement",'n',3,8,"m");
974  // Solution().Meta().AddField("pressure",'c',1,8,"Pa");
975  // Solution().Meta().AddField("temperature",'n',1,8,"K");
976  // Solution().Meta().AddField("nodeflags",'n',1,4,"");
977  // Solution().Meta().AddField("cellflags",'c',1,4,"");
978 
979  // Solution().Create();
980 
981  // Solution().SetFieldBuffer("time",time);
982  // Solution().SetFieldBuffer("dt",delta_time);
983  // Solution().SetFieldBuffer("temperature",temperatures);
984  // Solution().SetFieldBuffer("nodeflags",nodeflags);
985  // Solution().SetFieldBuffer("cellflags",cellflags);
986  // Solution().SetFieldBuffer("displacement",displacements);
987  // Solution().SetFieldBuffer("pressure",pressures);
988  // Solution().SetFieldBuffer("id",id);
989 
990 #endif
const T * Data() const
void Append(const metadataset &inMetaData)
DataContainerType & Data()
databuffer(size_t number, size_t type)
Definition: PCPPFieldData.H:61
size_t ItemSize() const
void CopyData(const void *buf, size_t start=0, size_t nitems=0)
double * GetRealFieldBuffer(int known_field)
virtual void Copy(const dataset &inData, const std::string &fieldNames)
const char * data() const
int RenameField(int known_field, const std::string &newFieldName)
metadataset & operator=(const metadataset &inMetaData)
int GetDataIndex(const std::string &name) const
databuffer(void *buf, size_t number, size_t type)
Definition: PCPPFieldData.H:52
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
int RenameField(const std::string &fieldName, const std::string &newFieldName)
BufferDataType * GetFieldBuffer(int known_field)
metadataset Dictionary(const char loc)
void AddField(const std::string &name, metadata &inMeta)
const metadata & GetFieldMetaData(const std::string &name) const
void AddField(const std::string &name, metadata &inMeta)
std::ostream & OutputToStream(std::ostream &Ostr) const
virtual void Destroy(const std::string &fieldName)
bool FieldEmpty(int known_field=0)
size_t NumData() const
int GetFieldIndexByHandle(int fieldHandle) const
virtual size_t ReCreate()
Definition: FieldData.C:3
std::vector< int > fieldIndices
std::istream & ReadFromStream(std::istream &Istr)
void SetFieldBuffer(const std::string &name, std::vector< BufferDataType > &invec)
const double * GetRealFieldBufferByHandle(int fieldHandle) const
const DataBufferType & GetFieldDataByHandle(int fieldHandle) const
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
void SetFieldBuffer(int known_field, std::vector< BufferDataType > &invec)
virtual void Prepare()
void AssignFieldValue(const std::string &name, ValueType value)
std::map< std::string, int > fieldHandles
void Copy(const metadataset &inMetaData)
databuffer(const databuffer &inBuffer)
Definition: PCPPFieldData.H:47
const DataBufferType & Field(const std::string &name) const
field::metadataset MetaDataSetType
int Use(const std::string &fieldNames, dataset &inData)
const DataBufferType & GetFieldData(const std::string &name) const
metadata & GetFieldMetaData(const std::string &name)
metadataset & Meta()
field::metadata MetaDataType
BufferDataType * GetFieldBufferByHandle(int fieldHandle)
void Copy(const databuffer &inBuffer)
Definition: PCPPFieldData.H:84
DataBufferType & Field(int known_field)
int MakeLink(int known_field, const std::string &newFieldName)
const DataContainerType & Data() const
const DataBufferType & Field(int known_field) const
databuffer DataBufferType
const metadata & GetFieldMetaDataByHandle(int fieldHandle) const
friend std::ostream & operator<<(std::ostream &Ostr, const databuffer &buf)
Definition: PCPPFieldData.C:7
virtual void Copy(const dataset &inData, const std::vector< int > &copyFieldIndices)
std::ostream & WriteFieldToStream(std::ostream &OutStream, const std::string &name) const
size_t NumMeta() const
const BufferDataType * GetFieldBufferByHandle(int fieldHandle)
BufferDataType * GetFieldBuffer(const std::string &fieldName)
const double * GetRealFieldBuffer(int known_field) const
void Set(void *buf=NULL, size_t nitems=0, size_t itemsize=0)
std::vector< DataBufferType > DataContainerType
std::string Report() const
void WriteToStream(std::ostream &OutStr)
bool operator!=(const metadata &inMeta) const
bool operator==(const metadata &inMeta) const
void SetFieldBuffer(int known_field, void *buf)
int GetFieldHandle(const std::string &fieldName) const
double * GetRealFieldBufferByHandle(int fieldHandle)
const metadata & GetFieldMetaData(int fieldId) const
DataBufferType & GetFieldData(const std::string &name)
void SetMetaData(const MetaDataSetType &dataDictionary)
MetaDataSetType meta
DataContainerType data
int GetFieldIndex(const std::string &name) const
friend std::istream & operator>>(std::istream &Istr, databuffer &buf)
Definition: PCPPFieldData.C:32
int Allocate(size_t nitems)
const BufferDataType * GetFieldBuffer(const std::string &fieldName) const
std::istream & ReadFieldFromStream(std::istream &InStream, const std::string &name)
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
int Allocate(size_t nitems, size_t isize)
void ReadFromStream(std::istream &InStr)
const metadataset & Meta() const
void SetFieldBuffer(const std::string &name, void *buf)
size_t resize(size_t newsize)
DataBufferType & GetFieldDataByHandle(int fieldHandle)
virtual void Destroy()
DataBufferType & Field(const std::string &name)
databuffer & operator=(const databuffer &inBuffer)
Definition: PCPPFieldData.H:76
virtual void Copy(const dataset &inData)