GR Engine
A physics engine in curved space-time
 All Classes Files Functions Variables
geometry.h
Go to the documentation of this file.
1 #ifndef __GEOMETRY__
2 #define __GEOMETRY__
3 
8 #ifndef NULL
9 #define NULL 0
10 #endif
11 
12 class Manifold;
13 
14 extern Manifold* gManifold;
15 
21 class vector4
22 {
23  double v[4];
24 public:
26 
28  vector4();
30 
35  vector4(double v1, double v2, double v3, double v4);
37  ~vector4();
38 
39  vector4& operator=(const vector4&);
40  vector4 operator+(const vector4);
41  vector4 operator+=(const vector4);
42  vector4 operator-(const vector4);
43  vector4 operator-=(const vector4);
44  vector4 operator*(const double);
45  vector4 operator*=(const double);
46  vector4 operator/(const double);
47  vector4 operator/=(const double);
48  friend vector4 operator*(const double, const vector4);
49 
51 
54  double& operator[](int i);
55 };
56 
62 class Point
63 {
64  double x[4];
65  int coordSystem;
66  static Manifold* m;
67 public:
69  Point();
71 
77  Point(int cS, double x0=0.0, double x1=0.0, double x2=0.0, double x3=0.0);
79 
82  Point(int cS, double tx[]);
84 
87  Point(int cS, vector4 v);
89  Point(const Point&);
91  ~Point();
92 
94 
97  double& operator[](int i);
99  /* \return The number of the coordinate system in use
100  */
101  int getCoordSystem();
103  /* \return A vector4 with components equal to the coordinates of the point
104  */
105  vector4 toVector4();
106 
107  bool operator==(Point);
108  bool operator!=(Point);
109 
111  /* This method sets the manifold being used in the whole program
112  * \param _m The pointer to the manifold object
113  */
114  static void setGlobalManifold(Manifold* _m);
115 };
116 
123 {
124 public:
128  virtual ~CoordinateConversion();
129 
131 
135  virtual Point convertPoint(Point p) = 0;
137 
143  virtual double jacobian(int i, int j, Point p) = 0;
145 
151  virtual double inv_jacobian(int i, int j, Point p) = 0;
152 };
153 
160 {
161 public:
166 
168 
174 
180  double jacobian(int i, int j, Point);
182 
188  double inv_jacobian(int i, int j, Point);
189 };
190 
196 class Metric
197 {
198  Point gCachePoints[4][4];
199  Point invgCachePoints[4][4];
200  Point gammaCachePoints[4][4][4];
201 
202  double gCache[4][4];
203  double invgCache[4][4];
204  double gammaCache[4][4][4];
205 protected:
206  int coordSystem;
208 
215  double dg(int i, int j, int k, Point p);
216 
218 
224  virtual double _g(int i, int j, Point p) = 0;
226 
232  virtual double _invg(int i, int j, Point p) = 0;
234 
241  virtual double _christoffel(int i, int j, int k, Point p) = 0;
242 public:
244 
246  Metric(int cS);
248  virtual ~Metric();
249 
251 
258  double g(int i, int j, Point p);
260 
267  double invg(int i, int j, Point p);
269 
277  double christoffel(int i, int j, int k, Point p);
278 
280 
286  double g(vector4 u, vector4 v, Point p);
287 
289 
296 };
297 
303 class Manifold
304 {
305 protected:
306  int nCoordSystems;
307  CoordinateConversion*** conversions;
308  Metric** metrics;
309 public:
311  Manifold();
313  virtual ~Manifold();
314 
316 
320  CoordinateConversion* getConversion(int i, int j); //returns conversion from i to j
322 
325  Metric* getMetric(int i);
327 
331  Point convertPointTo(Point p, int system); //convert point to coordinates
333 
338  vector4 convertVectorTo(vector4 v, Point p, int system); //convert vector to coordinates
339 
341 
344  virtual int recommendCoordSystem(Point p);
345 };
346 
347 #endif
348