Manticore  Version 1.0
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 
33 class Graybody {
34 public:
36  static constexpr double B0 = 2.0*h_Planck/(c_light*c_light);
37 
41  Graybody(Dust &dust, double err = 1e-3) :
42  dust_(dust), err_(err), integ_(gsl_integration_workspace_alloc(subLimit))
43  { }
44 
46  Graybody(const Graybody &g) : dust_(g.dust_), err_(g.err_),
47  integ_(gsl_integration_workspace_alloc(subLimit)) { }
48 
50  Dust &dust() noexcept { return dust_; }
51 
53  const Dust &dust() const noexcept { return dust_; }
54 
58  double Bnu(double nu, double T) const
59  { return B0*nu*nu*nu/expm1(h_Planck*nu/(k_Boltzman*T)); }
60 
64  double dBnu_dT(double nu, double T) const {
65  double x = h_Planck*nu/(k_Boltzman*T), em1 = expm1(x);
66  return B0*nu*nu*nu*(em1+1.0)*x/(em1*em1*T);
67  }
68 
73  double Inu(double nu, double T, double Sigma) const
74  { return -expm1(-dust_.kappa(nu)*Sigma)*Bnu(nu, T); }
75 
80  double dInu_dT(double nu, double T, double Sigma) const
81  { return -expm1(-dust_.kappa(nu)*Sigma)*dBnu_dT(nu, T); }
82 
87  double dInu_dS(double nu, double T, double Sigma) const {
88  double kappa = dust_.kappa(nu);
89  return exp(-kappa*Sigma)*kappa*Bnu(nu, T);
90  }
91 
97  double F(double T, double Sigma,
98  const Detector *detect = nullptr, double sr = 1.0) const
99  { return Itot(&Graybody::Inu, T, Sigma, detect, sr); }
100 
106  double dF_dT(double T, double Sigma,
107  const Detector *detect = nullptr, double sr = 1.0) const
108  { return Itot(&Graybody::dInu_dT, T, Sigma, detect, sr); }
109 
115  double dF_dS(double T, double Sigma,
116  const Detector *detect = nullptr, double sr = 1.0) const
117  { return Itot(&Graybody::dInu_dS, T, Sigma, detect, sr); }
118 
119 protected:
121  static constexpr size_t subLimit = 512;
122 
124  static constexpr int intKey = GSL_INTEG_GAUSS41;
125 
131  double Itot(double (Graybody::*I)(double, double, double) const,
132  double T, double Sigma,
133  const Detector *detect = nullptr, double sr = 1.0) const;
134 
137 
139  double err_;
140 
142  gsl_integration_workspace *integ_;
143 };
144 
145 } // namespace manticore
146 
147 #endif // GRAYBODY_H
gsl_integration_workspace * integ_
Integration workspace.
Definition: Graybody.h:142
static constexpr int intKey
Integration rule key.
Definition: Graybody.h:124
constexpr double h_Planck
Planck&#39;s constant (erg*s).
Definition: manticore.h:23
double err_
Integration relative error.
Definition: Graybody.h:139
double dF_dT(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Graybody integrated flux T-derivative (erg/cm^2/s/K).
Definition: Graybody.h:106
constexpr double k_Boltzman
Planck&#39;s constant (erg/K).
Definition: manticore.h:26
static constexpr size_t subLimit
Integral subdivision limit.
Definition: Graybody.h:121
Package namespace.
Definition: Detector.cc:13
Graybody(const Graybody &g)
Copy constructor.
Definition: Graybody.h:46
double dInu_dT(double nu, double T, double Sigma) const
Graybody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:80
double dF_dS(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Graybody integrated flux Sigma-derivative (erg/s/g).
Definition: Graybody.h:115
constexpr double c_light
Speed of light (cm/s).
Definition: manticore.h:20
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
Graybody integrated flux variant (erg/cm^2/s/??).
Definition: Graybody.cc:45
static constexpr double B0
Blackbody convenience value.
Definition: Graybody.h:36
double F(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Graybody integrated flux (erg/cm^2/s).
Definition: Graybody.h:97
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:58
Graybody emission model.
Definition: Graybody.h:33
const Dust & dust() const noexcept
Dust model reference (const).
Definition: Graybody.h:53
Dust & dust() noexcept
Dust model reference.
Definition: Graybody.h:50
Graybody(Dust &dust, double err=1e-3)
Default constructor.
Definition: Graybody.h:41
double dInu_dS(double nu, double T, double Sigma) const
Graybody specific intensity Sigma-derivative (erg/s/Hz/sr/g).
Definition: Graybody.h:87
double Inu(double nu, double T, double Sigma) const
Graybody specific intensity (erg/cm^2/s/Hz/sr).
Definition: Graybody.h:73
Dust & dust_
Dust model.
Definition: Graybody.h:136
double dBnu_dT(double nu, double T) const
Blackbody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K).
Definition: Graybody.h:64
Dust model.
Definition: Dust.h:28