NAPISD
PAHdb website C++ backend
Loading...
Searching...
No Matches
PAHEmissionModel.h
1#ifndef PAHEMISSIONMODEL_H_
2#define PAHEMISSIONMODEL_H_
3
4#include "Exception.h"
5
6#include <algorithm>
7#include <array>
8#include <cmath>
9#include <iomanip>
10#include <iostream>
11#include <numeric>
12#include <utility>
13#include <vector>
14
15#include <gsl/gsl_errno.h>
16#include <gsl/gsl_integration.h>
17#include <gsl/gsl_math.h>
18#include <gsl/gsl_roots.h>
19
21
22public:
23 static double _energy;
24
25 static double _frequency;
26
27 static double _nc;
28
29 static bool _approximate;
30
31 static double solveInitialTemperatureFunc(double temperature,
32 void *transitions);
33
34 static double solveApproximateInitialTemperatureFunc(double temperature,
35 void *nc);
36
37 static double integralOverHeatCapacity(double temperature, void *transitions);
38
39 static double heatCapacity(double temperature, void *transitions);
40
41 static double featureStrength(double temperature, void *transitions);
42
43 static double approximateFeatureStrength(double temperature, void *charge);
44
45 static void convertFromFrequencyToWavelength(std::vector<double> &grid);
46
47 static void convertFromFrequencyToWavelength(std::array<double, 2> &grid);
48
49 static void convertFromWavelengthToFrequency(std::vector<double> &grid);
50
51 static void convertFromFrequencyToWavelength(
52 std::vector<std::vector<std::pair<double, double>>> &transitions);
53
54 static void convertFromWavelengthToFrequency(
55 std::vector<std::vector<std::pair<double, double>>> &transitions);
56
57 void useApproximate(std::vector<int> &charges, std::vector<int> &carbons);
58
60
62 const std::vector<std::vector<std::pair<double, double>>> &transitions);
63
64 void setTransitions(
65 const std::vector<std::vector<std::pair<double, double>>> &transitions);
66
67 void getTransitions(
68 std::vector<std::vector<std::pair<double, double>>> &transitions);
69
70 void shiftTransitions(double shift);
71
72 void setGrid(const std::vector<double> &grid);
73
74 void makeGrid(const std::vector<double> &frange, double step);
75
76 void makeGrid(double fmin, double fmax, double step);
77
78 std::vector<double> const &getGrid() const;
79
80 void printTransitions();
81
82 void applyCascadeWithEnergy(double energy, std::vector<double> &temperatures);
83
84 void applyTemperatureWithEnergy(double energy,
85 std::vector<double> &temperatures);
86
87 void applyBlackbodyWithTemperature(double temperature);
88
89 void
90 applyBlackbodyWithTemperatureForEach(const std::vector<double> &temperatures);
91
92 void getSpectraAndConvolveWithLorentianOfFHWM(
93 std::vector<std::vector<double>> &vector, double fwhm = 15);
94
95 void getSpectraAndConvolveWithGaussianOfFHWM(
96 std::vector<std::vector<double>> &vector, double fwhm = 15);
97
98 void
99 getSpectraAndConvolveWithDrudeOfFHWM(std::vector<std::vector<double>> &vector,
100 double fwhm = 15);
101
102private:
103 static constexpr double TemperatureMin = 2.73;
104
105 static constexpr double TemperatureMax = 6000.0;
106
107 static constexpr double RootAccuracy = 1e-4;
108
109 static constexpr double IntegrationAccuracy = 1e-4;
110
111 static constexpr int MaxIterations = 150;
112
113 static constexpr int MaxSteps = 100;
114
115 static constexpr double PlanckConstant = 6.6260693000000018e-27;
116
117 static constexpr double SpeedOfLight = 29979245800.0;
118
119 static constexpr double BoltzmannConstant = 1.3806504e-16;
120
121 static constexpr double AvogadrosNumber = 6.0221415e+23;
122
123 std::vector<int> _charges;
124
125 std::vector<int> _carbons;
126
127 std::vector<std::vector<std::pair<double, double>>> _transitions;
128
129 std::vector<double> _grid;
130
131 double _fmin;
132
133 double _fmax;
134
135 double
136 solveInitialTemperature(double energy,
137 std::vector<std::pair<double, double>> &transitions);
138
139 double Lorentzian(double frequency, double centroid, double hwhm);
140
141 double Gaussian(double frequency, double centroid, double sigma);
142
143 double Drude(double frequency, double centroid, double fwhm);
144
145 double Blackbody(double frequency, double temperature);
146};
147
148inline void PAHEmissionModel::makeGrid(const std::vector<double> &frange,
149 double step) {
150 makeGrid(frange[0], frange[1], step);
151}
152
153inline std::vector<double> const &PAHEmissionModel::getGrid() const {
154 return (_grid);
155}
156
157inline double PAHEmissionModel::Lorentzian(double frequency, double centroid,
158 double hwhm) {
159 return ((1.0 / M_PI) * hwhm / (pow(frequency - centroid, 2) + pow(hwhm, 2)));
160}
161
162inline double PAHEmissionModel::Gaussian(double frequency, double centroid,
163 double sigma) {
164 return ((1.0 / (sigma * sqrt(2.0 * M_PI))) *
165 exp(-pow(frequency - centroid, 2) / (2.0 * pow(sigma, 2))));
166}
167
168inline double PAHEmissionModel::Drude(double frequency, double centroid,
169 double fwhm) {
170 return ((2.0 / (fwhm * M_PI)) * pow(fwhm / centroid, 2) /
171 (pow(centroid / frequency - frequency / centroid, 2) +
172 pow(fwhm / centroid, 2)));
173}
174
175inline double PAHEmissionModel::Blackbody(double frequency,
176 double temperature) {
177 return (
178 (2.0 * PlanckConstant * SpeedOfLight * SpeedOfLight * pow(frequency, 3)) /
179 (exp(PlanckConstant * SpeedOfLight * frequency /
180 (BoltzmannConstant * temperature)) -
181 1.0));
182}
183
184inline void PAHEmissionModel::useApproximate(std::vector<int> &charges,
185 std::vector<int> &carbons) {
186 _approximate = true;
187 _charges = charges;
188 _carbons = carbons;
189}
190
191#endif /* PAHEMISSIONMODEL_H_ */

Since FY2019 the NASA Ames PAH IR Spectroscopic Database is being supported through a directed Work Package at NASA Ames titled: "Laboratory Astrophysics - The NASA Ames PAH IR Spectroscopic Database".
Since FY2023 the NASA Ames PAH IR Spectroscopic Database is being supported through the Laboratory Astrophysics Rd 2 directed Work Package at NASA Ames.
© Copyright 2021-2025, Christiaan Boersma