1 #ifndef __PCPP_FIELD_DATA_H__ 2 #define __PCPP_FIELD_DATA_H__ 40 _my_data(false), _number_of_items(0)
42 DataSize[0] = DataSize[1] = 1;
43 DataSize[2] = DataSize[3] = 4;
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)
56 DataSize[0] = DataSize[1] = 1;
57 DataSize[2] = DataSize[3] = 4;
61 databuffer(
size_t number,
size_t type) : _data_ptr(NULL), _item_size(type),_my_data(false),
62 _number_of_items(number)
64 DataSize[0] = DataSize[1] = 1;
65 DataSize[2] = DataSize[3] = 4;
73 return(_number_of_items == 0);
78 if(
this != &inBuffer){
91 _data_ptr =
new char [bufsize];
92 std::memcpy(_data_ptr,inBuffer.
_data_ptr,bufsize);
97 if(_my_data && _data_ptr){
98 if((_item_size > 1) || (_number_of_items > 1))
105 _number_of_items = 0;
111 T *
Data() {
return(reinterpret_cast<T *>(_data_ptr));};
114 const T *
Data()
const {
return(reinterpret_cast<const T *>(_data_ptr)); };
116 inline size_t ItemSize()
const {
return(_item_size); };
118 inline size_t NItems()
const {
return(_number_of_items); };
122 inline size_t &
NItems() {
return(_number_of_items); };
124 void CopyData(
const void *buf,
size_t start = 0,
size_t nitems = 0)
136 if((realStart + numData) > _number_of_items*_item_size)
138 std::memcpy(&(_data_ptr[realStart]),buf,numData);
142 void Set(
void *buf = NULL,
size_t nitems = 0,
size_t itemsize = 0)
150 _data_ptr =
reinterpret_cast<char *
>(buf);
151 _number_of_items = nitems;
152 _item_size = itemsize;
159 size_t bufsize = _number_of_items *
_item_size;
161 _data_ptr =
new char [bufsize];
169 _number_of_items = nitems;
170 size_t bufsize = _number_of_items *
_item_size;
172 _data_ptr =
new char [bufsize];
180 _number_of_items = nitems;
182 size_t bufsize = _number_of_items *
_item_size;
184 _data_ptr =
new char [bufsize];
191 return(_data_ptr ? (_number_of_items * _item_size) : 0);
200 if((newsize%save_item_size) == 0){
201 _item_size = save_item_size;
204 _data_ptr =
new char [newsize];
207 return(_number_of_items * _item_size);
210 const char *
data()
const {
return(_data_ptr); };
211 char *
data() {
return(_data_ptr); };
217 std::ostringstream OutStr;
220 T *dataptr = (T *)_data_ptr;
222 OutStr << *dataptr++;
223 if(i != (_number_of_items - 1))
227 Ostr << OutStr.str();
234 T *dataptr = (T *)_data_ptr;
236 std::getline(Istr,line);
237 std::istringstream InStr(line);
263 return((name == inMeta.
name) && (unit == inMeta.
unit) &&
264 (loc == inMeta.
loc) && (ncomp == inMeta.
ncomp) &&
265 (dsize == inMeta.
dsize));
270 return(!(
operator==(inMeta)));
292 std::vector<metadata>::const_iterator imdIt = inMetaData.begin();
293 while(imdIt != inMetaData.end())
294 this->push_back(*imdIt++);
301 std::vector<metadata>::const_iterator imdIt = inMetaData.begin();
302 while(imdIt != inMetaData.end())
303 this->push_back(*imdIt++);
312 std::getline(InStr,line);
313 std::istringstream Istr(line);
317 while(num < num_vars){
318 std::getline(InStr,line);
319 std::istringstream IStr(line);
320 IStr >> (*this)[num++];
326 int num_vars = this->
size();
328 OutStr << num_vars << std::endl;
329 while(num < num_vars)
330 OutStr << (*this)[num++] << std::endl;
333 void AddField(
const std::string &name,
char loc,
unsigned int ncomp,
334 unsigned int dsize,
const std::string &unit)
354 std::ostringstream Ostr;
355 metadataset::const_iterator metaIt = this->begin();
356 while(metaIt != this->end()){
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
364 << ((rMeta.
loc ==
's') ?
"Simulation-global" :
365 (rMeta.
loc ==
'd') ?
"Domain-global" :
366 (rMeta.
loc ==
'm' || rMeta.
loc ==
'm') ?
368 (rMeta.
loc ==
'c') ?
"Grid cells" :
369 (rMeta.
loc ==
'n') ?
"Grid nodes" :
370 "Unknown location") << std::endl
372 << ((rMeta.
dsize == 1) ?
"Byte " :
373 (rMeta.
dsize == 4) ?
"Integer " :
374 (rMeta.
dsize == 8) ?
"Real " :
375 "Invalid ") <<
"data" << std::endl;
377 Ostr <<
"___" << std::endl;
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()); };
410 metadataset::iterator mdi = meta.begin();
412 while(mdi != meta.end()){
413 std::string &fieldName(mdi++->name);
414 fieldHandles[fieldName] = index++;
416 return(InitializeFieldIndices());
422 fieldIndices.resize(0);
423 fieldIndices.resize(fieldHandles.size(),-1);
424 metadataset::iterator mdi = meta.begin();
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())
432 int fieldHandle = fieldHandleIt->second;
433 fieldIndices[fieldHandle] = index++;
440 std::map<std::string,int>::const_iterator fieldHandleIt =
441 fieldHandles.find(fieldName);
442 if(fieldHandleIt == fieldHandles.end())
444 return(fieldHandleIt->second);
447 if(fieldHandle > fieldIndices.size())
449 return(fieldIndices[fieldHandle]);
454 meta = dataDictionary;
461 data.resize(meta.size());
464 size_t numMeta = meta.size();
465 size_t numData = data.size();
466 if(numMeta == numData){
468 }
else if(numData > numMeta){
469 data.resize(numMeta);
472 while(numMeta > numData){
473 DataBufferType newData;
474 data.push_back(newData);
488 int numBuffers = inData.
data.size();
489 data.resize(numBuffers);
490 for(
int i = 0;i < numBuffers;i++)
492 InitializeFieldIndices();
495 virtual void Copy(
const dataset &inData,
const std::string &fieldNames)
497 std::istringstream nameStream(fieldNames);
498 std::string fieldName;
499 std::vector<int> copyFieldIndices;
500 while(nameStream >> fieldName){
503 std::cerr <<
"pcpp::field::dataset::Copy:ERROR! Cannot find (" 504 << fieldName <<
") in input state." << std::endl;
507 copyFieldIndices.push_back(fieldIndex);
509 Copy(inData,copyFieldIndices);
512 virtual void Copy(
const dataset &inData,
const std::vector<int> ©FieldIndices)
517 int numFields = copyFieldIndices.size();
518 meta.resize(numFields);
519 data.resize(numFields);
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]);
528 InitializeFieldIndices();
530 virtual void Destroy(
const std::string &fieldName)
532 int fieldIndex = GetFieldIndex(fieldName);
534 data[fieldIndex].Destroy();
549 unsigned int numMeta = meta.size();
550 unsigned int numData = data.size();
551 if(numMeta > numData){
552 size_t all_data_size = 0;
554 data.push_back(mydata);
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 :
564 size_t total_size = nitems * metaData.
dsize * metaData.
ncomp;
565 all_data_size += total_size;
569 numData = data.size();
571 return(all_data_size);
572 }
else if(numMeta < numData) {
578 virtual size_t Create(
size_t number_of_nodes = 0,
size_t number_of_cells = 0)
580 if(!((number_of_nodes == 0) && (number_of_cells == 0)) ||
582 numNodes = number_of_nodes;
583 numCells = number_of_cells;
586 size_t all_data_size = 0;
591 data.resize(meta.size());
592 metadataset::iterator mdi = meta.begin();
593 size_t data_index = 0;
594 while(mdi != meta.end()){
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 :
607 std::cerr <<
"dataset::Create: Error, unknown location: " << mdi->loc << std::endl;
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);
618 return(all_data_size);
628 metadataset::const_iterator mdi = meta.begin();
630 while(mdi != meta.end()){
631 if(mdi++->name == name)
640 return(GetDataIndex(name));
645 metadataset::iterator mdi = meta.begin();
646 while(mdi != meta.end()){
647 if(mdi->name == name)
651 bool invalid_field_name =
false;
652 assert(invalid_field_name);
659 int known_field = GetDataIndex(name);
660 assert(known_field >= 0);
661 return(data[known_field]);
664 DataBufferType &
Field(
const std::string &name)
667 int known_field = GetDataIndex(name);
668 assert(known_field >= 0);
669 return(data[known_field]);
673 DataBufferType &
Field(
int known_field)
675 return(data[known_field]);
678 const DataBufferType &
Field(
int known_field)
const 680 return(data[known_field]);
685 int known_field = GetFieldIndexByHandle(fieldHandle);
686 assert(known_field >= 0);
687 return(data[known_field]);
692 int known_field = GetFieldIndexByHandle(fieldHandle);
693 assert(known_field >= 0);
694 return(data[known_field]);
699 int known_field = GetDataIndex(name);
700 assert(known_field >= 0);
701 return(data[known_field]);
704 const DataBufferType &
Field(
const std::string &name)
const 706 int known_field = GetDataIndex(name);
707 assert(known_field >= 0);
708 return(data[known_field]);
713 return(data[known_field].
Empty());
718 int known_field = GetDataIndex(name);
719 assert(known_field >= 0);
720 data[known_field].Set(buf);
726 data[known_field].Set(buf);
729 template<
class BufferDataType>
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);
738 template<
class BufferDataType>
741 size_t dsize =
sizeof(BufferDataType);
742 data[known_field].Set(&invec[0],invec.size(),dsize);
745 template<
class BufferDataType>
748 int known_field = GetDataIndex(fieldName);
749 assert(known_field >= 0);
750 return(data[known_field].Data<BufferDataType>());
753 template<
class BufferDataType>
756 int known_field = GetFieldIndexByHandle(fieldHandle);
757 assert(known_field >= 0);
758 return(data[known_field].Data<BufferDataType>());
761 template<
class BufferDataType>
764 int known_field = GetDataIndex(fieldName);
765 assert(known_field >= 0);
766 return(data[known_field].Data<BufferDataType>());
769 template<
class BufferDataType>
772 int known_field = GetFieldIndexByHandle(fieldHandle);
773 assert(known_field >= 0);
774 return(data[known_field].Data<BufferDataType>());
777 template<
class BufferDataType>
780 assert(known_field >= 0);
781 return(data[known_field].Data<BufferDataType>());
787 assert(known_field >= 0);
788 return(data[known_field].Data<double>());
793 int known_field = GetFieldIndexByHandle(fieldHandle);
794 assert(known_field >= 0);
795 return(data[known_field].Data<double>());
800 assert(known_field >= 0);
801 return(data[known_field].Data<double>());
806 int known_field = GetFieldIndexByHandle(fieldHandle);
807 assert(known_field >= 0);
808 return(data[known_field].Data<double>());
815 metadataset::const_iterator mdi = meta.begin();
816 while(mdi != meta.end()){
817 if(mdi->name == name)
821 bool invalid_field_name =
false;
822 assert(invalid_field_name);
828 assert(fieldId < meta.size());
829 return(meta[fieldId]);
834 MetaDataType returnMeta;
835 int known_field = GetFieldIndexByHandle(fieldHandle);
836 assert(known_field >= 0);
837 return(meta[known_field]);
842 int known_field = GetDataIndex(name);
843 assert(known_field >= 0);
844 OutStream << data[known_field];
852 int known_field = GetDataIndex(name);
853 assert(known_field >= 0);
854 InStream >> data[known_field];
858 template<
typename ValueType>
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;
869 void AddField(
const std::string &name,
char loc,
unsigned int ncomp,
870 unsigned int dsize,
const std::string &unit)
891 assert(known_field >= 0);
893 md.
name = newFieldName;
897 int RenameField(
const std::string &fieldName,
const std::string &newFieldName)
899 int srcIndex = GetFieldIndex(fieldName);
902 return(RenameField(srcIndex,newFieldName));
905 int MakeLink(
int known_field,
const std::string &newFieldName)
907 assert(known_field >= 0);
908 int targetFieldId = data.size();
909 AddField(newFieldName,meta[known_field]);
911 DataBufferType &srcFieldBuffer(data[known_field]);
912 SetFieldBuffer(targetFieldId,srcFieldBuffer.
data());
919 assert(numNodes == inData.
numNodes);
923 assert(numCells == inData.
numCells);
926 std::string fieldName;
927 std::istringstream Istr(fieldNames);
928 while(Istr >> fieldName){
930 assert(srcFieldIndex > 0);
931 DataBufferType &srcFieldBuffer(inData.
data[srcFieldIndex]);
933 int trgFieldIndex(GetFieldIndex(fieldName));
934 if(trgFieldIndex > 0){
935 metadata &trgMeta(meta[trgFieldIndex]);
936 assert(trgMeta == srcMeta);
937 SetFieldBuffer(trgFieldIndex,srcFieldBuffer.
data());
939 AddField(fieldName,srcMeta);
940 DataBufferType dataBuffer(srcFieldBuffer);
941 data.push_back(dataBuffer);
956 metadataset::iterator mdIt = meta.begin();
957 while(mdIt != meta.end()){
959 if(fieldMetaData.
loc == loc)
960 returnMeta.push_back(fieldMetaData);
DataContainerType & Data()
databuffer(size_t number, size_t type)
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)
int GetDataIndex(const std::string &name) const
databuffer(void *buf, size_t number, size_t type)
int RenameField(const std::string &fieldName, const std::string &newFieldName)
BufferDataType * GetFieldBuffer(int known_field)
metadataset Dictionary(const char loc)
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)
int InitializeFieldHandles()
bool FieldEmpty(int known_field=0)
int GetFieldIndexByHandle(int fieldHandle) const
virtual size_t ReCreate()
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)
void AssignFieldValue(const std::string &name, ValueType value)
std::map< std::string, int > fieldHandles
databuffer(const databuffer &inBuffer)
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)
field::metadata MetaDataType
BufferDataType * GetFieldBufferByHandle(int fieldHandle)
void Copy(const databuffer &inBuffer)
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)
virtual void Copy(const dataset &inData, const std::vector< int > ©FieldIndices)
std::ostream & WriteFieldToStream(std::ostream &OutStream, const std::string &name) 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
void SetFieldBuffer(int known_field, void *buf)
int GetFieldHandle(const std::string &fieldName) const
int InitializeFieldIndices()
double * GetRealFieldBufferByHandle(int fieldHandle)
const metadata & GetFieldMetaData(int fieldId) const
DataBufferType & GetFieldData(const std::string &name)
void SetMetaData(const MetaDataSetType &dataDictionary)
int GetFieldIndex(const std::string &name) const
friend std::istream & operator>>(std::istream &Istr, databuffer &buf)
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)
const metadataset & Meta() const
void SetFieldBuffer(const std::string &name, void *buf)
size_t resize(size_t newsize)
DataBufferType & GetFieldDataByHandle(int fieldHandle)
DataBufferType & Field(const std::string &name)
databuffer & operator=(const databuffer &inBuffer)
virtual void Copy(const dataset &inData)