Gyoto
GyotoPhoton.h
Go to the documentation of this file.
1 
9 /*
10  Copyright 2011-2016 Frederic Vincent, Thibaut Paumard
11 
12  This file is part of Gyoto.
13 
14  Gyoto is free software: you can redistribute it and/or modify
15  it under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  Gyoto is distributed in the hope that it will be useful,
20  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22  GNU General Public License for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with Gyoto. If not, see <http://www.gnu.org/licenses/>.
26  */
27 
28 #ifndef __GyotoPhoton_H_
29 #define __GyotoPhoton_H_
30 
31 #include "GyotoFunctors.h"
32 
33 namespace Gyoto{
34  class Photon;
35  namespace Astrobj { class Generic; }
36 }
37 
38 #include <GyotoDefs.h>
39 #include <GyotoMetric.h>
40 #include <GyotoScreen.h>
41 #include <GyotoWorldline.h>
42 #include <GyotoObject.h>
43 
44 #include <float.h>
45 #include <eigen3/Eigen/Dense>
46 
54 : public Gyoto::Worldline,
55  public Gyoto::SmartPointee,
56  public Gyoto::Object
57 {
58  friend class Gyoto::SmartPointer<Gyoto::Photon>;
59  // Data :
60  // -----
61 
62  protected:
64 
67  SmartPointer<Gyoto::Astrobj::Generic> object_;
68 
70 
73  double freq_obs_;
74 
76 
80 
82 
85  Eigen::Matrix4d transmissionMatrix_freqobs_;
86 
88 
92  SmartPointer<Spectrometer::Generic> spectro_;
93 
95 
99  double * transmission_;
100 
103 
105 
109  Eigen::Matrix4d * transmissionMatrix_;
110 
111  // Constructors - Destructor
112  // -------------------------
113 
114  public:
118  virtual std::string className() const ;
119  virtual std::string className_l() const ;
120 
124  Photon() ;
125  Photon(const Photon& ) ;
126  Photon* clone() const ;
127  protected:
128  Photon(Photon* orig, size_t i0, int dir, double step_max);
130  public:
132  Photon(SmartPointer<Metric::Generic> gg, SmartPointer<Astrobj::Generic> obj,
133  double* coord) ;
134 
136  Photon(SmartPointer<Metric::Generic> gg, SmartPointer<Astrobj::Generic> obj,
137  SmartPointer<Screen> screen, double d_alpha, double d_delta);
138 
139  virtual ~Photon() ;
140 
141  virtual double getMass() const ;
142 
144  void astrobj(SmartPointer<Astrobj::Generic>);
146  SmartPointer<Astrobj::Generic> astrobj() const ;
147 
148  using Worldline::metric;
149  // Set Worldline::metric_ as well as the Astrobj metric
150  void metric(SmartPointer<Metric::Generic>);
151 
152 
154  void spectrometer(SmartPointer<Spectrometer::Generic> spr);
156  SmartPointer<Spectrometer::Generic> spectrometer() const ;
157 
159  void freqObs(double);
161  double freqObs() const;
162 
164  void nb_cross_eqplane(int);
166  int nb_cross_eqplane() const;
167 
168 
169  // Mutators / assignment
170  // ---------------------
171  public:
173 
175 
188  void setInitialCondition(SmartPointer<Metric::Generic> gg,
189  SmartPointer<Astrobj::Generic> obj,
190  const double coord[8]) ;
191 
193 
211  void setInitialCondition(SmartPointer<Metric::Generic> gg,
212  SmartPointer<Astrobj::Generic> obj,
213  const double coord[8],
214  const double Ephi[4],
215  const double Etheta[4]) ;
216 
218 
229  void setInitialCondition(SmartPointer<Metric::Generic> gg,
230  SmartPointer<Astrobj::Generic> obj,
231  SmartPointer<Screen> screen,
232  double d_alpha,
233  double d_delta);
234 
236 
241  int hit(Astrobj::Properties *data=NULL);
242 
261  double findMin(Functor::Double_constDoubleArray* object,
262  double t1, double t2, double &tmin,
263  double threshold = DBL_MIN) ;
264 
266 
278  void findValue(Functor::Double_constDoubleArray* object,
279  double value,
280  double tinside, double &toutside) ;
281 
282 #ifdef GYOTO_USE_XERCES
283  virtual void setParameters(FactoryMessenger *fmp) ;
284  static SmartPointer<Photon> Subcontractor(Gyoto::FactoryMessenger*);
285 #endif
286 
287  /* transmission stuff */
288  public:
293 
295 
302  double getTransmission(size_t i) const ;
303 
305 
312  Eigen::Matrix4d getTransmissionMatrix(size_t i) const ;
313 
315 
321  double getTransmissionMax() const ;
322 
324 
327  double const * getTransmission() const ;
329 
332  Eigen::Matrix4d const * getTransmissionMatrix() const ;
333 
335 
341  virtual void transmit(size_t i, double t);
342 
344 
350  virtual void transmit(size_t i, Eigen::Matrix4d mat);
351  virtual void transfer(double * Inu, double * Qnu, double * Unu, double * Vnu, Eigen::Matrix4d * Onu);
353 
354  private:
357  void _allocateTransmissionMatrix();
358 
359  public:
360  class Refined;
361 
362 };
363 
386  protected:
388  public:
389  Refined(Photon *parent, size_t i, int dir, double step_max);
391  virtual void transmit(size_t i, double t);
393  virtual void transmit(size_t i, Eigen::Matrix4d mat);
395  virtual void transfer(double * Inu, double * Qnu, double * Unu, double * Vnu, Eigen::Matrix4d * Onu);
397 };
398 
399 
400 #endif
Gyoto ubiquitous macros and typedefs.
Classes with an operator() method.
Base class for metric description.
Introspectable objects.
#define GYOTO_OBJECT_THREAD_SAFETY
Declare virtual bool isThreadSafe() const.
Definition: GyotoObject.h:99
#define GYOTO_OBJECT
Declare class::properties and class::getProperties()
Definition: GyotoObject.h:84
Description of the observer screen.
Timelike or null geodesics.
#define GYOTO_WORLDLINE
Declare the Worldline interface wrappers.
Definition: GyotoWorldline.h:164
Object with properties.
Definition: GyotoObject.h:152
Refine last step of integration in a Photon.
Definition: GyotoPhoton.h:385
virtual void transmit(size_t i, Eigen::Matrix4d mat)
Update transmission Matrix both in *this and in *parent_.
virtual void transfer(double *Inu, double *Qnu, double *Unu, double *Vnu, Eigen::Matrix4d *Onu)
Perform one step of polarized radiative transfert and update transmission matrix.
Refined(Photon *parent, size_t i, int dir, double step_max)
Constructor.
virtual void transmit(size_t i, double t)
Update transmission both in *this and in *parent_.
Photon * parent_
Parent Photon.
Definition: GyotoPhoton.h:387
A null geodesic transporting light.
Definition: GyotoPhoton.h:57
virtual void transfer(double *Inu, double *Qnu, double *Unu, double *Vnu, Eigen::Matrix4d *Onu)
Perform one step of polarized radiative transfert and update transmission matrix.
Photon * clone() const
Cloner.
double freq_obs_
Photon's frequency in observer's frame.
Definition: GyotoPhoton.h:73
virtual std::string className_l() const
"photon"
void _allocateTransmission()
Allocate Photon::transmission_.
void resetTransmissionMatrix()
Set transmission matrix to identity matrix for each frequency.
void resetTransmission()
Set transmission to 1 for each channel as well as scalar transmission.
Eigen::Matrix4d * transmissionMatrix_
Integrated optical transmission matrix (polarization)
Definition: GyotoPhoton.h:109
int hit(Astrobj::Properties *data=NULL)
Integrate the geodesic.
virtual double getMass() const
Return 0.
int nb_cross_eqplane_
Nb of crossings of equatorial plane z=0, theta=pi/2.
Definition: GyotoPhoton.h:102
double getTransmissionMax() const
Get maximum transmission;.
Eigen::Matrix4d transmissionMatrix_freqobs_
Integrated optical transmission matrix (polarization)
Definition: GyotoPhoton.h:85
Eigen::Matrix4d const * getTransmissionMatrix() const
Get Photon::transmissionMatrix_.
double transmission_freqobs_
Integrated optical transmission.
Definition: GyotoPhoton.h:79
virtual void setParameters(FactoryMessenger *fmp)
Main loop for parsing Properties from XML description.
double * transmission_
Integrated optical transmissions.
Definition: GyotoPhoton.h:99
virtual void transmit(size_t i, double t)
Update transmission in a given channel.
double freqObs() const
Get Photon::freq_obs__.
SmartPointer< Spectrometer::Generic > spectrometer() const
Get Photon::spectro_.
int nb_cross_eqplane() const
Get Photon::nb_cross_eqplane_.
SmartPointer< Spectrometer::Generic > spectro_
Observer's spectrometer.
Definition: GyotoPhoton.h:92
SmartPointer< Astrobj::Generic > astrobj() const
Get Photon::object_.
virtual std::string className() const
"Photon"
void metric(SmartPointer< Metric::Generic >)
Set metric Smartpointer.
void findValue(Functor::Double_constDoubleArray *object, double value, double tinside, double &toutside)
Find date for which the photon is at a given distance from the object.
double const * getTransmission() const
Get Photon::transmission_.
double findMin(Functor::Double_constDoubleArray *object, double t1, double t2, double &tmin, double threshold=DBL_MIN)
Find minimum of photon–object distance.
SmartPointer< Gyoto::Astrobj::Generic > object_
The astronomical target.
Definition: GyotoPhoton.h:67
void setInitialCondition(SmartPointer< Metric::Generic > gg, const double coord[8], const int dir, double const Ephi[4], double const Etheta[4])
Set or re-set the initial condition prior to integration.
Can be pointed to by a SmartPointer.
Definition: GyotoSmartPointer.h:81
Pointers performing reference counting.
Definition: GyotoSmartPointer.h:135
Timelike or null geodesics.
Definition: GyotoWorldline.h:240
SmartPointer< Metric::Generic > metric() const
Get metric.
void setInitialCondition(SmartPointer< Metric::Generic > gg, const double coord[8], const int dir, double const Ephi[4], double const Etheta[4])
Set or re-set the initial condition prior to integration.
SmartPointer< Astrobj::Generic > Subcontractor(FactoryMessenger *fmp, std::vector< std::string > const &plugin)
A template for Subcontractor_t functions.
Definition: GyotoAstrobj.h:77
Namespace for the Gyoto library.
Definition: GyotoAstrobj.h:44