Manticore  Version 1.0
Physics of Molecular Clouds
Dust.cc
Go to the documentation of this file.
1 
8 #include <cmath>
9 
10 #include "Dust.h"
11 #include "manticore.h"
12 
13 namespace mu = mutils;
14 
15 
16 namespace manticore {
17 
19 namespace dust {
20 
29 { // {nu0, kappa0}
30  {8.321743e+09, 2.286790e-05},
31  {1.248261e+10, 4.744500e-05},
32  {1.872392e+10, 9.843610e-05},
33  {2.304483e+10, 1.430450e-04},
34  {2.723480e+10, 1.932250e-04},
35  {4.048416e+10, 3.944150e-04},
36  {5.991655e+10, 7.987750e-04},
37  {8.559507e+10, 1.517920e-03},
38  {8.942755e+10, 1.642440e-03},
39  {1.097373e+11, 2.373980e-03},
40  {1.152241e+11, 2.591900e-03},
41  {1.331476e+11, 3.362340e-03},
42  {1.497914e+11, 4.156390e-03},
43  {1.997218e+11, 6.975990e-03},
44  {2.304483e+11, 9.025520e-03},
45  {2.995828e+11, 1.369980e-02},
46  {4.279754e+11, 2.569960e-02},
47  {5.991655e+11, 5.039920e-02},
48  {8.559507e+11, 1.009980e-01},
49  {1.325589e+12, 2.169970e-01},
50  {1.621122e+12, 3.076000e-01},
51  {1.890111e+12, 4.066510e-01},
52  {2.204437e+12, 5.256380e-01},
53  {2.569312e+12, 6.786530e-01},
54  {2.995828e+12, 8.649890e-01},
55  {3.492859e+12, 1.180770e+00},
56  {4.072078e+12, 1.581190e+00},
57  {4.747743e+12, 2.109970e+00},
58  {5.535526e+12, 2.798060e+00},
59  {6.453742e+12, 3.866420e+00},
60  {6.968660e+12, 4.210170e+00},
61  {7.525308e+12, 4.269800e+00},
62 /* lambda < 40 micron:
63  {8.125382e+12, 4.341700e+00},
64  {8.772556e+12, 4.506770e+00},
65  {1.022816e+13, 5.454030e+00},
66  {1.192606e+13, 7.666310e+00},
67  {1.390174e+13, 1.094070e+01},
68  {1.501665e+13, 1.347080e+01},
69  {1.621122e+13, 1.579020e+01},
70  {1.750920e+13, 1.510520e+01},
71  {1.890111e+13, 1.336780e+01},
72  {2.040751e+13, 1.354000e+01},
73  {2.204437e+13, 1.603100e+01},
74  {2.379532e+13, 1.965150e+01},
75  {2.569312e+13, 2.513110e+01},
76  {2.670067e+13, 2.548350e+01},
77  {2.773904e+13, 2.480020e+01},
78  {2.883368e+13, 2.521440e+01},
79  {2.995828e+13, 2.579990e+01},
80  {3.053850e+13, 2.679960e+01},
81  {3.113194e+13, 2.207110e+01},
82  {3.234883e+13, 1.721290e+01},
83  {3.361565e+13, 1.431590e+01},
84  {3.492859e+13, 1.396440e+01},
85  {3.771657e+13, 1.331150e+01},
86  {4.072631e+13, 1.268920e+01},
87  {4.397222e+13, 1.209670e+01},
88  {4.747743e+13, 1.153170e+01},
89  {5.127208e+13, 1.369520e+01},
90  {5.535526e+13, 1.290380e+01},
91  {5.977308e+13, 1.419280e+01},
92  {6.453742e+13, 1.628710e+01},
93  {6.968660e+13, 1.760470e+01},
94  {7.525308e+13, 1.929400e+01},
95  {7.819966e+13, 2.029280e+01},
96  {8.125382e+13, 2.133790e+01},
97  {8.443693e+13, 2.322900e+01},
98  {8.775124e+13, 2.533260e+01},
99  {9.116944e+13, 2.974520e+01},
100  {9.474451e+13, 4.313220e+01},
101  {9.844981e+13, 6.182070e+01},
102  {1.022816e+14, 6.525970e+01},
103  {1.063105e+14, 3.606000e+01},
104  {1.104656e+14, 3.394000e+01},
105  {1.192606e+14, 3.894270e+01},
106  {1.390819e+14, 5.063830e+01},
107  {1.621122e+14, 6.449570e+01},
108  {1.890111e+14, 7.974990e+01},
109  {2.204437e+14, 9.807170e+01},
110  {2.569312e+14, 1.143450e+02},
111  {2.995828e+14, 1.309990e+02},
112  {3.153503e+14, 1.370850e+02},
113  {3.328697e+14, 1.438060e+02},
114  {3.524503e+14, 1.512710e+02},
115  {3.744784e+14, 1.596120e+02},
116  {3.994437e+14, 1.689970e+02},
117  {4.279754e+14, 1.796410e+02},
118  {4.608965e+14, 1.918230e+02},
119  {4.993046e+14, 2.059090e+02},
120  {5.446959e+14, 2.223980e+02},
121  {5.991655e+14, 2.419780e+02},
122  {6.657394e+14, 2.656360e+02},
123  {7.489569e+14, 2.948310e+02},
124  {8.559507e+14, 3.318290e+02},
125  {9.986092e+14, 3.803510e+02},
126  {1.198331e+15, 4.469770e+02},
127  {1.497914e+15, 5.446050e+02},
128  {1.997218e+15, 7.025750e+02},
129  {2.995828e+15, 1.005980e+03},
130  {5.991655e+15, 1.858230e+03},
131 */
132 };
133 
134 
135 // Register new models here as needed.
136 std::map<std::string, manticore::tableType>
138 {
139  {"OH5", dust::modelOH5},
140 };
141 
142 
148 void printModels(std::vector<mu::CommandLine::Option> &opts, char name)
149 {
150  // Find dust model option.
151  for (auto &entry: opts) {
152  if (entry.shortName == name) {
153  entry.helpText += "\n(Available models:";
154  for (auto &model: modelMap) { entry.helpText += " " + model.first; }
155  entry.helpText += ")";
156  }
157  }
158 }
159 
160 } // namespace dust
161 
162 
163 
164 void Dust::setModel(const std::string &model, double rho)
165 {
166  const char *const fn = "Dust::setModel";
167  auto mp = dust::modelMap.find(model);
168  if (mp == dust::modelMap.end()) {
169  mp = dust::modelMap.begin();
170  MU_ERROR(fn, "Unknown dust model '%s', using '%s'", model, mp->first);
171  }
172 
173  name_ = mp->first;
174  rho_ = rho;
175 
176  auto table = mp->second;
177  if (rho != 100.0) {
178  double scale = 100.0/rho;
179  for (auto &entry: table) { entry.second *= scale; }
180  }
181 
182  // Release old model.
183  if (spline_) {
184  gsl_spline_free(spline_);
185  spline_ = nullptr;
186  }
187 
188  // Interpolate logarithm of ordinates.
189  spline_ = initSpline(table, true);
190 
191  // Invalidate fixed power law.
192  opacity_ = Opacity{0.0, 0.0, 0.0};
193 }
194 
195 
196 void Dust::setModel(double lamb0, double kappa0, double beta)
197 {
198  char name[32];
199  snprintf(name, sizeof(name), "beta=%.6g", beta);
200  name_ = name;
201 
202  opacity_ = Opacity{lamb0/(1e4*c_light), kappa0, beta};
203 
204  // Ratio not meaningful here.
205  rho_ = 0.0;
206 
207  // Free old model.
208  if (spline_) {
209  gsl_spline_free(spline_);
210  spline_ = nullptr;
211  }
212 }
213 
214 
222 double Dust::kappa(double nu) const
223 {
224  if (spline_) {
225  return exp(gsl_spline_eval(spline_, nu, nullptr));
226  } else {
227  // Fixed power law.
228  return opacity_.kappa0 * pow(nu*opacity_.inu0, opacity_.beta);
229  }
230 }
231 
232 } // namespace manticore
#define MU_ERROR(src, msg,...)
Log a message at level Log::ERROR.
Definition: Log.h:164
gsl_spline * initSpline(const tableType &table, bool ln)
Initializes cubic spline interpolator.
Definition: manticore.cc:74
const std::string & name() const noexcept
Current model name.
Definition: Dust.h:64
void setModel(const std::string &model, double rho=100.0)
Set dust properties model (table-based).
Definition: Dust.cc:164
Fixed power-law opacity parameters.
Definition: Dust.h:71
Package namespace.
Definition: Detector.cc:13
std::string name_
Current model name.
Definition: Dust.h:74
void printModels(std::vector< mu::CommandLine::Option > &opts, char name)
Add available dust model names to options summary.
Definition: Dust.cc:148
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
std::map< std::string, manticore::tableType > modelMap
Definition: Dust.cc:137
MathUtils package.
Definition: CommandLine.cc:10
double rho_
Current model gas-to-dust ratio.
Definition: Dust.h:77
const manticore::tableType modelOH5
OH5 model.
Definition: Dust.cc:28
std::vector< std::pair< double, double > > tableType
Basic table data.
Definition: manticore.h:17
gsl_spline * spline_
Table interpolator.
Definition: Dust.h:83
Opacity opacity_
Fixed power law.
Definition: Dust.h:80
double rho() const noexcept
Current model gas-to-dust ratio.
Definition: Dust.h:67