NDDEM
Reader.h
Go to the documentation of this file.
1 #include <vector>
2 #include <string>
3 #include <cmath>
4 #include <optional>
5 #include "Typedefs.h"
6 
7 #ifndef READER
8 #define READER
9 
10 class Reader {
11 public:
12  virtual std::vector<std::vector<double>> get_bounds() {return {} ; }
13  virtual std::vector<double> get_minmaxradius() {return {} ; }
14  virtual int get_dimension () {return 3 ;}
15  virtual int get_numts()
16  {
17  if (filenumbering.numts != -1) return filenumbering.numts ;
18  if (filenumbering.ismultifile)
19  {
20  filenumbering.numts=0 ;
21  FILE * in ;
22  in=fopen(getpath(filenumbering.numts).c_str(), "r") ;
23  while ( in != nullptr )
24  {
25  printf(".") ;
26  filenumbering.numts++ ;
27  fclose(in) ;
28  //printf("%s\n", getpath(filenumbering.numts).c_str()) ;
29  in=fopen(getpath(filenumbering.numts).c_str(), "r") ;
30  }
31  printf("Found %d files\n", filenumbering.numts) ;
32  return filenumbering.numts ;
33  }
34  else
35  return -1;
36  }
37  virtual int get_num_particles () {return -1;}
38  virtual int get_num_contacts () {return -1;}
39  virtual double * get_data([[maybe_unused]] DataValue datavalue, [[maybe_unused]] int dd, [[maybe_unused]] std::string name="") {return nullptr ; }
40  virtual int build_index () {return -1 ;}
41  virtual int read_timestep ([[maybe_unused]] int ts) {return -1 ; }
42  virtual void post_init() {}
43 
44  void set_default_radiusdensity (double radius, double density) {Radius=radius ; Density=density ;}
46  void set_default_density (double density) {Density=density ; }
48  {
49  static bool info=true ;
50  if (Radius==-1)
51  {
52  if (info)
53  {
54  printf("ERR: the default radius was requested but not set!!!!! set to 1\n") ;
55  info=false ;
56  }
57  return 1. ;
58  }
59  else
60  return Radius ;
61  }
63  {
64  static bool info=true ;
65  if (Density==-1)
66  {
67  if (info)
68  {
69  printf("ERR: the default density was requested but not set!!!!! set to 1\n") ;
70  info=false ;
71  }
72  return 1. ;
73  }
74  else
75  return Density;
76  }
77 
78  //virtual double * get_data(DataValue, int dd) {return nullptr;}
79 
80  bool is_seekable = false ;
81  bool is_fullymapped = false ;
82  std::vector <std::optional<std::streampos>> mapped_ts ;
83 
84  void build_pospqlpq_from_ids (v2d & contactarray , int idx_id1, int idx_id2, int idx_pospq, int idx_lpq,
85  v2d & particlearray, int idx_pos, int idx_r=-1)
86  {
87  //size_t N = particlearray[idx_pos].size() ;
88  size_t Nc = contactarray[idx_id1].size() ;
89  int d=get_dimension() ;
90  for (int i=0 ; i<d ; i++)
91  {
92  contactarray[idx_pospq+i].resize(Nc) ;
93  contactarray[idx_lpq+i].resize(Nc) ;
94  }
95 
96  for (size_t i=0 ; i<Nc ; i++)
97  {
98  int id1=static_cast<int>(contactarray[idx_id1][i]) ;
99  int id2=static_cast<int>(contactarray[idx_id2][i]) ;
100  double fraction = 0.5 ;
101  for (int dd=0 ; dd<d ; dd++)
102  {
103  contactarray[idx_lpq+dd][i] = particlearray[idx_pos+dd][id1] - particlearray[idx_pos+dd][id2] ;
104  if (idx_r!=-1)
105  {
106  fraction = particlearray[idx_r][id2] / (particlearray[idx_r][id1]+particlearray[idx_r][id2]) ;
107  }
108  contactarray[idx_pospq+dd][i] = particlearray[idx_pos+dd][id2] + fraction * contactarray[idx_lpq+dd][i] ;
109  }
110  }
111  }
112 
113  int clean_contacts (v2d & contactarray, int id1, int id2, int idx_lpq, v2d & particlearray, int idx_r)
114  {
115  // WORK IN PROGRESS
116  printf("NEED TO WORK ON THAT ...") ; return 0 ;
117  /*size_t Nc = contactarray[0].size() ;
118  double dst, rr ;
119  std::vector<bool> rm (Nc,false) ;
120 
121  for (size_t i=0 ; i<Nc ; i++)
122  {
123  dst=0 ;
124  for (int dd=0 ; dd<get_dimension() ; dd++)
125  dst += (contactarray[i][idx_lpq+dd]*contactarray[i][idx_lpq+dd]) ;
126  dst=sqrt(dst) ;
127  rr=particlearray[idx_r][contactarray[i][id1]]+particlearray[idx_r][contactarray[i][id1]] ;
128 
129  }*/
130 
131  }
132 
133  // Filebuilder
134  std::string path ;
135  int curts=-1 ;
136  struct {
137  double initial = 0 ;
138  double delta = 1 ;
139  int numts = -1 ;
140  bool ismultifile = false ;
142  std::string getpath (int ts)
143  {
144  char * tmp = nullptr ;
145  size_t pos = path.find('%') ;
146  for ( ; !isalpha(path[pos]) ; pos++) ;
147  if (path[pos]=='e' || path[pos]=='f' || path[pos]=='g' || path[pos]=='E' || path[pos]=='F' || path[pos]=='G')
148  {
149  int len = snprintf(NULL, 0, path.c_str(), filenumbering.initial+filenumbering.delta*ts) ;
150  tmp = (char*) malloc(len) ;
151  sprintf(tmp, path.c_str(), filenumbering.initial+filenumbering.delta*ts) ;
152  }
153  else if (path[pos]=='d'|| path[pos]=='i' || path[pos]=='u' || path[pos]=='h' || path[pos]=='l' || path[pos]=='j' || path[pos]=='z')
154  {
155  int len = snprintf(NULL, 0, path.c_str(), static_cast<long long int>(filenumbering.initial+filenumbering.delta*ts)) ;
156  tmp = (char*) malloc(len+1) ;
157  sprintf(tmp, path.c_str(), static_cast<long long int>(filenumbering.initial+filenumbering.delta*ts)) ;
158  }
159  else printf("ERR: unknown format specifier in file path: %c.\n", path[pos]) ;
160  std::string res = tmp ;
161  free(tmp) ;
162  return res ;
163  }
164 
165 
166 
167 protected:
168  std::vector<std::pair<double,streampos>> index ;
169 
170 private:
171  double Radius=-1, Density=-1 ;
172 } ;
173 
174 #endif
Definition: Reader.h:10
std::string path
Definition: Reader.h:134
void set_default_density(double density)
Definition: Reader.h:46
void set_default_radiusdensity(double radius, double density)
Definition: Reader.h:44
void set_default_radius(double radius)
Definition: Reader.h:45
bool is_fullymapped
Definition: Reader.h:81
struct Reader::@22 filenumbering
virtual int get_num_particles()
Definition: Reader.h:37
int curts
Definition: Reader.h:135
double Radius
Definition: Reader.h:171
int numts
Definition: Reader.h:139
virtual int build_index()
Definition: Reader.h:40
std::vector< std::pair< double, streampos > > index
Definition: Reader.h:168
virtual double * get_data([[maybe_unused]] DataValue datavalue, [[maybe_unused]] int dd, [[maybe_unused]] std::string name="")
Definition: Reader.h:39
std::string getpath(int ts)
Definition: Reader.h:142
virtual void post_init()
Definition: Reader.h:42
int clean_contacts(v2d &contactarray, int id1, int id2, int idx_lpq, v2d &particlearray, int idx_r)
Definition: Reader.h:113
void build_pospqlpq_from_ids(v2d &contactarray, int idx_id1, int idx_id2, int idx_pospq, int idx_lpq, v2d &particlearray, int idx_pos, int idx_r=-1)
Definition: Reader.h:84
virtual std::vector< std::vector< double > > get_bounds()
Definition: Reader.h:12
bool is_seekable
Definition: Reader.h:80
virtual int read_timestep([[maybe_unused]] int ts)
Definition: Reader.h:41
double get_default_density()
Definition: Reader.h:62
bool ismultifile
Definition: Reader.h:140
double initial
Definition: Reader.h:137
virtual int get_numts()
Definition: Reader.h:15
virtual int get_num_contacts()
Definition: Reader.h:38
std::vector< std::optional< std::streampos > > mapped_ts
Definition: Reader.h:82
virtual int get_dimension()
Definition: Reader.h:14
virtual std::vector< double > get_minmaxradius()
Definition: Reader.h:13
double delta
Definition: Reader.h:138
double get_default_radius()
Definition: Reader.h:47
double Density
Definition: Reader.h:171
vector< vector< double > > v2d
Definition: Typedefs.h:10
DataValue
Definition: Typedefs.h:19
@ id2
Definition: Typedefs.h:19
@ pos
Definition: Typedefs.h:19
@ id1
Definition: Typedefs.h:19
@ radius
Definition: Typedefs.h:19
uint d