NDDEM
Mesh.h
Go to the documentation of this file.
1 #include "Typedefs.h"
2 #include "Parameters.h"
3 //#include "ContactList.h"
4 #include <boost/math/special_functions/binomial.hpp>
5 
6 #ifndef MESH
7 #define MESH
8 
9 template <int d>
10 class Mesh
11 {
12 public:
13  Mesh() {}
14  Mesh (int dim, std::vector<std::vector<double>> vertices, bool compute_submeshes=true) ;
15  void translate (cv1d t) {origin += t ; for (auto & v: submeshes) for (auto &w: v) w.translate(t) ; }
16  void rotate ([[maybe_unused]] cv1d rot)
17  {
18  printf("ROTATION NEEDS TO BE REIMPLEMENTED\n") ;
19  /*v1d res(d) ;
20  Tools<d>::matvecmult(res, rot, origin) ;
21  origin=res ;
22  for (auto & v: mixedbase)
23  {
24  Tools<d>::matvecmult(res, rot, v) ;
25  v=res ;
26  }
27  for (auto & v: submeshes)
28  for (auto &w: v)
29  w.rotate(rot) ; */
30  }
31  std::string export_json ()
32  {
33  std::string out, indent ;
34 
35  auto write_point= [](cv1d v){std::string res="[" ; for(int i=0 ; i<d ; i++) {res+= std::to_string(v[i]) ; if (i!=d-1) res+=", " ;} res +="]" ; return res ; } ;
36  auto write_point_base= [](cv1d v, cv1d b, int n){std::string res="[" ; for(int i=0 ; i<d ; i++) {res+= std::to_string(v[i]+b[n*d+i]) ; if (i!=d-1) res+=", " ;} res +="]" ; return res ; } ;
37 
38 
39  indent=" " ;
40  out += indent + "{\"dimensionality\":" + std::to_string(dimensionality) +",\n" + indent + "\"vertices\": [\n" ;
41  indent = indent + " " ;
42  out += indent + write_point(origin) ;
43  for (int i=d-dimensionality ; i<d ; i++)
44  out += ", \n" + indent + write_point_base(origin,mixedbase,i) ;
45  indent = " " ;
46  out += "]\n" + indent + "}" ;
47 
48  return out ;
49  return "" ;
50  }
51 
52  void disp ()
53  {
54  printf("DIMENSIONALITY: %d\n", dimensionality) ;
55  std::cout << "orig: ";
56  for (auto &y:origin)
57  std::cout << y << " ";
58  std::cout << "\n" ;
59  for (int i=0 ; i<d*d ; i++)
60  {
61  if (i%d==0) std::cout << "\n" ;
62  std::cout << mixedbase[i] << " " ;
63  }
64  std::cout << "\n";
65 
66  for (int i=0 ; i<dimensionality ; i++)
67  {
68  printf("DIMENSIONALITY: %d\n", i) ;
69  for (auto & w: submeshes[i])
70  {
71  std::cout << "orig: ";
72  for (auto &y:w.origin)
73  std::cout << y << " ";
74  std::cout << "\n" ;
75  for (int i=0 ; i<d*d ; i++)
76  {
77  if (i%d==0) std::cout << "\n" ;
78  std::cout << w.mixedbase[i] << " " ;
79  }
80  }
81  std::cout << "\n";
82  }
83  std::cout << "--\n" ;
84  }
85 
87  std::vector<double> origin ;
88  //std::vector<double> norms ;
89  std::vector<double> mixedbase ;
90  std::vector<double> invertbase ;
91 
92  std::vector<std::vector<Mesh>> submeshes ;
93 
94  template <class Archive>
95  void serialize(Archive &ar)
97 } ;
98 
99 
100 //====================================================================================
101 template <int d>
102 Mesh<d>::Mesh (int dim, std::vector<std::vector<double>> vertices, bool compute_submeshes)
103 {
104  dimensionality=dim ;
105  if (vertices.size() != static_cast<long unsigned int>(dimensionality+1)) printf("ERR: incorrect number of vertices %ld for the mesh of dimensionality %d.\n", vertices.size(), dimensionality) ;
106  origin=vertices[0] ;
107  std::vector<std::vector<double>> tmpbase ;
108  tmpbase.resize(d, std::vector<double>(d)) ;
109  mixedbase.resize(d*d, 0) ;
110 
111  for (int i=1 ; i<dimensionality+1 ; i++)
112  {
113  tmpbase[i-1]=vertices[i]-vertices[0] ;
114  //norms[i-1]=Tools<d>::norm(tmpbase[i-1]) ;
115  }
116 
117  // Completing the mixed base with random vectors first
118  //TODO reset random number
119  boost::random::mt19937 rng(12345);
120  boost::random::uniform_01<boost::mt19937> rand(rng) ;
121  for (int i=dimensionality ; i<d-1 ; i++)
122  for (int j=0 ; j<d ; j++)
123  tmpbase[i][j]=rand() ; //TODO change random number
124 
125  std::vector<double> tmp (d,0) ;
126  for (int i=dimensionality ; i<d ; i++)
127  {
128  for (int j=0 ; j<d ; j++)
129  {
130  Tools<d>::unitvec(tmpbase[d-1], j) ;
131  tmp[j] = Tools<d>::det(tmpbase) ;
132  }
133  double norm =Tools<d>::norm(tmp) ;
134  tmpbase[i] = tmp/norm;
135  }
136 
137 
138  //Reorganising the mixed base for performance reasons (probably not a huge improvement, would be interesting to actually test
139  std::rotate(tmpbase.begin(), tmpbase.begin()+dimensionality, tmpbase.end()) ;
140  //std::rotate(norms.begin(), norms.begin()+dimensionality, norms.end()) ;
141 
142 // if (dimensionality==1)
143 // {
144 // for (int i=0 ; i<d ; i++)
145 // printf("/%g %g %g/\n", tmpbase[i][0], tmpbase[i][1],tmpbase[i][2]) ;
146 // printf("\n") ;
147 // }
148 
149  for (int i=0 ; i<d ; i++)
150  for (int j=0 ; j<d ; j++)
151  mixedbase[i*d+j]=tmpbase[i][j] ;
152  invertbase = Tools<d>::inverse(Tools<d>::transpose(mixedbase)) ;
153 
154  // Handling lower dimensionality sides
155  if (compute_submeshes)
156  {
157  submeshes.resize(dimensionality) ;
158  for (int i=1 ; i<(1<<(dimensionality+1))-1 ; i++)
159  {
160  int subdimensionality = __builtin_popcount(i)-1 ;
161  std::vector<std::vector<double>> pts (subdimensionality+1, std::vector<double>(d)) ;
162  for (int j=0, n=0 ; j<dimensionality+1 ; j++)
163  {
164  if ((i>>j) &1)
165  pts[n++]=vertices[j] ;
166  }
167  submeshes[subdimensionality].push_back(Mesh(subdimensionality, pts, false)) ;
168  }
169 
170  for (int i=0 ; i<dimensionality-1 ; i++)
171  if (submeshes[i].size() != boost::math::binomial_coefficient<double>(dimensionality+1, i+1))
172  printf("ERR: the wrong number of submeshes %ld of dimensionality %d was generated ...\n", submeshes[i].size(), i) ;
173 
174  }
175 }
176 
177 
178 
179 #endif
180 
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:25318
boost::random::mt19937 rng(static_cast< unsigned int >(std::time(nullptr)))
Definition: Mesh.h:11
std::string export_json()
Definition: Mesh.h:31
void disp()
Definition: Mesh.h:52
int dimensionality
Definition: Mesh.h:86
std::vector< double > invertbase
Inverted base: inverse(transpose(mixedbase)).
Definition: Mesh.h:90
void translate(cv1d t)
Definition: Mesh.h:15
void serialize(Archive &ar)
Definition: Mesh.h:95
Mesh()
Only for use by Restarting.
Definition: Mesh.h:13
std::vector< double > origin
Definition: Mesh.h:87
void rotate([[maybe_unused]] cv1d rot)
Definition: Mesh.h:16
std::vector< std::vector< Mesh > > submeshes
Definition: Mesh.h:92
std::vector< double > mixedbase
Mixed based: first n=dimensionality vectors are neither normalised nor unit vectors,...
Definition: Mesh.h:89
Static class to handle multi-dimensional mathematics, and more. It gets specialised for speed with te...
Definition: Tools.h:101
static void unitvec(vector< double > &v, int n)
Construct a unit vector in place.
Definition: Tools.h:735
static double det(cv2d &M)
compute the matrix determinant (probably quite slow, but doesn't really really matters for the usage)
Definition: Tools.h:766
static v1d inverse(cv1d &M)
compute the matrix inverse (very slow and redundant calculation of the determinant for the comatrix,...
Definition: Tools.h:832
const vector< double > cv1d
Definition: Typedefs.h:13
static double norm(const vector< double > &a)
Norm of a vector.
Definition: Tools.h:119
uint d