Gyoto
GyotoMetric.h
Go to the documentation of this file.
1 
12 /*
13  Copyright 2011, 2013 Frederic Vincent, Thibaut Paumard
14 
15  This file is part of Gyoto.
16 
17  Gyoto is free software: you can redistribute it and/or modify
18  it under the terms of the GNU General Public License as published by
19  the Free Software Foundation, either version 3 of the License, or
20  (at your option) any later version.
21 
22  Gyoto is distributed in the hope that it will be useful,
23  but WITHOUT ANY WARRANTY; without even the implied warranty of
24  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  GNU General Public License for more details.
26 
27  You should have received a copy of the GNU General Public License
28  along with Gyoto. If not, see <http://www.gnu.org/licenses/>.
29  */
30 
31 #ifndef __GyotoMetric_H_
32 #define __GyotoMetric_H_
33 
34 #include <iostream>
35 #include <fstream>
36 #include <string>
37 
38 #include <GyotoSmartPointer.h>
39 #include <GyotoAstrobj.h>
40 #include <GyotoRegister.h>
41 #include <GyotoHooks.h>
42 #include <GyotoDefs.h>
43 
44 namespace Gyoto {
45  namespace Metric {
46  class Generic;
47 
49 
57  typedef SmartPointer<Metric::Generic> Subcontractor_t(FactoryMessenger*);
58 
59 
68  template<typename T> SmartPointer<Metric::Generic> Subcontractor
69  (FactoryMessenger* fmp) {
70  SmartPointer<T> gg = new T();
71 #ifdef GYOTO_USE_XERCES
72  gg -> setParameters(fmp);
73 #endif
74  return gg;
75  }
76 
78 
90  int errmode=0);
91 
93 
98  extern Register::Entry * Register_;
99 
101 
112  void Register(std::string kind, Gyoto::Metric::Subcontractor_t* scp);
113 
115 
119  void initRegister();
120 
121  }
122 
123  /* Documented elswhere */
124  class Worldline;
125 }
126 
148 : protected Gyoto::SmartPointee,
149  public Gyoto::Hook::Teller
150 {
151  friend class Gyoto::SmartPointer<Gyoto::Metric::Generic>;
152 
153  private:
154  std::string kind_;
155  double mass_;
157 
158  protected:
159  double delta_min_;
160  double delta_max_;
161 
175 
176  bool keplerian_;
177 
178  protected:
185  void kind(const std::string);
186 
193  void coordKind(int coordkind);
194 
195 
196  public:
197  const std::string kind() const;
198  int getRefCount();
199 
200  // Constructors - Destructor
201  // -------------------------
202  Generic(const int coordkind, const std::string &name);
203 
204  virtual ~Generic() ;
205 
206  // Mutators / assignment
207  // ---------------------
208  virtual Generic * clone() const ;
209 
210  void mass(const double);
211  void mass(const double, const std::string &unit);
212 
213  // Accessors
214 
215  int coordKind() const;
216 
217  double mass() const;
218  double mass(const std::string &unit) const;
219 
225  double unitLength() const ;
226  double unitLength(const std::string &unit) const ;
227 
231  double deltaMin() const;
232 
236  void deltaMin(double h1);
237 
241  double deltaMax() const;
242 
253  virtual double deltaMax(double const pos[8], double delta_max_external) const;
254 
258  void deltaMax(double h1);
259 
260  double deltaMaxOverR() const;
261  void deltaMaxOverR(double t);
262 
263  bool keplerian() const;
264  void keplerian(bool);
265 
266  virtual void cartesianVelocity(double const coord[8], double vel[3]);
268 
274  virtual double SysPrimeToTdot(const double coord[4], const double v[3]) const;
276 
297  virtual void circularVelocity(double const pos[4], double vel[4],
298  double dir=1.) const ;
299 
310  virtual void nullifyCoord(double coord[8]) const;
312 
323  virtual void nullifyCoord(double coord[8], double& tdot2) const;
325 
326 
335  virtual double ScalarProd(const double pos[4],
336  const double u1[4], const double u2[4]) const;
337 
338  virtual double Norm3D(double* pos) const;
339 
340 
363  virtual void setParameter(std::string name,
364  std::string content,
365  std::string unit);
366 
367  // Outputs
368 #ifdef GYOTO_USE_XERCES
369 
391  virtual void setParameters(Gyoto::FactoryMessenger *fmp) ;
392 
399  virtual void fillElement(FactoryMessenger *fmp) ;
400 
404  void processGenericParameters(Gyoto::FactoryMessenger *fmp) ;
405 #endif
406 
417  virtual double gmunu(const double * x, int mu, int nu) const;
418 
428  virtual void gmunu(double g[4][4], const double * pos) const;
429 
430 
431 
439  virtual double christoffel(const double coord[8],
440  const int alpha, const int mu, const int nu) const;
441 
449  virtual int christoffel(double dst[4][4][4], const double coord[8]) const ;
450 
451 
452 
456  virtual int myrk4(Worldline * line, const double coord[8], double h, double res[8]) const;
457 
461  virtual int myrk4_adaptive(Gyoto::Worldline* line, const double coord[8],
462  double lastnorm, double normref,
463  double coordnew[8], double h0, double& h1,
464  double deltamax=GYOTO_DEFAULT_DELTA_MAX) const;
465 
476  virtual int isStopCondition(double const * const coord) const;
477 
481  virtual int diff(const double y[8], double res[8]) const ;
482 
486  virtual void setParticleProperties(Gyoto::Worldline* line,
487  const double * coord) const;
488 
489 
490 };
491 
492 #endif
virtual void nullifyCoord(double coord[8]) const
Set tdot (coord[4]) such that coord is light-like. Everything is in geometrical units.
bool keplerian() const
Get keplerian_.
int coordkind_
Kind of coordinates (cartesian-like, spherical-like, unspecified)
Definition: GyotoMetric.h:156
int coordKind() const
Get coordinate kind.
virtual void circularVelocity(double const pos[4], double vel[4], double dir=1.) const
Yield circular velocity at a given position.
Gyoto registers.
Astronomical objects (light emitters)
double deltaMax() const
Register::Entry * Register_
The Metric register.
virtual Generic * clone() const
Virtual copy constructor.
Tellers tell Listeners when they mutate.
double delta_min_
Minimum integration step for the adaptive integrator.
Definition: GyotoMetric.h:159
virtual void setParticleProperties(Gyoto::Worldline *line, const double *coord) const
Set Metric-specific constants of motion. Used e.g. in KerrBL.
Base class for metrics.
Definition: GyotoMetric.h:147
Reference-counting pointers.
double delta_max_
Maximum integration step for the adaptive integrator.
Definition: GyotoMetric.h:160
Gyoto::Metric::Subcontractor_t * getSubcontractor(std::string name, int errmode=0)
Query the Metric register.
virtual double ScalarProd(const double pos[4], const double u1[4], const double u2[4]) const
Scalar product.
double unitLength() const
M * G / c^2, M is in kg, unitLength in meters.
virtual void fillElement(FactoryMessenger *fmp)
called from Factory
virtual double christoffel(const double coord[8], const int alpha, const int mu, const int nu) const
Chistoffel symbol.
std::string kind_
Metric kind name (e.g. "KerrBL")
Definition: GyotoMetric.h:154
bool keplerian_
1 if circularVelocity should return the Newtonian Keplerian velocity, in r^-3/2
Definition: GyotoMetric.h:176
double deltaMin() const
const std::string kind() const
Get kind_.
virtual int myrk4_adaptive(Gyoto::Worldline *line, const double coord[8], double lastnorm, double normref, double coordnew[8], double h0, double &h1, double deltamax=GYOTO_DEFAULT_DELTA_MAX) const
RK4 integrator with adaptive step.
Gyoto ubiquitous macros and typedefs.
SmartPointer< Metric::Generic > Subcontractor_t(FactoryMessenger *)
A function to build instances of a specific Metric::Generic sub-class.
Definition: GyotoMetric.h:57
virtual int isStopCondition(double const *const coord) const
Check whether integration should stop.
void initRegister()
Empty the Metric register.
double delta_max_over_r_
Numerical tuning parameter.
Definition: GyotoMetric.h:174
Namespace for the Gyoto library.
Definition: GyotoAstrobj.h:42
virtual void cartesianVelocity(double const coord[8], double vel[3])
Compute xprime, yprime and zprime from 8-coordinates.
SmartPointer< Metric::Generic > Subcontractor(FactoryMessenger *fmp)
Subcontractor template.
Definition: GyotoMetric.h:69
Can be pointed to by a SmartPointer.
Definition: GyotoSmartPointer.h:79
virtual double Norm3D(double *pos) const
not clear
double mass_
Mass yielding geometrical unit (in kg).
Definition: GyotoMetric.h:155
virtual double SysPrimeToTdot(const double coord[4], const double v[3]) const
Compute tdot as a function of dr/dt, dtheta/dt and dphi/dt. Everything is in geometrical units...
virtual int myrk4(Worldline *line, const double coord[8], double h, double res[8]) const
RK4 integrator.
double deltaMaxOverR() const
Get delta_max_over_r_.
virtual void setParameter(std::string name, std::string content, std::string unit)
Set parameter by name.
virtual double gmunu(const double *x, int mu, int nu) const
Metric coefficients.
virtual void setParameters(Gyoto::FactoryMessenger *fmp)
Main loop in Subcontractor_t function.
void processGenericParameters(Gyoto::FactoryMessenger *fmp)
Process generic XML parameters.
Listen to me and I'll warn you when I change.
Definition: GyotoHooks.h:82
double mass() const
Get mass used in unitLength()
virtual int diff(const double y[8], double res[8]) const
F function such as dy/dtau=F(y,cst)
void Register(std::string kind, Gyoto::Metric::Subcontractor_t *scp)
Make a Metric kind known to the Factory.
Entry in a register (or a full register)
Definition: GyotoRegister.h:92