4 #include <gsl/gsl_integration.h> 63 double Bnu(
double nu,
double T)
const 69 double dBnu_dT(
double nu,
double T)
const {
71 return B0*nu*nu*nu*(em1+1.0)*x/(em1*em1*T);
78 double Inu(
double nu,
double T,
double Sigma)
const 86 double dInu_dT(
double nu,
double T,
double Sigma)
const 94 double dInu_dS(
double nu,
double T,
double Sigma)
const {
96 return exp(-kappa*Sigma)*kappa*
Bnu(nu, T);
105 double Inu(
double nu,
double Tc,
double Sigmac,
106 double Th,
double Sigmah)
const 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);
121 double dInu_dTc(
double nu,
double Tc,
double Sigmac,
122 double Th = 0.0,
double Sigmah = 0.0)
const {
125 return -expm1(-kappa*Sigmac)*exp(-kappa*Sigmah)*
dBnu_dT(nu, Tc);
135 double dInu_dSc(
double nu,
double Tc,
double Sigmac,
136 double Th = 0.0,
double Sigmah = 0.0)
const {
138 return kappa*exp(-kappa*(Sigmah+Sigmac)) *
139 (expm1(-kappa*Sigmah)*
Bnu(nu, Th) +
Bnu(nu, Tc));
149 double dInu_dTh(
double nu,
double Tc,
double Sigmac,
150 double Th = 0.0,
double Sigmah = 0.0)
const {
152 double kappa =
dust_.
kappa(nu), ehc = exp(-kappa*(Sigmah+Sigmac));
153 return -expm1(-kappa*Sigmah)*(1.0+ehc)*
dBnu_dT(nu, Th);
163 double dInu_dSh(
double nu,
double Tc,
double Sigmac,
164 double Th = 0.0,
double Sigmah = 0.0)
const {
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));
176 double F(
double T,
double Sigma,
177 const Detector *detect =
nullptr,
double sr = 1.0)
const 185 double dF_dT(
double T,
double Sigma,
186 const Detector *detect =
nullptr,
double sr = 1.0)
const 194 double dF_dS(
double T,
double Sigma,
195 const Detector *detect =
nullptr,
double sr = 1.0)
const 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 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 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 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 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 258 static constexpr
int intKey = GSL_INTEG_GAUSS41;
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;
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;
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).
gsl_integration_workspace * integ_
Integration workspace.
static constexpr int intKey
Integration rule key.
constexpr double h_Planck
Planck's constant (erg*s).
double Inu(double nu, double Tc, double Sigmac, double Th, double Sigmah) const
Two-temperature graybody specific intensity (erg/cm^2/s/Hz/sr).
double err_
Integration relative error.
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).
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).
constexpr double k_Boltzman
Planck's constant (erg/K).
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).
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).
static constexpr size_t subLimit
Integral subdivision limit.
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).
Graybody(const Graybody &g)
Copy constructor.
double dInu_dT(double nu, double T, double Sigma) const
Single-temperature graybody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K). ...
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).
constexpr double c_light
Speed of light (cm/s).
double kappa(double nu) const
Gas/dust extinction opacity (cm^2/g).
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/??).
static constexpr double B0
Blackbody convenience value.
double F(double T, double Sigma, const Detector *detect=nullptr, double sr=1.0) const
Single-temperature graybody integrated flux (erg/cm^2/s).
double Bnu(double nu, double T) const
Blackbody specific intensity (erg/cm^2/s/Hz/sr).
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).
const Dust & dust() const noexcept
Dust model reference (const).
Dust & dust() noexcept
Dust model reference.
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/??).
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).
Graybody(Dust &dust, double err=1e-3)
Default constructor.
double dInu_dS(double nu, double T, double Sigma) const
Single-temperature graybody specific intensity Sigma-derivative (erg/s/Hz/sr/g).
double Inu(double nu, double T, double Sigma) const
Simgle-temperature graybody specific intensity (erg/cm^2/s/Hz/sr).
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).
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).
double dBnu_dT(double nu, double T) const
Blackbody specific intensity T-derivative (erg/cm^2/s/Hz/sr/K).