Manticore  Version 2.0alpha
Physics of Molecular Clouds
Graybody.h
Go to the documentation of this file.
1 #ifndef GRAYBODY_H
2 #define GRAYBODY_H
3 
4 #include <gsl/gsl_integration.h>
5 
6 #include <cmath>
7 
8 #include "Dust.h"
9 #include "manticore.h"
10 
11 namespace manticore {
12 
13 // Forward references.
14 class Detector;
15 
16 
38 class Graybody {
39 public:
41  static constexpr double B0 = 2.0*h_Planck/(c_light*c_light);
42 
46  Graybody(Dust &dust, double err = 1e-3) :
47  dust_(dust), err_(err), integ_(gsl_integration_workspace_alloc(subLimit))
48  { }
49 
51  Graybody(const Graybody &g) : dust_(g.dust_), err_(g.err_),
52  integ_(gsl_integration_workspace_alloc(subLimit)) { }
53 
55  Dust &dust() noexcept { return dust_; }
56 
58  const Dust &dust() const noexcept { return dust_; }
59 
63  double Bnu(double nu, double T) const
64  { return B0*nu*nu*nu/expm1(h_Planck*nu/(k_Boltzman*T)); }
65 
69  double dBnu_dT(double nu, double T) const {
70  double x = h_Planck*nu/(k_Boltzman*T), em1 = expm1(x);
71  return B0*nu*nu*nu*(em1+1.0)*x/(em1*em1*T);
72  }
73 
78  double Inu(double nu, double T, double Sigma) const
79  { return -expm1(-dust_.kappa(nu)*Sigma)*Bnu(nu, T); }
80 
86  double dInu_dT(double nu, double T, double Sigma) const
87  { return -expm1(-dust_.kappa(nu)*Sigma)*dBnu_dT(nu, T); }
88 
94  double dInu_dS(double nu, double T, double Sigma) const {
95  double kappa = dust_.kappa(nu);
96  return exp(-kappa*Sigma)*kappa*Bnu(nu, T);
97  }
98 
105  double Inu(double nu, double Tc, double Sigmac,
106  double Th, double Sigmah) const
107  {
108  double kappa = dust_.kappa(nu),
109  ecm1 = expm1(-kappa*Sigmac), ec = 1.0 + ecm1,
110  ehm1 = expm1(-kappa*Sigmah), eh = 1.0 + ehm1;
111  return -ehm1*(1.0+eh*ec)*Bnu(nu, Th)-ecm1*eh*Bnu(nu, Tc);
112  }
113 
121  double dInu_dTc(double nu, double Tc, double Sigmac,
122  double Th = 0.0, double Sigmah = 0.0) const {
123  (void )Th; // UNUSED
124  double kappa = dust_.kappa(nu);
125  return -expm1(-kappa*Sigmac)*exp(-kappa*Sigmah)*dBnu_dT(nu, Tc);
126  }
127 
135  double dInu_dSc(double nu, double Tc, double Sigmac,
136  double Th = 0.0, double Sigmah = 0.0) const {
137  double kappa = dust_.kappa(nu);
138  return kappa*exp(-kappa*(Sigmah+Sigmac)) *
139  (expm1(-kappa*Sigmah)*Bnu(nu, Th) + Bnu(nu, Tc));
140  }
141 
149  double dInu_dTh(double nu, double Tc, double Sigmac,
150  double Th = 0.0, double Sigmah = 0.0) const {
151  (void )Tc; // UNUSED
152  double kappa = dust_.kappa(nu), ehc = exp(-kappa*(Sigmah+Sigmac));
153  return -expm1(-kappa*Sigmah)*(1.0+ehc)*dBnu_dT(nu, Th);
154  }
155 
163  double dInu_dSh(double nu, double Tc, double Sigmac,
164  double Th = 0.0, double Sigmah = 0.0) const {
165  double kappa = dust_.kappa(nu),
166  ecm1 = expm1(-kappa*Sigmac), ec = 1.0 + ecm1,
167  ehm1 = expm1(-kappa*Sigmah), eh = 1.0 + ehm1;
168  return kappa*eh*((2.0*eh*ec-ecm1)*Bnu(nu, Th)+ecm1*Bnu(nu, Tc));
169  }
170 
176  double F(double T, double Sigma,
177  const Detector *detect = nullptr, double sr = 1.0) const
178  { return Itot(&Graybody::Inu, T, Sigma, detect, sr); }
179 
185  double dF_dT(double T, double Sigma,
186  const Detector *detect = nullptr, double sr = 1.0) const
187  { return Itot(&Graybody::dInu_dT, T, Sigma, detect, sr); }
188 
194  double dF_dS(double T, double Sigma,
195  const Detector *detect = nullptr, double sr = 1.0) const
196  { return Itot(&Graybody::dInu_dS, T, Sigma, detect, sr); }
197 
205  double F(double Tc, double Sigmac, double Th = 0.0, double Sigmah = 0.0,
206  const Detector *detect = nullptr, double sr = 1.0) const
207  { return Itot2(&Graybody::Inu, Tc, Sigmac, Th, Sigmah, detect, sr); }
208 
216  double dF_dTc(double Tc, double Sigmac, double Th = 0.0, double Sigmah = 0.0,
217  const Detector *detect = nullptr, double sr = 1.0) const
218  { return Itot2(&Graybody::dInu_dTc, Tc, Sigmac, Th, Sigmah, detect, sr); }
219 
227  double dF_dSc(double Tc, double Sigmac, double Th = 0.0, double Sigmah = 0.0,
228  const Detector *detect = nullptr, double sr = 1.0) const
229  { return Itot2(&Graybody::dInu_dSc, Tc, Sigmac, Th, Sigmah, detect, sr); }
230 
238  double dF_dTh(double Tc, double Sigmac, double Th = 0.0, double Sigmah = 0.0,
239  const Detector *detect = nullptr, double sr = 1.0) const
240  { return Itot2(&Graybody::dInu_dTh, Tc, Sigmac, Th, Sigmah, detect, sr); }
241 
249  double dF_dSh(double Tc, double Sigmac, double Th = 0.0, double Sigmah = 0.0,
250  const Detector *detect = nullptr, double sr = 1.0) const
251  { return Itot2(&Graybody::dInu_dSh, Tc, Sigmac, Th, Sigmah, detect, sr); }
252 
253 protected:
255  static constexpr size_t subLimit = 512;
256 
258  static constexpr int intKey = GSL_INTEG_GAUSS41;
259 
265  double Itot(double (Graybody::*I)(double, double, double) const,
266  double T, double Sigma,
267  const Detector *detect = nullptr, double sr = 1.0) const;
268 
276  double Itot2(double (Graybody::*I)(double,double,double,double,double) const,
277  double Tc, double Sigmac, double Th = 0.0, double Sigmah = 0.0,
278  const Detector *detect = nullptr, double sr = 1.0) const;
279 
282 
284  double err_;
285 
287  gsl_integration_workspace *integ_;
288 };
289 
290 } // namespace manticore
291 
292 #endif // GRAYBODY_H
double dF_dSc(double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0, const Detector *detect=nullptr, double sr=1.0) const
Two-temperature graybody integrated flux Sigmac-derivative (erg/s/g).
Definition: Graybody.h:227
gsl_integration_workspace * integ_
Integration workspace.
Definition: Graybody.h:287
static constexpr int intKey
Integration rule key.
Definition: Graybody.h:258
constexpr double h_Planck
Planck&#39;s constant (erg*s).
Definition: manticore.h:26
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:105
double err_
Integration relative error.
Definition: Graybody.h:284
double dF_dT(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Single-temperature graybody integrated flux T-derivative (erg/cm^2/s/K).
Definition: Graybody.h:185
double dInu_dTc(double nu, double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0) const
Two-temperature graybody specific intensity Tc-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:121
constexpr double k_Boltzman
Planck&#39;s constant (erg/K).
Definition: manticore.h:29
double dInu_dTh(double nu, double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0) const
Two-temperature graybody specific intensity Th-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:149
double dF_dSh(double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0, const Detector *detect=nullptr, double sr=1.0) const
Two-temperature graybody integrated flux Sigmah-derivative (erg/s/g).
Definition: Graybody.h:249
static constexpr size_t subLimit
Integral subdivision limit.
Definition: Graybody.h:255
Package namespace.
Definition: Detector.cc:13
double dInu_dSc(double nu, double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0) const
Two-temperature graybody specific intensity Sigmac-derivative (erg/s/Hz/sr/g).
Definition: Graybody.h:135
Graybody(const Graybody &g)
Copy constructor.
Definition: Graybody.h:51
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:86
double dF_dS(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Single-temperature graybody integrated flux Sigma-derivative (erg/s/g).
Definition: Graybody.h:194
constexpr double c_light
Speed of light (cm/s).
Definition: manticore.h:23
double kappa(double nu) const
Gas/dust extinction opacity (cm^2/g).
Definition: Dust.cc:222
double Itot(double(Graybody::*I)(double, double, double) const, double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Single-temperature graybody integrated flux variant (erg/cm^2/s/??).
Definition: Graybody.cc:55
static constexpr double B0
Blackbody convenience value.
Definition: Graybody.h:41
double F(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Single-temperature graybody integrated flux (erg/cm^2/s).
Definition: Graybody.h:176
Detector base class.
Definition: Detector.h:50
double Bnu(double nu, double T) const
Blackbody specific intensity (erg/cm^2/s/Hz/sr).
Definition: Graybody.h:63
Graybody emission model.
Definition: Graybody.h:38
double dInu_dSh(double nu, double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0) const
Two-temperature graybody specific intensity Sigmah-derivative (erg/s/Hz/sr/g).
Definition: Graybody.h:163
const Dust & dust() const noexcept
Dust model reference (const).
Definition: Graybody.h:58
Dust & dust() noexcept
Dust model reference.
Definition: Graybody.h:55
double Itot2(double(Graybody::*I)(double, double, double, double, double) const, double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0, const Detector *detect=nullptr, double sr=1.0) const
Two-temperature graybody integrated flux variant (erg/cm^2/s/??).
Definition: Graybody.cc:73
double dF_dTc(double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0, const Detector *detect=nullptr, double sr=1.0) const
Two-temperature graybody integrated flux Tc-derivative (erg/cm^2/s/K).
Definition: Graybody.h:216
Graybody(Dust &dust, double err=1e-3)
Default constructor.
Definition: Graybody.h:46
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:94
double Inu(double nu, double T, double Sigma) const
Simgle-temperature graybody specific intensity (erg/cm^2/s/Hz/sr).
Definition: Graybody.h:78
double dF_dTh(double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0, const Detector *detect=nullptr, double sr=1.0) const
Two-temperature graybody integrated flux Th-derivative (erg/cm^2/s/K).
Definition: Graybody.h:238
Dust & dust_
Dust model.
Definition: Graybody.h:281
double F(double Tc, double Sigmac, double Th=0.0, double Sigmah=0.0, const Detector *detect=nullptr, double sr=1.0) const
Two-temperature graybody integrated flux (erg/cm^2/s).
Definition: Graybody.h:205
double dBnu_dT(double nu, double T) const
Blackbody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:69
Dust model.
Definition: Dust.h:28