VTK  9.2.6
PIOData.h
Go to the documentation of this file.
1 #if !defined(_PIODATA_H)
2 #define _PIODATA_H
3 
4 #include <fstream>
5 #include <iostream>
6 #include <list>
7 #include <map>
8 #include <set>
9 #include <sstream>
10 #include <string.h>
11 #include <string>
12 #include <valarray>
13 
15 {
16  bool operator()(const char* p, const char* q) const { return strcmp(p, q) < 0; };
17 };
18 
19 // Class Declarations
20 
21 class PIO_DATA;
22 class PIO_FIELD;
23 
24 class PIO_FIELD
25 {
26 public:
27  char* pio_name;
28  int index;
29  int64_t length;
30  int64_t position;
31  int64_t chksum;
32  size_t cdata_len;
34  friend class PIO_DATA;
35 
36 protected:
37  double* data;
38  char* cdata;
39 }; // End class PIO_FIELD
40 
41 // Typedefs for the mapping between the names of the PIO blocks in the PIO file and
42 // the PIO_FIELD's used to store the data values in the PIO blocks.
43 typedef std::multimap<const char*, PIO_FIELD*, Cstring_less> VAR_MAP;
44 typedef VAR_MAP::iterator VMI;
45 typedef VAR_MAP::const_iterator CVMI;
46 typedef std::pair<VMI, VMI> VMP;
47 typedef std::pair<CVMI, CVMI> CVMP;
48 
49 class PIO_DATA
50 {
51 public:
52  PIO_DATA(const char* piofile = 0, const std::list<std::string>* fields_to_read = 0,
53  bool _defer_read_data = true, const std::set<const char*, Cstring_less>* rdata = 0,
54  const std::set<const char*, Cstring_less>* cdata = 0);
55  ~PIO_DATA();
56  bool GetPIOfileTime(const char*, double&);
57  void print(std::ostream&);
58  void print(const char*);
59  bool set_scalar_field(std::valarray<int>&, const char*);
60  bool set_scalar_field(std::valarray<int64_t>&, const char*);
61  bool set_scalar_field(std::valarray<uint64_t>&, const char*);
62  bool set_scalar_field(std::valarray<double>&, const char*);
63  bool set_vector_field(std::valarray<std::valarray<double>>&, const char*);
64  inline bool good_read() { return (pio_field != nullptr) ? true : false; }
65  VAR_MAP VarMMap; // Multimap from pio_name to a PIO_FIELD class
66  const char* get_name() const { return name; }
67  bool get_reverse_endian() const { return reverse_endian; }
68  int get_PIO_VERSION() const { return PIO_VERSION; }
69  int get_PIO_NAME_LENGTH() const { return PIO_NAME_LENGTH; }
70  int get_PIO_HEADER_LENGTH() const { return PIO_HEADER_LENGTH; }
71  int get_PIO_INDEX_LENGTH() const { return PIO_INDEX_LENGTH; }
72  const char* get_pio_dandt() const { return pio_dandt; }
73  int get_pio_num() const { return pio_num; }
74  int get_pio_num_with_size(int64_t n) const;
75  int get_pio_signature() const { return pio_signature; }
76  PIO_FIELD* get_pio_field() const { return pio_field; }
77  void GetPIOData(PIO_FIELD&, const double*&, const char*&);
78  void GetPIOData(PIO_FIELD&, const double*&);
79  void GetPIOData(PIO_FIELD&, const char*&);
80  const double* GetPIOData(PIO_FIELD&);
81  void GetPIOData(const char*, const double*&, const char*&);
82  void GetPIOData(const char*, const double*&);
83  void GetPIOData(const char*, const char*&);
84  const double* GetPIOData(const char*);
85  double GetPIOData(const char*, int);
86  bool reconstruct_chunk_field(int64_t numcell, std::valarray<double>& va, const char* prefix,
87  const char* var, int materialId);
88  void AddRealData(const char* _name)
89  {
90  if (RealData.find(_name) == RealData.end())
91  RealData.insert(strdup(_name));
92  }
93  void AddCharData(const char* _name)
94  {
95  if (CharData.find(_name) == CharData.end())
96  CharData.insert(strdup(_name));
97  }
98  void FreePIOData(PIO_FIELD& pio_field);
99  bool verbose;
100 
101 private:
102  std::set<const char*, Cstring_less> RealData;
103  std::set<const char*, Cstring_less> CharData;
104  const char* name;
105  std::istream* Infile;
106  bool reverse_endian;
107  int PIO_VERSION;
108  int PIO_NAME_LENGTH;
109  int PIO_HEADER_LENGTH;
110  int PIO_INDEX_LENGTH;
111  const char* pio_dandt; // Date and Time
112  int pio_num;
113  int64_t pio_position;
114  int pio_signature;
115  PIO_FIELD* pio_field;
116  bool defer_read_data;
117  size_t matident_len;
118  size_t timertype_len;
119 
120  char* buf;
121  size_t size_buf;
122  void ReadPioFieldData(PIO_FIELD& pio_field);
123  bool read(const char*, const std::list<std::string>* fields_to_read = 0);
124  bool read(const std::list<std::string>* fields_to_read = 0);
125  inline void byte_flip(char* word, int64_t size)
126  {
127  if (size_buf < (size_t)size)
128  {
129  if (buf)
130  delete[] buf;
131  size_buf = size;
132  buf = new char[size_buf];
133  }
134  memcpy((void*)buf, (const void*)word, size);
135  for (int64_t i = 0; i < size; ++i)
136  word[i] = buf[size - 1 - i];
137  } // End byte_flip
138 
139  template <class T>
140  inline T read_pio_word(T& val)
141  {
142  double word;
143  this->Infile->read((char*)&word, sizeof(word));
144  if (reverse_endian)
145  byte_flip((char*)&word, sizeof(word));
146  val = T(word);
147  return val;
148  } // End read_pio_word
149 
150  inline bool read_pio_bool()
151  {
152  double word;
153  this->Infile->read((char*)&word, sizeof(word));
154  if (reverse_endian)
155  byte_flip((char*)&word, sizeof(word));
156  return (word != 0) ? true : false;
157  } // End read_pio_bool
158 
159  inline void fstr2Cstr(char* s, size_t len) const
160  {
161  s[len] = '\0';
162  size_t i = len - 1;
163  do
164  {
165  if (s[i--] == ' ')
166  s[i + 1] = '\0';
167  } while (i != 0);
168  } // End fstr2Cstr
169 
170  inline char* read_pio_char_string(size_t len)
171  {
172  if (size_buf <= len)
173  {
174  if (buf)
175  delete[] buf;
176  size_buf = len + 1;
177  buf = new char[size_buf];
178  }
179  this->Infile->read(buf, len);
180  buf[len] = '\0';
181  fstr2Cstr(buf, len);
182  char* val = new char[strlen(buf) + 1];
183  strcpy(val, buf);
184  return val;
185  } // End read_pio_char_string
186 
187  inline void insert_VAR_MAP_pairs()
188  {
189  for (int i = 0; i < pio_num; ++i)
190  {
191  if (pio_field[i].read_field_data)
192  {
193 #if !defined __SUNPRO_CC
194  VarMMap.insert(std::make_pair(pio_field[i].pio_name, pio_field + i));
195 #else
196  VAR_MAP::value_type type(pio_field[i].pio_name, pio_field + i);
197  VarMMap.insert(type);
198 #endif
199  }
200  }
201  } // End insert_VAR_MAP_pairs
202 
203  inline bool read_field(const char* pio_name, const std::list<std::string>* fields_to_read)
204  {
205  std::string spio_name = std::string(pio_name);
206  if (fields_to_read == 0)
207  return true;
208  else
209  {
210  for (std::list<std::string>::const_iterator pos = fields_to_read->begin();
211  pos != fields_to_read->end(); ++pos)
212  {
213  if (spio_name == *pos)
214  return true;
215  }
216  }
217  return false;
218  }
219 }; // End class PIO_DATA
220 
221 // Locations of various data items from the input arrays, amhc_i, amhc_r8,
222 // amch_l, and controller_r8
223 enum
224 {
225  Ntime = 0, // time = controller_r8[Ntime];
226  Nnumdim = 42, // numdim = amhc_i[Nnumdim]
227  Nmesh0 = 16, // N[0] = amhc_i[Nmesh0]
228  Nmesh1 = 17, // N[1] = amhc_i[Nmesh1]
229  Nmesh2 = 29, // N[2] = amhc_i[Nmesh2]
230  Nd0 = 21, // d[0] = amhc_r8[Nd0]
231  Nd1 = 22, // d[1] = amhc_r8[Nd1]
232  Nd2 = 38, // d[2] = amhc_r8[Nd2]
233  NZero0 = 19, // Zero[0] = amhc_r8[NZero0]
234  NZero1 = 20, // Zero[1] = amhc_r8[NZero1]
235  NZero2 = 35, // Zero[2] = amhc_r8[NZero2]
236  Ncylin = 1, // cylindrically (axisymmetric) symmetric
237  // geometry if amhc_l[Ncylin]!=0
238  Nsphere = 8 // spherically symmetirc geometry if
239  // amhc_l[Nsphere]!=0
240 };
241 
242 // Prototypes
243 bool GetPIOfileTime(const char*, double&);
244 bool IsPIOfile(const char*);
245 #endif
int64_t length
Definition: PIOData.h:29
int get_PIO_VERSION() const
Definition: PIOData.h:68
int get_PIO_HEADER_LENGTH() const
Definition: PIOData.h:70
VAR_MAP VarMMap
Definition: PIOData.h:65
int get_PIO_NAME_LENGTH() const
Definition: PIOData.h:69
char * cdata
Definition: PIOData.h:38
bool reconstruct_chunk_field(int64_t numcell, std::valarray< double > &va, const char *prefix, const char *var, int materialId)
VAR_MAP::iterator VMI
Definition: PIOData.h:44
std::multimap< const char *, PIO_FIELD *, Cstring_less > VAR_MAP
Definition: PIOData.h:43
Definition: PIOData.h:225
Definition: PIOData.h:230
bool verbose
Definition: PIOData.h:99
PIO_DATA(const char *piofile=0, const std::list< std::string > *fields_to_read=0, bool _defer_read_data=true, const std::set< const char *, Cstring_less > *rdata=0, const std::set< const char *, Cstring_less > *cdata=0)
int get_pio_num() const
Definition: PIOData.h:73
void print(std::ostream &)
int index
Definition: PIOData.h:28
int get_PIO_INDEX_LENGTH() const
Definition: PIOData.h:71
void AddRealData(const char *_name)
Definition: PIOData.h:88
const char * get_pio_dandt() const
Definition: PIOData.h:72
PIO_FIELD * get_pio_field() const
Definition: PIOData.h:76
VAR_MAP::const_iterator CVMI
Definition: PIOData.h:45
void AddCharData(const char *_name)
Definition: PIOData.h:93
size_t cdata_len
Definition: PIOData.h:32
bool get_reverse_endian() const
Definition: PIOData.h:67
const char * get_name() const
Definition: PIOData.h:66
bool set_vector_field(std::valarray< std::valarray< double >> &, const char *)
bool good_read()
Definition: PIOData.h:64
bool set_scalar_field(std::valarray< int > &, const char *)
int get_pio_num_with_size(int64_t n) const
void FreePIOData(PIO_FIELD &pio_field)
void GetPIOData(PIO_FIELD &, const double *&, const char *&)
Definition: PIOData.h:232
double * data
Definition: PIOData.h:37
int64_t position
Definition: PIOData.h:30
std::pair< VMI, VMI > VMP
Definition: PIOData.h:46
Definition: PIOData.h:231
int64_t chksum
Definition: PIOData.h:31
std::pair< CVMI, CVMI > CVMP
Definition: PIOData.h:47
bool read_field_data
Definition: PIOData.h:33
bool operator()(const char *p, const char *q) const
Definition: PIOData.h:16
int get_pio_signature() const
Definition: PIOData.h:75
bool IsPIOfile(const char *)
char * pio_name
Definition: PIOData.h:27
bool GetPIOfileTime(const char *, double &)