Manticore  Version 2.0alpha
Physics of Molecular Clouds
Graybody.cc
Go to the documentation of this file.
1 
8 #include "mutils/nmath.h"
9 
10 #include "Detector.h"
11 #include "Graybody.h"
12 
13 namespace mu = mutils;
14 
15 namespace manticore {
16 
18 namespace graybody {
19 
20 extern "C" {
21 
23 struct FluxData {
24  double Tc,
25  Sigmac,
26  Th,
27  Sigmah;
28 
29  const Detector *d;
30 
31  const Graybody *g;
32 
34  double (Graybody::*I)(double, double, double) const;
35 
37  double (Graybody::*I2)(double, double, double, double, double) const;
38 };
39 
43 double flux(double nu, void *fd) {
44  auto &p = *static_cast<const FluxData*>(fd);
45  return (p.I2 ? (p.g->*(p.I2))(nu, p.Tc, p.Sigmac, p.Th, p.Sigmah) :
46  (p.g->*(p.I ))(nu, p.Tc, p.Sigmac)) *
47  (p.d ? p.d->response(nu) : 1.0);
48 }
49 
50 } // extern "C"
51 
52 } // namescape graybody
53 
54 
55 double Graybody::Itot(double (Graybody::*I)(double, double, double) const,
56  double T, double Sigma, const Detector *detect,
57  double sr) const
58 {
59  std::pair<double, double> freqRange =
60  (detect ? detect->freqRange() :
61  std::pair<double,double>{0.0,12.0*k_Boltzman*T/h_Planck});
62 
63  double result, abserr;
64  graybody::FluxData fd = {T, Sigma, 0.0, 0.0, detect, this, I, nullptr};
65  gsl_function f = {graybody::flux, &fd};
66  gsl_integration_qag(&f, freqRange.first, freqRange.second,
67  0.0, err_, subLimit, intKey,
68  integ_, &result, &abserr);
69  return result*sr;
70 }
71 
72 
74  double (Graybody::*I)(double, double, double, double, double) const,
75  double Tc, double Sigmac, double Th, double Sigmah,
76  const Detector *detect, double sr) const
77 {
78  std::pair<double, double> freqRange =
79  (detect ? detect->freqRange() :
80  std::pair<double,double>{0.0, 12.0*k_Boltzman*std::max(Tc, Th)/
81  h_Planck});
82 
83  graybody::FluxData fd = {Tc, Sigmac, Th, Sigmah, detect, this, nullptr, I};
84  gsl_function f = {graybody::flux, &fd};
85  /*
86  double result, abserr;
87  gsl_integration_qag(&f, freqRange.first, freqRange.second,
88  0.0, err_, subLimit, intKey,
89  integ_, &result, &abserr);
90  return sr*result;
91  */
92 // MU_WARN_IF(Tc < 1.0, "Graybody::Itot2", "Low Tc = %.4f", Tc);
93  return sr * mu::kgauss_r(f.function, f.params,
94  freqRange.first, freqRange.second, 0.1*err_);
95 }
96 
97 } // namespace manticore
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
MathUtils numerical mathematics library.
double(Graybody::* I)(double, double, double) const
Single-temperature graybody intensity method.
Definition: Graybody.cc:34
double Sigmah
Halo surface density (optional).
Definition: Graybody.cc:24
double err_
Integration relative error.
Definition: Graybody.h:284
double Th
Halo temperature (optional).
Definition: Graybody.cc:24
double Tc
Core temperature.
Definition: Graybody.cc:24
constexpr double k_Boltzman
Planck&#39;s constant (erg/K).
Definition: manticore.h:29
static constexpr size_t subLimit
Integral subdivision limit.
Definition: Graybody.h:255
double flux(double nu, void *fd)
Flux density integrand.
Definition: Graybody.cc:43
Package namespace.
Definition: Detector.cc:13
const Detector * d
Detector instance (may be nullptr).
Definition: Graybody.cc:29
Parameters required by flux().
Definition: Graybody.cc:23
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
MathUtils package.
Definition: CommandLine.cc:10
virtual std::pair< double, double > freqRange() const noexcept
Frequency range containing significant response.
Definition: Detector.h:77
const Graybody * g
Graybody instance.
Definition: Graybody.cc:31
double Sigmac
Core mass surface density.
Definition: Graybody.cc:24
Detector base class.
Definition: Detector.h:50
Graybody emission model.
Definition: Graybody.h:38
double(Graybody::* I2)(double, double, double, double, double) const
Two-temperature graybody intensity method.
Definition: Graybody.cc:37
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 kgauss_r(double(*f_r)(double x, void *), void *fdata, double a, double b, double err)
Definition: kgauss.cc:412