/usr/include/Gyoto/GyotoMetric.h is in libgyoto4-dev 1.0.2-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 | /**
* \file GyotoMetric.h
* \brief Base class for metric description
*
* Classes which represent a metric (e.g. Gyoto::Kerr) should inherit
* from Gyoto::Metric::Generic and implement all of the virtual
* methods plus at least one of the gmunu methods and one of the
* christoffel methods.
*
*/
/*
Copyright 2011, 2013 Frederic Vincent, Thibaut Paumard
This file is part of Gyoto.
Gyoto is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gyoto is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Gyoto. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GyotoMetric_H_
#define __GyotoMetric_H_
#include <iostream>
#include <fstream>
#include <string>
#include <GyotoSmartPointer.h>
#include <GyotoObject.h>
#include <GyotoAstrobj.h>
#include <GyotoRegister.h>
#include <GyotoHooks.h>
#include <GyotoDefs.h>
namespace Gyoto {
namespace Metric {
class Generic;
/// A function to build instances of a specific Metric::Generic sub-class
/**
* This is a more specific version of the
* SmartPointee::Subcontractor_t type. A Metric::Subcontrator_t is
* called by the Gyoto::Factory to build an instance of the kind
* of metric specified in an XML file (see Register()). The
* Factory and Subcontractor_t function communicate through a
* Gyoto::FactoryMessenger.
*/
typedef SmartPointer<Metric::Generic> Subcontractor_t(FactoryMessenger*);
/**
* \brief Subcontractor template
*
* Instead of reimplementing the wheel, your subcontractor can simply be
* Gyoto::Metric::Subcontractor<MyKind>
*
* \tparam T Sub-class of Metric::Generic
*/
template<typename T> SmartPointer<Metric::Generic> Subcontractor
(FactoryMessenger* fmp) {
SmartPointer<T> gg = new T();
#ifdef GYOTO_USE_XERCES
if (fmp) gg -> setParameters(fmp);
#endif
return gg;
}
/// Query the Metric register
/**
* Query the Metric register to get the Metric::Subcontractor_t
* correspondig to a given kind name. This function is normally
* called only from the Factory.
*
* \param name e.g. "KerrBL"
* \param errmode int=0. If errmode==0, failure to find a
* registered Metric by that name is an error. Else, simply
* return NULL pointer in that case.
* \return pointer to the corresponding subcontractor.
*/
Gyoto::Metric::Subcontractor_t* getSubcontractor(std::string name,
int errmode=0);
/// The Metric register
/**
* Use the Metric::initRegister() once in your program to
* initiliaze it, the Metric::Register() function to fill it, and
* the Metric::getSubcontractor() function to query it.
*/
extern Register::Entry * Register_;
/// Make a Metric kind known to the Factory
/**
* Register a new Metric::Generic sub-class so that the
* Gyoto::Factory knows it.
*
* \param kind The kind name which identifies this object type in
* an XML file, as in <Metric kind="name">
*
* \param scp A pointer to the subcontractor, which will
* communicate whith the Gyoto::Factory to build an instance of
* the class from its XML description
*/
void Register(std::string kind, Gyoto::Metric::Subcontractor_t* scp);
/// Empty the Metric register.
/**
* This must be called once. It is called by
* Gyoto::Register::init().
*/
void initRegister();
}
/* Documented elswhere */
class Worldline;
}
/**
* \namespace Gyoto::Metric
* \brief Access to metrics
*
* Objects which describe space-time geometry must inherit from the
* Gyoto::Metric::Generic class.
*
* To be usable, a Metric::Generic sub-class should register a
* Metric::Subcontractor_t function using the Metric::Register()
* function. See also \ref writing_plugins_page .
*/
/**
* \class Gyoto::Metric::Generic
* \brief Base class for metrics
*
* Example: class Gyoto::Metric::KerrBL
*
* See Gyoto::Metric for an introduction.
*
*/
class Gyoto::Metric::Generic
: public Gyoto::SmartPointee,
public Gyoto::Object,
public Gyoto::Hook::Teller
{
friend class Gyoto::SmartPointer<Gyoto::Metric::Generic>;
private:
double mass_; ///< Mass yielding geometrical unit (in kg).
int coordkind_; ///< Kind of coordinates (cartesian-like, spherical-like, unspecified)
protected:
double delta_min_; ///< Minimum integration step for the adaptive integrator
double delta_max_; ///< Maximum integration step for the adaptive integrator
/**
* \brief Numerical tuning parameter
*
* Ensure that delta (the numerical integration step) is never
* larger than a fraction of the distance between the current
* location and the center of the coordinate system.
*
* For investigations close to the event horizon, 0.5 is usually
* fine. If high accuracy is needed long after deflection (weak
* lensing), then this must be smaller. A good test is to look at a
* MinDistance map for a FixedStar: it must be smooth.
*/
double delta_max_over_r_;
bool keplerian_; ///< 1 if circularVelocity should return the Newtonian Keplerian velocity, in r^-3/2
protected:
/**
* \brief Set kind_
*
* kind(const std::string) is protected because, for most Metrics,
* it should not be changed in runtime.
*/
void kind(const std::string); ///< Set kind_
/**
* \brief Set coordkind_
*
* coordkind(int coordkind) is protected because, for most Metrics,
* it should not be changed in runtime.
*/
void coordKind(int coordkind); ///< Set coordinate kind
public:
GYOTO_OBJECT;
const std::string kind() const; ///< Get kind_
int getRefCount();
// Constructors - Destructor
// -------------------------
Generic(const int coordkind, const std::string &name); ///< Constructor setting Generic::coordkind_ and kind_
Generic(Generic const &o); ///< Copy constructor
virtual ~Generic() ; ///< Destructor
// Mutators / assignment
// ---------------------
virtual Generic * clone() const ; ///< Virtual copy constructor
void mass(const double); ///< Set mass used in unitLength()
void mass(const double, const std::string &unit); ///< Set mass used in unitLength()
// Accessors
int coordKind() const; ///< Get coordinate kind
double mass() const; ///< Get mass used in unitLength()
double mass(const std::string &unit) const; ///< Get mass used in unitLength()
/**
* Metrics implementations are free to express lengths and distances
* in whatever unit they see fit (presumably most often geometrical
* units). This function returns this unit in SI (meters).
*/
double unitLength() const ; ///< M * G / c^2, M is in kg, unitLength in meters
double unitLength(const std::string &unit) const ; ///< unitLength expressed in specified unit
/**
* Returns the marginally bound radius
* Should be implemented in derived classes if useful
* If called on the base class, returns an error
*/
virtual double getRmb() const;
/**
* Returns the marginally stable (ISCO) radius
* Should be implemented in derived classes if useful
* If called on the base class, returns an error
*/
virtual double getRms() const;
/**
* Returns the specific angular momentum l=-u_phi/u_t
* Should be implemented in derived classes if useful
* If called on the base class, returns an error
*/
virtual double getSpecificAngularMomentum(double rr) const;
/**
* Returns potential W=-ln(|u_t|) for a cst specific angular momentum l_cst
* Should be implemented in derived classes if useful
* If called on the base class, returns an error
*/
virtual double getPotential(double pos[4], double l_cst) const;
/**
* Get delta_min_
*/
double deltaMin() const;
/**
* Set delta_min_
*/
void deltaMin(double h1);
/**
* Get delta_max_
*/
double deltaMax() const;
/**
* Get delta max at a given position
*
* \param pos 4-position
* \param[optional] delta_max_external external constraint on delta_max
* \return the smallest value between delta_max_,
* delta_max_external, and R*delta_max_over_r_ where R is pos[1] in
* spherical coordinates and max(x1, x2, x3) in Cartesian
* coordinates.
*/
virtual double deltaMax(double const pos[8], double delta_max_external) const;
/**
* Set delta_max_
*/
void deltaMax(double h1);
double deltaMaxOverR() const; ///< Get delta_max_over_r_
void deltaMaxOverR(double t); ///< Set delta_max_over_r_
bool keplerian() const; ///< Get keplerian_
void keplerian(bool); ///< Set keplerian_
virtual void cartesianVelocity(double const coord[8], double vel[3]);
///< Compute xprime, yprime and zprime from 8-coordinates
/**
* \param coord 4-position (geometrical units);
* \param v 3-velocity dx1/dx0, dx2/dx0, dx3/dx0;
* \return tdot = dx0/dtau.
*/
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.
/**
* \brief Yield circular velocity at a given position
*
* Give the velocity of a massive particle in circular orbit at the
* given position projected onto the equatorial plane. Such a
* velocity may not exist everywhere (or anywhere) for a given
* metric. This method is intended to be used by Astrobj classes
* such as Torus or ThinDisk.
*
* If keplerian_ is set to true, this method should return the
* Keplerian velcity instead (derived classes should ensure this,
* see KerrBL::circularVelocity() for instance).
*
* The default implementation throws an error if keplerian_ is set
* to false.
*
* \param pos input: position,
* \param vel output: velocity,
* \param dir 1 for corotating, -1 for counterrotating.
*/
virtual void circularVelocity(double const pos[4], double vel[4],
double dir=1.) const ;
/**
* Set coord[4] so that the 4-velocity coord[4:7] is lightlike,
* i.e. of norm 0. There may be up to two solutions. coord[4] is set
* to the hightest. The lowest can be retrieved using
* nullifyCoord(double coord[8], double& tdot2) const. Everything is
* expressed in geometrical units.
*
* \param[in,out] coord 8-position, coord[4] will be set according
* to the other elements;
*/
virtual void nullifyCoord(double coord[8]) const;
///< Set tdot (coord[4]) such that coord is light-like. Everything is in geometrical units.
/**
* Set coord[4] so that the 4-velocity coord[4:7] is lightlike,
* i.e. of norm 0. There may be up to two solutions. coord[4] is set
* to the hightest. The lowest can be retrieved in tdot2. Everything
* is expressed in geometrical units.
*
* \param[in,out] coord 8-position, coord[4] will be set according
* to the other elements;
* \param[out] tdot2 will be set to the smallest solution
*/
virtual void nullifyCoord(double coord[8], double& tdot2) const;
///< Set tdot (coord[4]) such that coord is light-like and return other possible tdot
/**
* Compute the scalarproduct of the two quadrivectors u1 and u2 in
* this Metric, at point pos expressed in coordinate system sys.
* \param pos 4-position;
* \param u1 1st quadrivector;
* \param u2 2nd quadrivector;
* \return u1*u2
*/
virtual double ScalarProd(const double pos[4],
const double u1[4], const double u2[4]) const; ///< Scalar product
virtual double Norm3D(double* pos) const; ///< not clear
/**
* \brief Computes the orthonormal local tetrad of the observer
*
* \param obskind input: kind of observer (eg: "ZAMO","KeplerianObserver"...)
* \param pos input: position,
* \param fourvel output: observer 4-velocity (norm -1)
* \param screen1 output: first vector in the screen plane
* \param screen2 output: second vector in the screen plane
* \param screen3 output: vector normal to the screen
*/
virtual void observerTetrad(std::string const obskind,
double const pos[4], double fourvel[4],
double screen1[4], double screen2[4],
double screen3[4]) const ;
// Outputs
/**
* \brief Metric coefficients
*
* The default implementation calls Metric:: gmunu(double g[4][4], const double * pos) const
*
* \param x 4-position at which to compute the coefficient;
* \param mu 1st index of coefficient, 0≤μ≤3;
* \param nu 2nd index of coefficient, 0≤ν≤3;
* \return Metric coefficient g<SUB>μ,ν</SUB> at point x
*/
virtual double gmunu(const double * x, int mu, int nu) const;
/**
* \brief Metric coefficients
*
* The default implementation calls double gmunu(const double * x, int mu, int nu) const.
*
* \param[out] g 4x4 array to store the coeefficients
* \param[in] x 4-position at which to compute the coefficients;
* \return Metric coefficient g<SUB>μ,ν</SUB> at point x
*/
virtual void gmunu(double g[4][4], const double * pos) const;
/**
* \brief Chistoffel symbol
*
* Value of Christoffel symbol
* Γ<SUP>α</SUP><SUB>μν</SUB> at point
* (x<SUB>1</SUB>, x<SUB>2</SUB>, x<SUB>3</SUB>).
*/
virtual double christoffel(const double coord[8],
const int alpha, const int mu, const int nu) const;
/**
* \brief Chistoffel symbol
*
* Value of Christoffel symbol
* Γ<SUP>α</SUP><SUB>μν</SUB> at point
* (x<SUB>1</SUB>, x<SUB>2</SUB>, x<SUB>3</SUB>).
*/
virtual int christoffel(double dst[4][4][4], const double coord[8]) const ;
/**
* \brief RK4 integrator
*/
virtual int myrk4(Worldline * line, const double coord[8], double h, double res[8]) const;
/**
* \brief RK4 integrator with adaptive step
*/
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;
/**
* \brief Check whether integration should stop
*
* The integrating loop will ask this the Metric through this method
* whether or not it is happy to conitnue the integration.
* Typically, the Metric should answer 0 when everything is fine, 1
* when too close to the event horizon, inside the BH...
*
* \param coord 8-coordinate vector to check.
*/
virtual int isStopCondition(double const * const coord) const;
/**
* \brief F function such as dy/dtau=F(y,cst)
*/
virtual int diff(const double y[8], double res[8]) const ;
/**
* \brief Set Metric-specific constants of motion. Used e.g. in KerrBL.
*/
virtual void setParticleProperties(Gyoto::Worldline* line,
const double * coord) const;
};
#endif
|