Gyoto
GyotoPolishDoughnut.h
Go to the documentation of this file.
1 
12 /*
13  Copyright (c) 2012 Frederic Vincent, Odele Straub, 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 __GyotoPolishDoughnut_H_
32 #define __GyotoPolishDoughnut_H_
33 
34 namespace Gyoto{
35  namespace Astrobj { class PolishDoughnut; }
36  class FactoryMessenger;
37 }
38 
39 //#include <GyotoMetric.h>
40 #include <GyotoKerrBL.h>
41 #include <GyotoStandardAstrobj.h>
42 #include <GyotoFunctors.h>
43 #include <GyotoHooks.h>
44 //#include <GyotoPolishDoughnutCst.h>
45 
56 : public Astrobj::Standard,
57  protected Gyoto::Hook::Listener
58 {
59  friend class Gyoto::SmartPointer<Gyoto::Astrobj::PolishDoughnut>;
60 
61  // Data :
62  // -----
63 protected:
72  SmartPointer<Gyoto::Metric::KerrBL> gg_;
73  double l0_;
74  double lambda_;
75  double W_surface_;
76  double W_centre_;
77  double r_cusp_;
78  double r_centre_;
79  double DeltaWm1_;
81  /*
82  WARNING! so far (jan. 2014) central_density_ is density_central
83  in standard Polish doughnut model, but it is
84  density_central*c2+pressure_central in Komissarov model
85  */
87  double beta_;
88  double aa_;
89  double aa2_;
91  bool komissarov_;
93 
94  // Constructors - Destructor
95  // -------------------------
96 public:
97  PolishDoughnut() ;
98  //PolishDoughnut(SmartPointer<Metric::KerrBL> gg, double lambda) ; ///< Standard constructor
99  PolishDoughnut(const PolishDoughnut& ) ;
100  virtual PolishDoughnut* clone() const;
101  virtual ~PolishDoughnut() ;
102 
103 
104  // Mutators / assignment
105  // ---------------------
106 public:
108  void operator=(const PolishDoughnut&) ;
109 
110  // Accessors
111  // ---------
112 public:
113  double getL0() const;
114  // void setL0(double l0); set by lambda_
115 
116  double lambda() const;
117  void lambda(double lambda);
118 
119  double centralDensity() const;
120  double centralDensity(std::string unit) const;
121  void centralDensity(double density);
122  void centralDensity(double density, std::string unit);
123 
124  double centralTempOverVirial() const;
125  void centralTempOverVirial(double val);
126 
127  double beta() const;
128  void beta(double beta);
129 
130  void spectralOversampling(size_t);
131  size_t spectralOversampling() const ;
132 
133  bool komissarov() const;
134  void komissarov(bool komis);
135 
136  // Read only members, depend on lambda
137  double getWsurface() const;
138  double getWcentre() const;
139  double getRcusp() const;
140  double getRcentre() const;
141 
142  virtual Gyoto::SmartPointer<Gyoto::Metric::Generic> metric() const;
143  virtual void metric(Gyoto::SmartPointer<Gyoto::Metric::Generic>);
144 
145  // ASTROBJ API
146  // -----------
147  int Impact(Photon *ph, size_t index,
148  Astrobj::Properties *data);
149 
150  virtual double operator()(double const coord[4]) ;
151 
152  virtual int setParameter(std::string name,
153  std::string content,
154  std::string unit) ;
155 #ifdef GYOTO_USE_XERCES
156  virtual void fillElement(FactoryMessenger *fmp) const ;
157 #endif
158 
159  // ASTROBJ processHitQuantities API
160  // --------------------------------
161 protected:
167  virtual void tell(Gyoto::Hook::Teller * msg);
168  virtual void getVelocity(double const pos[4], double vel[4]) ;
170 
180  virtual void integrateEmission(double * I, double * boundaries,
181  size_t* chaninds, size_t nbnu,
182  double dsem, double *cph, double *co) const;
183 
184  virtual double emission(double nu_em, double dsem, double coord_ph[8],
185  double coord_obj[8]) const;
186  virtual void emission(double Inu[], double nu_em[], size_t nbnu,
187  double dsem, double coord_ph[8],
188  double coord_obj[8]=NULL) const ;
189 
190  void emission_komissarov(double Inu[], double nu_em[], size_t nbnu,
191  double dsem, double coord_ph[8],
192  double coord_obj[8]=NULL) const ;
193 
194  double emissionBrems(double nu_em, double nu_crit,
195  double numax, double T_electron,
196  double n_e, double n_j,
197  double amplification,
198  double Cbrems,
199  int comptonorder) const;
201  double emissionSynch(double nu_em, double nu_crit,
202  double numax, double nu_0,
203  double T_electron,
204  double amplification,
205  double Csynch,
206  double alpha1, double alpha2,
207  double alpha3, double preff,
208  int comptonorder) const;
209 
210  double emissionSynchro_komissarov_direction(double Theta_elec,
211  double number_density,
212  double nuem,
213  double nuc,
214  double theta
215  ) const;
216  double emissionSynchro_komissarov_averaged(double Theta_elec,
217  double number_density,
218  double nuem,
219  double nuc
220  ) const;
222  double transmission(double nuem, double dsem, double coord_ph[8]) const ;
223  double BBapprox(double nuem, double Te) const;
224  static double funcxM(double alpha1, double alpha2, double alpha3, double xM);
226  // PURELY INTERNAL TO ASTROBJ
227  // --------------------------
228  private:
229  double potential(double r, double theta) const;
231 
244  public:
246  PolishDoughnut * papa;
247  virtual double operator() (double) const;
248  };
249  friend class intersection_t;
250 
262  public:
276  double const * par;
277  virtual double operator() (double) const;
278  };
280 
281  public:
282  static double bessi0(double xx);
283  static double bessi1(double xx);
284  static double bessk0(double xx);
285  static double bessk1(double xx);
286  static double bessk(int nn, double xx);
287 
288  // Outputs
289  // -------
290  public:
291 
293  friend std::ostream& operator<<(std::ostream& , const PolishDoughnut& ) ;
294 
295  public:
296 
297 
298 };
299 
300 #endif
double getWcentre() const
Get PolishDoughnut::W_centre_.
double l0_
Angular momentum. Tied to PolishDoughnut::lambda_.
Definition: GyotoPolishDoughnut.h:73
virtual double operator()(double const coord[4])
Function defining the object interior.
Pointers performing reference counting.
Definition: GyotoSmartPointer.h:51
double lambda() const
Get PolishDoughnut::lambda_.
A toroïdal accretion structure.
Definition: GyotoPolishDoughnut.h:55
static double funcxM(double alpha1, double alpha2, double alpha3, double xM)
Mahadevan 96 fit function.
double DeltaWm1_
1./(W_centre_ - W_surface_);
Definition: GyotoPolishDoughnut.h:79
double potential(double r, double theta) const
Potential defining shape, used by operator()()
static double bessi1(double xx)
Modified Bessel function I1
virtual double integrateEmission(double nu1, double nu2, double dsem, double c_ph[8], double c_obj[8]=NULL) const
∫ν1ν2 Iν dν (or jν)
friend std::ostream & operator<<(std::ostream &, const PolishDoughnut &)
Display.
Tellers tell Listeners when they mutate.
Classes with an operator() method.
double central_density_
Central density in kg/L (same as g cm^-3)
Definition: GyotoPolishDoughnut.h:80
double lambda_
Adimentionned angular momentum.
Definition: GyotoPolishDoughnut.h:74
int Impact(Photon *ph, size_t index, Astrobj::Properties *data)
Does a photon at these coordinates impact the object?
#define size_t
If not defined in .
Definition: GyotoConfig.h:305
virtual double operator()(double) const
The actual function.
bool komissarov_
1 if Komissarov model is integrated
Definition: GyotoPolishDoughnut.h:91
virtual void fillElement(FactoryMessenger *fmp) const
Fill XML section.
virtual void getVelocity(double const pos[4], double vel[4])
Fluid velocity field.
double emissionSynchro_komissarov_averaged(double Theta_elec, double number_density, double nuem, double nuc) const
Synchrotron proxy for emission()
double emissionBrems(double nu_em, double nu_crit, double numax, double T_electron, double n_e, double n_j, double amplification, double Cbrems, int comptonorder) const
Bremsstrahlung proxy for emission()
double centralTempOverVirial() const
Get PolishDoughnut::centraltemp_over_virial_.
Astronomical objects defined bya a potential/distance.
virtual void integrateEmission(double *I, double *boundaries, size_t *chaninds, size_t nbnu, double dsem, double *cph, double *co) const
∫ν1ν2 Iν dν (or jν)
A functor like double (func) (double) const.
Definition: GyotoFunctors.h:56
double aa2_
aa_2
Definition: GyotoPolishDoughnut.h:89
size_t spectralOversampling() const
Get PolishDoughnut::spectral_oversampling_.
virtual Gyoto::SmartPointer< Gyoto::Metric::Generic > metric() const
Get the Metric gg_.
virtual void tell(Gyoto::Hook::Teller *msg)
Update PolishDoughnut::aa_.
double beta_
Pmagn/Pgas
Definition: GyotoPolishDoughnut.h:87
virtual double emission(double nu_em, double dsem, double coord_ph[8], double coord_obj[8]) const
Specific intensity Iν
size_t spectral_oversampling_
Oversampling used in integrateEmission()
Definition: GyotoPolishDoughnut.h:90
bool angle_averaged_
1 if Komissarov model should be angle averaged
Definition: GyotoPolishDoughnut.h:92
double centralDensity() const
Get PolishDoughnut::central_density_.
double aa_
PolishDoughnut::gg_ spin, cached when setting PolishDoughnut::lambda_.
Definition: GyotoPolishDoughnut.h:88
static double bessk0(double xx)
Modified Bessel function K0
SmartPointer< Gyoto::Metric::KerrBL > gg_
KerrBL metric.
Definition: GyotoPolishDoughnut.h:72
KerrBL metric.
double transmission(double nuem, double dsem, double coord_ph[8]) const
Transmission: exp( αν * dsem )
double beta() const
Get PolishDoughnut::beta_.
intersection_t intersection
double intersection(double) Functor
Definition: GyotoPolishDoughnut.h:279
Namespace for the Gyoto library.
Definition: GyotoAstrobj.h:42
double W_centre_
Potential central value. Tied to PolishDoughnut::lambda_.
Definition: GyotoPolishDoughnut.h:76
virtual PolishDoughnut * clone() const
Cloner.
double centraltemp_over_virial_
Tcenter/Tvirial
Definition: GyotoPolishDoughnut.h:86
double r_cusp_
Cusp radius in geometrical units. Tied to PolishDoughnut::lambda_.
Definition: GyotoPolishDoughnut.h:77
double const * par
Parameter array.
Definition: GyotoPolishDoughnut.h:276
double W_surface_
Potential surface value. Tied to PolishDoughnut::lambda_.
Definition: GyotoPolishDoughnut.h:75
I might listen to a Teller.
Definition: GyotoHooks.h:64
double getL0() const
Get PolishDoughnut::l0_.
Astronomical objects defined bya a potential/distance.
Definition: GyotoStandardAstrobj.h:84
static double bessk(int nn, double xx)
Modified Bessel function.
double transcendental(double) Functor class
Definition: GyotoPolishDoughnut.h:261
static double bessk1(double xx)
Modified Bessel function K1
double getWsurface() const
Get PolishDoughnut::W_surface_.
double intersection(double) Functor class
Definition: GyotoPolishDoughnut.h:243
static double bessi0(double xx)
Modified Bessel function I0
double r_centre_
Central radius in geometrical units. Tied to PolishDoughnut::lambda_.
Definition: GyotoPolishDoughnut.h:78
double getRcusp() const
Get PolishDoughnut::r_cusp_.
virtual int setParameter(std::string name, std::string content, std::string unit)
Set parameter by name.
double BBapprox(double nuem, double Te) const
Approximated Black-Body function.
bool komissarov() const
Get PolishDoughnut::komissarov_.
double getRcentre() const
Get PolishDoughnut::r_centre_.