Manticore  Version 1.5.3
Physics of Molecular Clouds
Graybody.h
Go to the documentation of this file.
1 #ifndef GRAYBODY_H
2 #define GRAYBODY_H
3 
4 #include <cmath>
5 
6 #include "Dust.h"
7 #include "manticore.h"
8 
9 #ifndef CMB
10 #define CMB 0
11 #endif
12 
13 namespace manticore {
14 
15 // Forward references.
16 class Detector;
17 
18 
40 class Graybody {
41 public:
43  static constexpr double B0 = 2.0*h_Planck/(c_light*c_light);
44 
46  static constexpr double Tcmb = 2.73;
47 
51  Graybody(Dust &dust, double err = 1e-3) :
52  dust_{dust, dust}, dualDust_{false}, err_{err},
53  hacc_{gsl_interp_accel_alloc()}, cacc_{gsl_interp_accel_alloc()} { }
54 
59  Graybody(Dust &dusth, Dust &dustc, double err = 1e-3) :
60  dust_{dusth, dustc}, dualDust_{dusth.name() != dustc.name()}, err_{err},
61  hacc_{gsl_interp_accel_alloc()}, cacc_{gsl_interp_accel_alloc()} { }
62 
64  Graybody(const Graybody &g) :
65  dust_{g.dust_}, dualDust_{g.dualDust_}, err_{g.err_},
66  hacc_{gsl_interp_accel_alloc()}, cacc_{gsl_interp_accel_alloc()} { }
67 
70  gsl_interp_accel_free(hacc_);
71  gsl_interp_accel_free(cacc_);
72  }
73 
77  double Bnu(double nu, double T) const
78  { return B0*nu*nu*nu/expm1(h_Planck*nu/(k_Boltzman*T)); }
79 
83  double dBnu_dT(double nu, double T) const {
84  double x = h_Planck*nu/(k_Boltzman*T), em1 = expm1(x);
85  return B0*nu*nu*nu*(em1+1.0)*x/(em1*em1*T);
86  }
87 
92  double Inu(double nu, double T, double Sigma) const {
93  double em1 = expm1(-dust_.first.kappa(nu, hacc_)*Sigma);
94  return -em1*(Bnu(nu, T)-(CMB ? Bnu(nu, Tcmb) : 0.0));
95  }
96 
102  double dInu_dT(double nu, double T, double Sigma) const
103  { return -expm1(-dust_.first.kappa(nu, hacc_)*Sigma)*dBnu_dT(nu, T); }
104 
110  double dInu_dS(double nu, double T, double Sigma) const {
111  double kappa = dust_.first.kappa(nu, hacc_);
112  return kappa*exp(-kappa*Sigma)*(Bnu(nu, T)-(CMB ? Bnu(nu, Tcmb) : 0.0));
113  }
114 
121  double Inu(double nu, double Tc, double Sigmac,
122  double Th, double Sigmah) const
123  {
124  double kappah = dust_.first.kappa(nu, hacc_),
125  kappac = (dualDust_ ? dust_.second.kappa(nu, cacc_) : kappah),
126  ehm1 = expm1(-kappah*Sigmah), eh = 1.0 + ehm1,
127  ecm1 = expm1(-kappac*Sigmac), ec = 1.0 + ecm1;
128  return -ehm1*(1.0+eh*ec)*Bnu(nu, Th)-ecm1*eh*Bnu(nu, Tc);
129  }
130 
138  double dInu_dTc(double nu, double Tc, double Sigmac,
139  double Th, double Sigmah) const {
140  (void )Th; // UNUSED
141  double kappah = dust_.first.kappa(nu, hacc_),
142  kappac = (dualDust_ ? dust_.second.kappa(nu, cacc_) : kappah);
143  return -expm1(-kappac*Sigmac)*exp(-kappah*Sigmah)*dBnu_dT(nu, Tc);
144  }
145 
153  double dInu_dSc(double nu, double Tc, double Sigmac,
154  double Th, double Sigmah) const {
155  double kappah = dust_.first.kappa(nu, hacc_),
156  kappac = (dualDust_ ? dust_.second.kappa(nu, cacc_) : kappah);
157  return kappac*exp(-(kappah*Sigmah+kappac*Sigmac)) *
158  (expm1(-kappah*Sigmah)*Bnu(nu, Th) + Bnu(nu, Tc));
159  }
160 
168  double dInu_dTh(double nu, double Tc, double Sigmac,
169  double Th, double Sigmah) const {
170  (void )Tc; // UNUSED
171  double kappah = dust_.first.kappa(nu, hacc_),
172  kappac = (dualDust_ ? dust_.second.kappa(nu, cacc_) : kappah),
173  ehc = exp(-(kappah*Sigmah+kappac*Sigmac));
174  return -expm1(-kappah*Sigmah)*(1.0+ehc)*dBnu_dT(nu, Th);
175  }
176 
184  double dInu_dSh(double nu, double Tc, double Sigmac,
185  double Th, double Sigmah) const {
186  double kappah = dust_.first.kappa(nu, hacc_),
187  kappac = (dualDust_ ? dust_.second.kappa(nu, cacc_) : kappah),
188  ehm1 = expm1(-kappah*Sigmah), eh = 1.0 + ehm1,
189  ecm1 = expm1(-kappac*Sigmac), ec = 1.0 + ecm1;
190  return kappah*eh*((2.0*eh*ec-ecm1)*Bnu(nu, Th)+ecm1*Bnu(nu, Tc));
191  }
192 
198  double F(double T, double Sigma,
199  const Detector *detect, double sr = 1.0) const
200  { return Itot(&Graybody::Inu, T, Sigma, detect, sr); }
201 
207  double dF_dT(double T, double Sigma,
208  const Detector *detect, double sr = 1.0) const
209  { return Itot(&Graybody::dInu_dT, T, Sigma, detect, sr); }
210 
216  double dF_dS(double T, double Sigma,
217  const Detector *detect, double sr = 1.0) const
218  { return Itot(&Graybody::dInu_dS, T, Sigma, detect, sr); }
219 
227  double F(double Tc, double Sigmac, double Th, double Sigmah,
228  const Detector *detect, double sr = 1.0) const
229  { return Itot2(&Graybody::Inu, Tc, Sigmac, Th, Sigmah, detect, sr); }
230 
238  double dF_dTc(double Tc, double Sigmac, double Th, double Sigmah,
239  const Detector *detect, double sr = 1.0) const
240  { return Itot2(&Graybody::dInu_dTc, Tc, Sigmac, Th, Sigmah, detect, sr); }
241 
249  double dF_dSc(double Tc, double Sigmac, double Th, double Sigmah,
250  const Detector *detect, double sr = 1.0) const
251  { return Itot2(&Graybody::dInu_dSc, Tc, Sigmac, Th, Sigmah, detect, sr); }
252 
260  double dF_dTh(double Tc, double Sigmac, double Th, double Sigmah,
261  const Detector *detect, double sr = 1.0) const
262  { return Itot2(&Graybody::dInu_dTh, Tc, Sigmac, Th, Sigmah, detect, sr); }
263 
271  double dF_dSh(double Tc, double Sigmac, double Th, double Sigmah,
272  const Detector *detect, double sr = 1.0) const
273  { return Itot2(&Graybody::dInu_dSh, Tc, Sigmac, Th, Sigmah, detect, sr); }
274 
275 protected:
282  double Itot(double (Graybody::*I)(double, double, double) const,
283  double T, double Sigma,
284  const Detector *detect, double sr = 1.0) const;
285 
294  double Itot2(double (Graybody::*I)(double,double,double,double,double) const,
295  double Tc, double Sigmac, double Th, double Sigmah,
296  const Detector *detect, double sr = 1.0) const;
297 
300 
302  bool dualDust_;
303 
305  double err_;
306 
308  gsl_interp_accel
309  *hacc_ = nullptr, //< Dust::kappa() lookup accelerator (halo).
310  *cacc_ = nullptr; //< Dust::kappa() lookup accelerator (core).
311 };
312 
313 } // namespace manticore
314 
315 #endif // GRAYBODY_H
gsl_interp_accel * cacc_
Definition: Graybody.h:310
double dInu_dTh(double nu, double Tc, double Sigmac, double Th, double Sigmah) const
Two-temperature graybody specific intensity Th-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:168
constexpr double h_Planck
Planck's constant (erg*s).
Definition: manticore.h:27
static constexpr double Tcmb
CMB temperature (K).
Definition: Graybody.h:46
double Inu(double nu, double Tc, double Sigmac, double Th, double Sigmah) const
Two-temperature graybody specific intensity (erg/cm^2/s/Hz/sr).
Definition: Graybody.h:121
double err_
Integration relative error.
Definition: Graybody.h:305
double dInu_dTc(double nu, double Tc, double Sigmac, double Th, double Sigmah) const
Two-temperature graybody specific intensity Tc-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:138
double F(double Tc, double Sigmac, double Th, double Sigmah, const Detector *detect, double sr=1.0) const
Two-temperature graybody integrated flux (erg/cm^2/s).
Definition: Graybody.h:227
constexpr double k_Boltzman
Planck's constant (erg/K).
Definition: manticore.h:30
Package namespace.
Definition: Detector.cc:15
double dF_dSh(double Tc, double Sigmac, double Th, double Sigmah, const Detector *detect, double sr=1.0) const
Two-temperature graybody integrated flux Sigmah-derivative (erg/s/g).
Definition: Graybody.h:271
double dF_dTh(double Tc, double Sigmac, double Th, double Sigmah, const Detector *detect, double sr=1.0) const
Two-temperature graybody integrated flux Th-derivative (erg/cm^2/s/K).
Definition: Graybody.h:260
double Itot2(double(Graybody::*I)(double, double, double, double, double) const, double Tc, double Sigmac, double Th, double Sigmah, const Detector *detect, double sr=1.0) const
Two-temperature graybody integrated flux variant (erg/cm^2/s/??).
Definition: Graybody.cc:73
double dInu_dSc(double nu, double Tc, double Sigmac, double Th, double Sigmah) const
Two-temperature graybody specific intensity Sigmac-derivative (erg/s/Hz/sr/g).
Definition: Graybody.h:153
Graybody(const Graybody &g)
Copy constructor.
Definition: Graybody.h:64
double dInu_dT(double nu, double T, double Sigma) const
Single-temperature graybody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:102
double F(double T, double Sigma, const Detector *detect, double sr=1.0) const
Single-temperature graybody integrated flux (erg/cm^2/s).
Definition: Graybody.h:198
constexpr double c_light
Speed of light (cm/s).
Definition: manticore.h:24
double dInu_dSh(double nu, double Tc, double Sigmac, double Th, double Sigmah) const
Two-temperature graybody specific intensity Sigmah-derivative (erg/s/Hz/sr/g).
Definition: Graybody.h:184
bool dualDust_
Whether the two dust models differ;.
Definition: Graybody.h:302
static constexpr double B0
Blackbody convenience value.
Definition: Graybody.h:43
double dF_dT(double T, double Sigma, const Detector *detect, double sr=1.0) const
Single-temperature graybody integrated flux T-derivative (erg/cm^2/s/K).
Definition: Graybody.h:207
double Itot(double(Graybody::*I)(double, double, double) const, double T, double Sigma, const Detector *detect, double sr=1.0) const
Single-temperature graybody integrated flux variant (erg/cm^2/s/??).
Definition: Graybody.cc:62
std::pair< Dust &, Dust & > dust_
Dust models.
Definition: Graybody.h:299
Detector base class.
Definition: Detector.h:51
double Bnu(double nu, double T) const
Blackbody specific intensity (erg/cm^2/s/Hz/sr).
Definition: Graybody.h:77
Graybody emission model.
Definition: Graybody.h:40
#define CMB
Definition: Graybody.h:10
Graybody(Dust &dust, double err=1e-3)
Single dust model constructor.
Definition: Graybody.h:51
double dInu_dS(double nu, double T, double Sigma) const
Single-temperature graybody specific intensity Sigma-derivative (erg/s/Hz/sr/g).
Definition: Graybody.h:110
double Inu(double nu, double T, double Sigma) const
Single-temperature graybody specific intensity (erg/cm^2/s/Hz/sr).
Definition: Graybody.h:92
double dF_dS(double T, double Sigma, const Detector *detect, double sr=1.0) const
Single-temperature graybody integrated flux Sigma-derivative (erg/s/g).
Definition: Graybody.h:216
double dF_dSc(double Tc, double Sigmac, double Th, double Sigmah, const Detector *detect, double sr=1.0) const
Two-temperature graybody integrated flux Sigmac-derivative (erg/s/g).
Definition: Graybody.h:249
Graybody(Dust &dusth, Dust &dustc, double err=1e-3)
Dual dust model constructor.
Definition: Graybody.h:59
~Graybody()
Destructor.
Definition: Graybody.h:69
gsl_interp_accel * hacc_
Interpolation index accelerators.
Definition: Graybody.h:309
double dF_dTc(double Tc, double Sigmac, double Th, double Sigmah, const Detector *detect, double sr=1.0) const
Two-temperature graybody integrated flux Tc-derivative (erg/cm^2/s/K).
Definition: Graybody.h:238
double dBnu_dT(double nu, double T) const
Blackbody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:83
Dust model.
Definition: Dust.h:28