Manticore  Version 1.5.3
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 
21 struct FluxData {
22  double Th,
23  Sigmah,
24  Tc,
25  Sigmac;
26 
27  const Detector *d;
28 
29  const Graybody *g;
30 
32  double (Graybody::*I)(double, double, double) const;
33 
35  double (Graybody::*I2)(double, double, double, double, double) const;
36 };
37 
38 extern "C" {
39 
43 double flux(double nu, void *fd) {
44  auto &p = *static_cast<const FluxData*>(fd);
45  return (p.g->*(p.I))(nu, p.Th, p.Sigmah) * p.d->response(nu);
46 }
47 
51 double flux2(double nu, void *fd) {
52  auto &p = *static_cast<const FluxData*>(fd);
53  return (p.g->*(p.I2))(nu, p.Tc, p.Sigmac, p.Th, p.Sigmah) *
54  p.d->response(nu);
55 }
56 
57 } // extern "C"
58 
59 } // namescape graybody
60 
61 
62 double Graybody::Itot(double (Graybody::*I)(double, double, double) const,
63  double T, double Sigma, const Detector *detect,
64  double sr) const
65 {
66  graybody::FluxData fd = {T, Sigma, 0.0, 0.0, detect, this, I, nullptr};
67  std::pair<double, double> freqRange = detect->freqRange();
68  return sr * mu::kgauss_r(graybody::flux, &fd,
69  freqRange.first, freqRange.second, err_);
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 = detect->freqRange();
79  graybody::FluxData fd = {Th, Sigmah, Tc, Sigmac, detect, this, nullptr, I};
80  return sr * mu::kgauss_r(graybody::flux2, &fd,
81  freqRange.first, freqRange.second, err_);
82 }
83 
84 } // namespace manticore
MathUtils numerical mathematics library.
double(Graybody::* I)(double, double, double) const
Single-temperature graybody intensity method.
Definition: Graybody.cc:32
double Sigmah
Core mass surface density.
Definition: Graybody.cc:22
double err_
Integration relative error.
Definition: Graybody.h:305
double Th
Core temperature.
Definition: Graybody.cc:22
double Tc
Halo temperature.
Definition: Graybody.cc:22
double flux(double nu, void *fd)
Flux density integrand (one-component).
Definition: Graybody.cc:43
Package namespace.
Definition: Detector.cc:15
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
const Detector * d
Detector instance.
Definition: Graybody.cc:27
double flux2(double nu, void *fd)
Flux density integrand (two-component).
Definition: Graybody.cc:51
Parameters required by flux().
Definition: Graybody.cc:21
MathUtils package.
Definition: CommandLine.cc:10
virtual std::pair< double, double > freqRange() const noexcept
Frequency range containing significant response.
Definition: Detector.h:78
const Graybody * g
Graybody instance.
Definition: Graybody.cc:29
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
double Sigmac
Halo surface density.
Definition: Graybody.cc:22
Detector base class.
Definition: Detector.h:51
Graybody emission model.
Definition: Graybody.h:40
double(Graybody::* I2)(double, double, double, double, double) const
Two-temperature graybody intensity method.
Definition: Graybody.cc:35
double kgauss_r(double(*f_r)(double x, void *), void *fdata, double a, double b, double err)
Definition: kgauss.cc:410