diff --git a/Cantera/src/spectra/LineBroadener.cpp b/Cantera/src/spectra/LineBroadener.cpp new file mode 100644 index 000000000..4a0e0511d --- /dev/null +++ b/Cantera/src/spectra/LineBroadener.cpp @@ -0,0 +1,52 @@ +#include "ct_defs.h" +#include "LineBroadener.h" + +using namespace std; + +namespace Cantera { + + doublereal to_wavenumbers(doublereal freq) { + return freq/(100.0*lightSpeed); + } + + doublereal from_wavenumbers(doublereal omega) { + return omega*(100.0*lightSpeed); + } + + Lorentzian::Lorentzian(doublereal FWHM) { + m_hwhm = 0.5*FWHM; + m_hwhm2 = m_hwhm*m_hwhm; + } + + doublereal Lorentzian::profile(doublereal deltaFreq) { + return (1.0/Pi) *m_hwhm/(deltaFreq*deltaFreq + m_hwhm2); + } + + doublereal Lorentzian::cumulative(doublereal deltaFreq) { + return (1.0/Pi) * atan(deltaFreq/m_hwhm) + 0.5; + } + + doublereal Lorentzian::width() { + return 2.0*m_hwhm; + } + + Gaussian::Gaussian(doublereal FWHM) { + m_width = FWHM; + m_sigma = 0.5*FWHM / sqrt(2.0 * log(2.0)); + m_sigma2 = m_sigma*m_sigma; + } + + doublereal Gaussian::profile(doublereal deltaFreq) { + return 1.0/(m_sigma*SqrtTwo*SqrtPi) * + exp(-deltaFreq*deltaFreq/(2.0*m_sigma2)); + } + + doublereal Gaussian::cumulative(doublereal deltaFreq) { + return 0.5*(1.0 + erf(deltaFreq/(m_sigma*SqrtTwo))); + } + + doublereal Gaussian::width() { + return m_width; + } + +} diff --git a/Cantera/src/spectra/LineBroadener.h b/Cantera/src/spectra/LineBroadener.h new file mode 100644 index 000000000..bf318a6c5 --- /dev/null +++ b/Cantera/src/spectra/LineBroadener.h @@ -0,0 +1,61 @@ +#include "ct_defs.h" +#include "ctexceptions.h" + +namespace Cantera { + + class LineBroadener { + + public: + + LineBroadener() {} + + virtual ~LineBroadener() {} + + /** + * the line shape profile, as a function of distance from line + * center. This function must have total area = 1.0. + */ + virtual doublereal profile(doublereal deltaFreq) { + throw CanteraError("LineBroadener::profile", + "base class method called!"); + } + + /** + * The cumulative profile, defined as + * \f[ + * C(\Delta \nu) = \int_{-\infty}^{\Delta \nu} P(x) dx + * \f] + */ + virtual doublereal cumulative(doublereal deltaFreq) { + throw CanteraError("LineBroadener::cumulative", + "base class method called!"); + } + + }; + + class Lorentzian : public LineBroadener { + public: + Lorentzian(doublereal FWHM); + virtual doublereal profile(doublereal deltaFreq); + virtual doublereal cumulative(doublereal deltaFreq); + virtual double width(); + + protected: + doublereal m_hwhm; + doublereal m_hwhm2; + }; + + class Gaussian : public LineBroadener { + public: + Gaussian(doublereal FWHM); + virtual doublereal profile(doublereal deltaFreq); + virtual doublereal cumulative(doublereal deltaFreq); + virtual doublereal width(); + + protected: + doublereal m_sigma; + doublereal m_sigma2; + doublereal m_width; + }; + +} diff --git a/Cantera/src/spectra/rotor.cpp b/Cantera/src/spectra/rotor.cpp index af0b62c51..16e9223d4 100644 --- a/Cantera/src/spectra/rotor.cpp +++ b/Cantera/src/spectra/rotor.cpp @@ -54,7 +54,7 @@ namespace Cantera { * is returned. Otherwise, it is computed as a sum * \f[ * z = \sum_{J=0}^{J_{max} (2J + 1) \exp(-E(J)/kT) - * \] + * \f] */ doublereal Rotor::partitionFunction(doublereal T, int cutoff) { int j = 0;