diff --git a/data/Schott.xlsx b/data/Schott.xlsx index 48a6505..00dabeb 100755 Binary files a/data/Schott.xlsx and b/data/Schott.xlsx differ diff --git a/src/air.cpp b/src/air.cpp index f07f7c6..b18ee7f 100644 --- a/src/air.cpp +++ b/src/air.cpp @@ -29,16 +29,16 @@ double Air::refractive_index_abs(double lambdamicron, double T, double P) { constexpr double P0 = 101325.0; constexpr double Tref = 15; - double nref = refractive_index_ref(lambdamicron); + double nref = refractive_index_15degC_1atm(lambdamicron); double num = nref - 1.0; double denom = 1.0 + (T-Tref)*(3.4785*pow(10,-3)); return ( 1.0 + (num/denom)*(P/P0) ); } -double Air::refractive_index_ref(double lambdamicron) +double Air::refractive_index_15degC_1atm(double lambdamicron) { - double term1 = 6432.8; + constexpr double term1 = 6432.8; double term2 = 2949810.0*pow(lambdamicron, 2)/( 146.0*pow(lambdamicron,2) - 1.0 ); double term3 = 25540.0*pow(lambdamicron,2)/( 41.0*pow(lambdamicron,2) - 1.0 ); double nref = 1.0 + (term1 + term2 + term3)*pow(10, -8); diff --git a/src/air.h b/src/air.h index 23ebf7c..9e14f86 100644 --- a/src/air.h +++ b/src/air.h @@ -33,7 +33,7 @@ class Air static double refractive_index_abs(double lambdamicron, double T, double P= 101325.0); /** Computes refractive index at the reference temperature */ - static double refractive_index_ref(double lambdamicron); + static double refractive_index_15degC_1atm(double lambdamicron); }; #endif // AIR_H diff --git a/src/glass.cpp b/src/glass.cpp index ec600b3..f4f74c1 100755 --- a/src/glass.cpp +++ b/src/glass.cpp @@ -135,7 +135,7 @@ double Glass::Pxy_(const QString& x, const QString& y) const double Glass::refractiveIndex(double lambdamicron) const { - return refractiveIndex_rel(lambdamicron); + return refractiveIndex_rel(lambdamicron, T_); } double Glass::refractiveIndex(const QString& spectral) const @@ -145,7 +145,7 @@ double Glass::refractiveIndex(const QString& spectral) const QVector Glass::refractiveIndex(const QVector &vLambdamicron) const { - return refractiveIndex_rel(vLambdamicron); + return refractiveIndex_rel(vLambdamicron, T_); } double Glass::refractiveIndex_rel_Tref(double lambdamicron) const @@ -167,12 +167,11 @@ double Glass::refractiveIndex_abs_Tref(double lambdamicron) const return n_abs_T0; } -double Glass::refractiveIndex_abs(double lambdamicron) const +double Glass::refractiveIndex_abs(double lambdamicron, double T) const { double dn = 0.0; if(hasThermalData_){ - double dn_dt = dn_dt_abs(T_, lambdamicron); - dn = (T_-Tref_)*dn_dt; + dn = delta_n_abs(T, lambdamicron); } double n_abs_T0 = refractiveIndex_abs_Tref(lambdamicron); @@ -181,10 +180,10 @@ double Glass::refractiveIndex_abs(double lambdamicron) const return n_abs; } -double Glass::refractiveIndex_rel(double lambdamicron) const +double Glass::refractiveIndex_rel(double lambdamicron, double T) const { - double n_abs = refractiveIndex_abs(lambdamicron); - double n_air = Air::refractive_index_abs(lambdamicron, T_); + double n_abs = refractiveIndex_abs(lambdamicron, T); + double n_air = Air::refractive_index_abs(lambdamicron, T); double n_rel = n_abs/n_air; return n_rel; @@ -204,13 +203,13 @@ QVector Glass::refractiveIndex_rel_Tref(const QVector& vLambdami } -QVector Glass::refractiveIndex_rel(const QVector &vLambdamicron) const +QVector Glass::refractiveIndex_rel(const QVector &vLambdamicron, double T) const { const int dataCount = vLambdamicron.size(); QVector n_rel_v(dataCount); for(int i = 0; i < dataCount; i++){ - n_rel_v[i] = refractiveIndex_rel(vLambdamicron[i]); + n_rel_v[i] = refractiveIndex_rel(vLambdamicron[i], T); } return n_rel_v; @@ -452,11 +451,9 @@ void Glass::appendTransmittanceData(double lambdamicron, double trans, double th double Glass::dn_dt_abs(double T, double lambdamicron) const { double dT = T - Tref_; - double Stk = (Ltk() > 0.0) - (Ltk() < 0.0); double n = refractiveIndex_abs_Tref(lambdamicron); - //return (n*n-1)/(2*n) * ( D0() + 2*D1()*dT + 3*D2()*dT*dT + (E0() + 2*E1()*dT)/(lambdamicron*lambdamicron - Ltk()*Ltk()) ); - return (n*n-1)/(2*n) * ( D0() + 2*D1()*dT + 3*D2()*dT*dT + (E0() + 2*E1()*dT)/(lambdamicron*lambdamicron - Stk*Ltk()*Ltk()) ); + return (n*n-1)/(2*n) * ( D0() + 2*D1()*dT + 3*D2()*dT*dT + (E0() + 2*E1()*dT)/(lambdamicron*lambdamicron - Ltk()*Ltk()) ); } QVector Glass::dn_dt_abs(const QVector& vT, double lambdamicron) const @@ -471,6 +468,20 @@ QVector Glass::dn_dt_abs(const QVector& vT, double lambdamicron) return vDndt; } + +double Glass::delta_n_abs(double T, double lambdamicron) const +{ + double dT = T - Tref_; + double Stk = (Ltk() > 0.0) - (Ltk() < 0.0); + double n = refractiveIndex_rel_Tref(lambdamicron); + + // Schott technical document + return (n*n-1)/(2*n) * ( D0()*dT+ D1()*dT*dT + D2()*dT*dT*dT + (E0()*dT + E1()*dT*dT)/(lambdamicron*lambdamicron - Ltk()*Ltk()) ); + + // Zemax manual + //return (n*n-1)/(2*n) * ( D0()*dT+ D1()*dT*dT + D2()*dT*dT*dT + (E0()*dT + E1()*dT*dT)/(lambdamicron*lambdamicron - Stk*Ltk()*Ltk()) ); +} + void Glass::setThermalData(int n, double val) { Q_ASSERT( thermal_data_size_ == thermal_data_.size() ); diff --git a/src/glass.h b/src/glass.h index d62c9c4..9894ae1 100755 --- a/src/glass.h +++ b/src/glass.h @@ -101,6 +101,8 @@ class Glass double dn_dt_abs(double T, double lambdamicron) const; QVector dn_dt_abs(const QVector& vT, double lambdamicron) const; + double delta_n_abs(double T, double lambdamicron) const; + inline void setHasThermalData(bool state); void setThermalData(int n, double val); @@ -135,10 +137,10 @@ class Glass private: double refractiveIndex_abs_Tref(double lambdamicron) const; double refractiveIndex_rel_Tref(double lambdamicron) const; - double refractiveIndex_abs(double lambdamicron) const; - double refractiveIndex_rel(double lambdamicron) const; + double refractiveIndex_abs(double lambdamicron, double T) const; + double refractiveIndex_rel(double lambdamicron, double T) const; QVector refractiveIndex_rel_Tref(const QVector& vLambdamicron) const; - QVector refractiveIndex_rel(const QVector& vLambdamicron) const; + QVector refractiveIndex_rel(const QVector& vLambdamicron, double T) const; /** current temperature */ static double T_;