diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a299a7..c1c0b29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,9 @@ find_package(GLUT REQUIRED) #find GLEW find_package(GLEW REQUIRED) +#find Qwt +find_package(Qwt REQUIRED) + #add Qt OpenGL stuff set(QT_USE_QTOPENGL TRUE) @@ -53,9 +56,10 @@ file(GLOB SRC_CU "*.cu") #set up copying data files configure_file(kPMMA.txt ${CMAKE_CURRENT_BINARY_DIR}/kPMMA.txt @ONLY) configure_file(eta_polystyreneK.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_polystyreneK.txt @ONLY) -configure_file(eta_TolueneK.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_TolueneK.txt @ONLY) -configure_file(eta_TolueneN.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_TolueneN.txt @ONLY) +configure_file(etaToluene.txt ${CMAKE_CURRENT_BINARY_DIR}/etaToluene.txt @ONLY) configure_file(source_midIR.txt ${CMAKE_CURRENT_BINARY_DIR}/source_midIR.txt @ONLY) +configure_file(kPolyethylene.txt ${CMAKE_CURRENT_BINARY_DIR}/kPolyethylene.txt @ONLY) +configure_file(kPTFE.txt ${CMAKE_CURRENT_BINARY_DIR}/kPTFE.txt @ONLY) #determine which source files have to be moc'd Qt4_wrap_cpp(UI_MOC ${SRC_H}) @@ -72,7 +76,4 @@ source_group(QtUI FILES ${SRC_UI}) cuda_add_executable(IMie ${SRC_CPP} ${SRC_H} ${UI_H} ${UI_MOC} ${ALL_RCC} ${SRC_CU}) #set the link libraries -target_link_libraries(IMie ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${GLEW_LIBRARY}) - - - +target_link_libraries(IMie ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${GLEW_LIBRARY} ${QWT_LIBRARY}) \ No newline at end of file diff --git a/EstimateMaterial.cpp b/EstimateMaterial.cpp index 38397de..7850ee7 100644 --- a/EstimateMaterial.cpp +++ b/EstimateMaterial.cpp @@ -1,119 +1,119 @@ -#include "globals.h" -#include -#define PI 3.14159 - -double CalculateError(double* E) -{ - //Calculate the error between the Reference Spectrum and the Simulated Spectrum - double sumE = 0.0; - int nVals = RefSpectrum[currentSpec].size(); - double nu; - for(int i=0; i minMSE && j < maxFitIter) - { - //simulate a spectrum based on the current IR - SimulateSpectrum(); - - //calculate the error term - sumE = CalculateError(E); - - //estimate the new absorbance - EstimateK(E); - - //use Kramers-Kronig to compute n - - for(unsigned int i=0; i +#define PI 3.14159 + +double CalculateError(double* E) +{ + //Calculate the error between the Reference Spectrum and the Simulated Spectrum + double sumE = 0.0; + int nVals = RefSpectrum[currentSpec].size(); + double nu; + for(int i=0; i minMSE && j < maxFitIter) + { + //simulate a spectrum based on the current IR + SimulateSpectrum(); + + //calculate the error term + sumE = CalculateError(E); + + //estimate the new absorbance + EstimateK(E); + + //use Kramers-Kronig to compute n + + for(unsigned int i=0; i LoadSpectrum(string filename) { - //load a spectrum from a file and resample to 2wn intervals - - //create the spectrum - vector S; - - //open the file - ifstream inFile(filename.c_str()); - - //read all elements of the file - SpecPair temp; - while(!inFile.eof()){ - inFile>>temp.nu; - inFile>>temp.A; - S.push_back(temp); - } - - //compute the minimum and maximum input wavenumbers - double inMin = S.front().nu; - double inMax = S.back().nu; - - int nuMin = (int)ceil(inMin); - int nuMax = (int)floor(inMax); - - //make sure both are either even or odd - if(nuMin % 2 != nuMax % 2) - nuMax--; - - //compute the number of values in the resampled spectrum - int nVals = (nuMax - nuMin)/2 + 1; - - //allocate space for the spectrum - vector outSpec; - - double nu, highVal, lowVal, a; - int j=1; - for(int i=0; i inMax) - temp.A = 0.0; - else - { - //move to the correct position in the input array - while(j < (int)S.size()-1 && S[j].nu <= nu) - j++; - - - lowVal = S[j-1].nu; - highVal = S[j].nu; - a = (nu - lowVal)/(highVal - lowVal); - temp.A = S[j-1].A * (1.0 - a) + S[j].A * a; - } - outSpec.push_back(temp); - } - - - - return outSpec; + //load a spectrum from a file and resample to 2wn intervals + + //create the spectrum + vector S; + + //open the file + ifstream inFile(filename.c_str()); + if(!inFile) + { + cout<<"Error loading spectrum: "<>temp.nu; + inFile>>temp.A; + S.push_back(temp); + } + + //compute the minimum and maximum input wavenumbers + double inMin = S.front().nu; + double inMax = S.back().nu; + + int nuMin = (int)ceil(inMin); + int nuMax = (int)floor(inMax); + + //make sure both are either even or odd + if(nuMin % 2 != nuMax % 2) + nuMax--; + + //compute the number of values in the resampled spectrum + int nVals = (nuMax - nuMin)/2 + 1; + + //allocate space for the spectrum + vector outSpec; + + double nu, highVal, lowVal, a; + int j=1; + for(int i=0; i inMax) + temp.A = 0.0; + else + { + //move to the correct position in the input array + while(j < (int)S.size()-1 && S[j].nu <= nu) + j++; + + + lowVal = S[j-1].nu; + highVal = S[j].nu; + a = (nu - lowVal)/(highVal - lowVal); + temp.A = S[j-1].A * (1.0 - a) + S[j].A * a; + } + outSpec.push_back(temp); + } + + + + return outSpec; } vector SetReferenceSpectrum(char* text) { - stringstream inString(text); + stringstream inString(text); - //create the spectrum - vector S; + //create the spectrum + vector S; - SpecPair temp; - while(!inString.eof()){ - inString>>temp.nu; - inString>>temp.A; - S.push_back(temp); - } + SpecPair temp; + while(!inString.eof()) { + inString>>temp.nu; + inString>>temp.A; + S.push_back(temp); + } - return S; + return S; } -void SaveK(string fileName) +/*void SaveK(string fileName) { - ofstream outFile(fileName.c_str()); - for(unsigned int i=0; i>nuMin; - inFile>>nuMax; - inFile>>aMin; - inFile>>aMax; - inFile>>dNu; - - //material parameters - inFile>>radius; - inFile>>baseIR; - inFile>>cA; - - //optical parameters - inFile>>cNAi; - inFile>>cNAo; - inFile>>oNAi; - inFile>>oNAo; - - inFile.close(); + ifstream inFile("main.prj"); + //Window Parameters + inFile>>nuMin; + inFile>>nuMax; + inFile>>aMin; + inFile>>aMax; + inFile>>dNu; + + //material parameters + inFile>>radius; + inFile>>baseIR; + inFile>>cA; + + //optical parameters + inFile>>cNAi; + inFile>>cNAo; + inFile>>oNAi; + inFile>>oNAo; + + inFile.close(); } void SetDefaults() { - nuMin = 800; - nuMax = 4000; - dNu = 2; + nuMin = 800; + nuMax = 4000; + dNu = 2; - aMin = 0; - aMax = 1; + aMin = 0; + aMax = 1; - //material parameters - radius = 4.0f; - baseIR = 1.49f; - cA = 1.0; - vector KMaterial; - vector NMaterial; + //material parameters + radius = 4.0f; + baseIR = 1.49f; + cA = 1.0; + vector KMaterial; + vector NMaterial; - //optical parameters - cNAi = 0.0; - cNAo = 0.6; - oNAi = 0.0; - oNAo = 0.6; -} \ No newline at end of file + //optical parameters + cNAi = 0.0; + cNAo = 0.6; + oNAi = 0.0; + oNAo = 0.6; +} diff --git a/GAMMA.cpp b/GAMMA.cpp index 150eb9c..6318aef 100644 --- a/GAMMA.cpp +++ b/GAMMA.cpp @@ -1,82 +1,83 @@ -// gamma.cpp -- computation of gamma function. -// Algorithms and coefficient values from "Computation of Special -// Functions", Zhang and Jin, John Wiley and Sons, 1996. -// -// (C) 2003, C. Bond. All rights reserved. -// -// Returns gamma function of argument 'x'. -// -// NOTE: Returns 1e308 if argument is a negative integer or 0, -// or if argument exceeds 171. -// -#define _USE_MATH_DEFINES -#include -double gamma(double x) -{ - int i,k,m; - double ga,gr,r,z; - - static double g[] = { - 1.0, - 0.5772156649015329, - -0.6558780715202538, - -0.420026350340952e-1, - 0.1665386113822915, - -0.421977345555443e-1, - -0.9621971527877e-2, - 0.7218943246663e-2, - -0.11651675918591e-2, - -0.2152416741149e-3, - 0.1280502823882e-3, - -0.201348547807e-4, - -0.12504934821e-5, - 0.1133027232e-5, - -0.2056338417e-6, - 0.6116095e-8, - 0.50020075e-8, - -0.11812746e-8, - 0.1043427e-9, - 0.77823e-11, - -0.36968e-11, - 0.51e-12, - -0.206e-13, - -0.54e-14, - 0.14e-14}; - - if (x > 171.0) return 1e308; // This value is an overflow flag. - if (x == (int)x) { - if (x > 0.0) { - ga = 1.0; // use factorial - for (i=2;i 1.0) { - z = fabs(x); - m = (int)z; - r = 1.0; - for (k=1;k<=m;k++) { - r *= (z-k); - } - z -= m; - } - else - z = x; - gr = g[24]; - for (k=23;k>=0;k--) { - gr = gr*z+g[k]; - } - ga = 1.0/(gr*z); - if (fabs(x) > 1.0) { - ga *= r; - if (x < 0.0) { - ga = -M_PI/(x*ga*sin(M_PI*x)); - } - } - } - return ga; -} +// gamma.cpp -- computation of gamma function. +// Algorithms and coefficient values from "Computation of Special +// Functions", Zhang and Jin, John Wiley and Sons, 1996. +// +// (C) 2003, C. Bond. All rights reserved. +// +// Returns gamma function of argument 'x'. +// +// NOTE: Returns 1e308 if argument is a negative integer or 0, +// or if argument exceeds 171. +// +#define _USE_MATH_DEFINES +#include +double gamma(double x) +{ + int i,k,m; + double ga,gr,r,z; + + static double g[] = { + 1.0, + 0.5772156649015329, + -0.6558780715202538, + -0.420026350340952e-1, + 0.1665386113822915, + -0.421977345555443e-1, + -0.9621971527877e-2, + 0.7218943246663e-2, + -0.11651675918591e-2, + -0.2152416741149e-3, + 0.1280502823882e-3, + -0.201348547807e-4, + -0.12504934821e-5, + 0.1133027232e-5, + -0.2056338417e-6, + 0.6116095e-8, + 0.50020075e-8, + -0.11812746e-8, + 0.1043427e-9, + 0.77823e-11, + -0.36968e-11, + 0.51e-12, + -0.206e-13, + -0.54e-14, + 0.14e-14 + }; + + if (x > 171.0) return 1e308; // This value is an overflow flag. + if (x == (int)x) { + if (x > 0.0) { + ga = 1.0; // use factorial + for (i=2; i 1.0) { + z = fabs(x); + m = (int)z; + r = 1.0; + for (k=1; k<=m; k++) { + r *= (z-k); + } + z -= m; + } + else + z = x; + gr = g[24]; + for (k=23; k>=0; k--) { + gr = gr*z+g[k]; + } + ga = 1.0/(gr*z); + if (fabs(x) > 1.0) { + ga *= r; + if (x < 0.0) { + ga = -M_PI/(x*ga*sin(M_PI*x)); + } + } + } + return ga; +} diff --git a/PerformanceData.h b/PerformanceData.h index 9b5684e..933c1f7 100644 --- a/PerformanceData.h +++ b/PerformanceData.h @@ -1,138 +1,174 @@ -// add the following to a cpp file: -// PerformanceData PD; - - -#pragma once -#include -using namespace std; - -enum PerformanceDataType -{ - PD_DISPLAY=0, - PD_SPS, - PD_UNUSED0, - - //my stuff - SIMULATE_SPECTRUM, - SIMULATE_GPU, - KRAMERS_KRONIG, - - - - //end my stuff - PERFORMANCE_DATA_TYPE_COUNT -}; - -static char PDTypeNames[][255] = { - "Display ", - "Simulation Total ", - " ----------------- ", - //my stuff - "Simulate Spectrum ", - " GPU Portion ", - "Kramers-Kronig ", - - //end my stuff - -}; -#ifdef WIN32 -#include -#include -#include - -#include -#include - -//------------------------------------------------------------------------------- - -class PerformanceData -{ -public: - PerformanceData() { ClearAll(); QueryPerformanceFrequency(&cps); } - ~PerformanceData(){} - - void ClearAll() - { - for ( int i=0; i maxTime[type] ) maxTime[type] = t; - totalTime[type] -= times[type][ pos[type] ]; - times[type][ pos[type] ] = t; - totalTime[type] += t; - pos[type]++; - if ( pos[type] == 0 ) dataReady[type] = true; - } - - void PrintResult( ostream &os,int i=PERFORMANCE_DATA_TYPE_COUNT) - { - os.setf(ios::fixed); - if ((i=0)){ - double a = GetAvrgTime(i); - if ( a ) - os<< PDTypeNames[i]<<" : avrg="< +using namespace std; + +enum PerformanceDataType +{ + PD_DISPLAY=0, + PD_SPS, + PD_UNUSED0, + + //my stuff + SIMULATE_SPECTRUM, + SIMULATE_GPU, + KRAMERS_KRONIG, + + + + //end my stuff + PERFORMANCE_DATA_TYPE_COUNT +}; + +static char PDTypeNames[][255] = { + "Display ", + "Simulation Total ", + " ----------------- ", + //my stuff + "Simulate Spectrum ", + " GPU Portion ", + "Kramers-Kronig ", + + //end my stuff + +}; +#ifdef WIN32 +#include +#include +#include + +#include +#include + +//------------------------------------------------------------------------------- + +class PerformanceData +{ +public: + PerformanceData() { + ClearAll(); + QueryPerformanceFrequency(&cps); + } + ~PerformanceData() {} + + void ClearAll() + { + for ( int i=0; i maxTime[type] ) maxTime[type] = t; + totalTime[type] -= times[type][ pos[type] ]; + times[type][ pos[type] ] = t; + totalTime[type] += t; + pos[type]++; + if ( pos[type] == 0 ) dataReady[type] = true; + } + + void PrintResult( ostream &os,int i=PERFORMANCE_DATA_TYPE_COUNT) + { + os.setf(ios::fixed); + if ((i=0)) { + double a = GetAvrgTime(i); + if ( a ) + os<< PDTypeNames[i]<<" : avrg="< -#include -#include -#include -#include "globals.h" -#include -#include -//#include "cufft.h" -using namespace std; - -#define pi 3.14159 - -typedef complex scComplex; - -extern int cbessjyva(double v,complex z,double &vm,complex*cjv, - complex*cyv,complex*cjvp,complex*cyvp); -extern int bessjyv(double v,double x,double &vm,double *jv,double *yv, - double *djv,double *dyv); - -complex Jl_neg(complex x) -{ - //this function computes the bessel function of the first kind Jl(x) for l = -0.5 - return ( sqrt(2.0/pi) * cos(x) )/sqrt(x); -} - -double Jl_neg(double x) -{ - //this function computes the bessel function of the first kind Jl(x) for l = -0.5 - return ( sqrt(2.0/pi) * cos(x) )/sqrt(x); -} - -double Yl_neg(double x) -{ - //this function computes the bessel function of the second kind Yl(x) for l = -0.5; - return ( sqrt(2.0/pi) * sin(x) )/sqrt(x); -} - -void computeB(complex* B, double radius, complex refIndex, double lambda, int Nl) -{ - double k = (2*pi)/lambda; - int b = 2; - - //allocate space for the real bessel functions - double* jv = (double*)malloc(sizeof(double)*(Nl+b)); - double* yv = (double*)malloc(sizeof(double)*(Nl+b)); - double* jvp = (double*)malloc(sizeof(double)*(Nl+b)); - double* yvp = (double*)malloc(sizeof(double)*(Nl+b)); - - //allocate space for the complex bessel functions - complex* cjv = (complex*)malloc(sizeof(complex)*(Nl+b)); - complex* cyv = (complex*)malloc(sizeof(complex)*(Nl+b)); - complex* cjvp = (complex*)malloc(sizeof(complex)*(Nl+b)); - complex* cyvp = (complex*)malloc(sizeof(complex)*(Nl+b)); - - double kr = k*radius; - complex knr = k*refIndex*(double)radius; - complex n = refIndex; - - //compute the bessel functions for k*r - double vm;// = Nl - 1; - bessjyv((Nl)+0.5, kr, vm, jv, yv, jvp, yvp); - //cout<<"Nl: "< scale_knr = sqrt(pi/(2.0*knr)); - - complex numer, denom; - double j_kr; - double y_kr; - complex j_knr; - complex j_d_knr; - double j_d_kr; - complex h_kr; - complex h_d_kr; - complex h_neg; - complex h_pos; - - //cout<<"B coefficients:"<(j_kr, y_kr); - - //compute the derivatives - if(l == 0) - { - //spherical bessel functions for l=0 - j_d_kr = scale_kr * (Jl_neg(kr) - (jv[l] + kr*jv[l+1])/kr )/2.0; - j_d_knr = scale_knr * ( Jl_neg(knr) - (cjv[l] + knr*cjv[l+1])/knr )/2.0; - h_neg = complex(scale_kr*Jl_neg(kr), scale_kr*Yl_neg(kr)); - h_pos = complex(scale_kr*jv[l+1], scale_kr*yv[l+1]); - h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0; - } - else - { - //spherical bessel functions - j_d_kr = scale_kr * (jv[l-1] - (jv[l] + kr*jv[l+1])/kr )/2.0; - j_d_knr = scale_knr * ( cjv[l-1] - (cjv[l] + knr*cjv[l+1])/knr )/2.0; - h_neg = complex(scale_kr*jv[l-1], scale_kr*yv[l-1]); - h_pos = complex(scale_kr*jv[l+1], scale_kr*yv[l+1]); - h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0; - } - - numer = j_kr*j_d_knr*n - j_knr*j_d_kr; - denom = j_knr*h_d_kr - h_kr*j_d_knr*n; - B[l] = numer/denom; - - //B[l] = scComplex(temp.real(), temp.imag()); - //cout< integrateUi(double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi) -{ - /*This function integrates the incident field of magnitude M in the far zone - in order to evaluate the field at the central pixel of a detector. - cNAi = condenser inner angle - cNAo = condenser outer angle - oNAi = objective inner angle - oNAo = objective outer angle - M = field magnitude*/ - - double alphaIn = max(cAngleI, oAngleI); - double alphaOut = min(cAngleO,oAngleO); - - complex Ui; - if(alphaIn > alphaOut) - Ui = complex(0.0, 0.0); - else - Ui = complex(M * 2 * pi * (cos(alphaIn) - cos(alphaOut)), 0.0f); - - return Ui; - -} - -void computeCondenserAlpha(double* alpha, int Nl, double cAngleI, double cAngleO) -{ - /*This function computes the condenser integral in order to build the field of incident light - alpha = list of Nl floating point values representing the condenser alpha as a function of l - Nl = number of orders in the incident field - cAngleI, cAngleO = inner and outer condenser angles (inner and outer NA)*/ - - //compute the Legendre polynomials for the condenser aperature - double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1)); - Legendre(PcNAo, cos(cAngleO), Nl+1); - double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1)); - Legendre(PcNAi, cos(cAngleI), Nl+1); - - for(int l=0; l integrateUs(double r, double lambda, complex eta, - double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi) -{ - /*This function integrates the incident field of magnitude M in the far zone - in order to evaluate the field at the central pixel of a detector. - r = sphere radius - lambda = wavelength - eta = index of refraction - cNAi = condenser inner NA - cNAo = condenser outer NA - oNAi = objective inner NA - oNAo = objective outer NA - M = field magnitude*/ - - //compute the required number of orders - double k = 2*pi/lambda; - int Nl = (int)ceil( k + 4 * exp(log(k*r)/3) + 3 ); - - //compute the material coefficients B - complex* B = (complex*)malloc(sizeof(complex)*Nl); - //compute the Legendre polynomials for the condenser and objective aperatures - double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1)); - Legendre(PcNAo, cos(cAngleO), Nl+1); - double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1)); - Legendre(PcNAi, cos(cAngleI), Nl+1); - - double* PoNAo = (double*)malloc(sizeof(double)*(Nl+1)); - Legendre(PoNAo, cos(oAngleO), Nl+1); - double* PoNAi = (double*)malloc(sizeof(double)*(Nl+1)); - Legendre(PoNAi, cos(oAngleI), Nl+1); - - //store the index of refraction; - complex IR(eta.real(), eta.imag()); - - //compute the scattering coefficients - computeB(B, r, IR, lambda, Nl); - - //aperature terms for the condenser (alpha) and objective (beta) - double alpha; - double beta; - double c; - complex Us(0.0, 0.0); - - for(int l=0; l Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi); - double I0 = Ui.real() * Ui.real() + Ui.imag() * Ui.imag(); - I0 *= scaleI0; - - - - //double I; - SpecPair temp; - double nu; - complex eta; - complex Us, U; - - double vecLen = 0.0; - for(unsigned int i=0; i(EtaN[i].A, EtaK[i].A); - else - eta = complex(baseIR, 0.0); - - - //integrate the scattered field at the detector position - Us = integrateUs(radius, lambda, eta, cAngleI, cAngleO, oAngleI, oAngleO, 2*pi); - U = Us + Ui; - double I = U.real() * U.real() + U.imag() * U.imag(); - - temp.nu = nu; - - //set the spectrum value based on the current display type - if(dispSimType == AbsorbanceSpecType) - temp.A = -log10(I/I0); - else - temp.A = I; - - if(dispNormalize) - vecLen += temp.A * temp.A; - - SimSpectrum.push_back(temp); - } - vecLen = sqrt(vecLen); - - if(dispNormalize) - for(unsigned int i=0; i* B, int Nl, int nLambda) -{ - double nu; - complex eta; - double* Lambda = (double*)malloc(sizeof(double) * nLambda); - - //for each wavenumber nu - for(unsigned int i=0; i(EtaN[i].A, EtaK[i].A); - else - eta = complex(baseIR, 0.0); - - //allocate memory for the scattering coefficients - //complex* B = (complex*)malloc(sizeof(complex)*Nl); - - complex IR(eta.real(), eta.imag()); - computeB(&B[i * Nl], radius, IR, Lambda[i], Nl); - } -} - -void computeOpticalParameters(double& cAngleI, double& cAngleO, double& oAngleI, double& oAngleO, double& I0, double* alpha, int Nl) -{ - computeCassegrainAngles(cAngleI, cAngleO, oAngleI, oAngleO); - - //evaluate the incident field intensity - I0 = 0.0; - complex Ui; - - Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi); - I0 = Ui.real()*2*pi; - - //compute alpha (condenser integral) - computeCondenserAlpha(alpha, Nl, cAngleI, cAngleO); -} - -void gpuDetectorSpectrum(int numSamples) -{ - //integrate across the objective aperature and calculate the resulting intensity on a detector - PD.StartTimer(SIMULATE_SPECTRUM); - //clear the previous spectrum - SimSpectrum.clear(); - - //compute Nl (maximum order of the spectrum) - int Nl = computeNl(); - - double* alpha = (double*)malloc(sizeof(double)*(Nl + 1)); - double cAngleI, cAngleO, oAngleI, oAngleO, I0; - computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl); - - //allocate space for a list of wavelengths - int nLambda = EtaK.size(); - - //allocate space for the 2D array (Nl x nu) of scattering coefficients - complex* B = (complex*)malloc(sizeof(complex) * Nl * nLambda); - computeBArray(B, Nl, nLambda); - - - - //allocate temporary space for the spectrum - double* I = (double*)malloc(sizeof(double) * EtaK.size()); - - //compute the spectrum on the GPU - PD.StartTimer(SIMULATE_GPU); - cudaComputeSpectrum(I, (double*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, numSamples); - PD.EndTimer(SIMULATE_GPU); - - updateSpectrum(I, I0, nLambda); - - PD.EndTimer(SIMULATE_SPECTRUM); - -} - -void SimulateSpectrum() -{ - if(pointDetector) - pointSpectrum(); - else - gpuDetectorSpectrum(objectiveSamples); - //detectorSpectrum(objectiveSamples); -} - -double absorbanceDistortion(){ - - //compute the mean of the spectrum - double sumSim = 0.0; - for(unsigned int i=0; i* B = (complex*)malloc(sizeof(complex) * Nl * nLambda); - computeBArray(B, Nl, nLambda); - - QProgressDialog progress("Computing distortion map...", "Stop", 0, nSteps * nSteps); - progress.setWindowModality(Qt::WindowModal); - - double D; - double e = 0.001; - int i, o; - for(i=0; i= cNAo || cNAi >= oNAo || oNAi >= cNAo || oNAi >= oNAo) - D = -1.0; - else - D = absorbanceDistortion(); - } - else - { - if(cNAi >= cNAo || oNAi >= oNAo) - D = -1.0; - else - D = intensityDistortion(); - } - distortionMap[o * nSteps + i] = D; - outFile< +#include +#include +#include +#include "globals.h" +#include +#include +//#include "cufft.h" +using namespace std; + +#define pi 3.14159 + +typedef complex scComplex; + +extern int cbessjyva(double v,complex z,double &vm,complex*cjv, + complex*cyv,complex*cjvp,complex*cyvp); +extern int bessjyv(double v,double x,double &vm,double *jv,double *yv, + double *djv,double *dyv); + +complex Jl_neg(complex x) +{ + //this function computes the bessel function of the first kind Jl(x) for l = -0.5 + return ( sqrt(2.0/pi) * cos(x) )/sqrt(x); +} + +double Jl_neg(double x) +{ + //this function computes the bessel function of the first kind Jl(x) for l = -0.5 + return ( sqrt(2.0/pi) * cos(x) )/sqrt(x); +} + +double Yl_neg(double x) +{ + //this function computes the bessel function of the second kind Yl(x) for l = -0.5; + return ( sqrt(2.0/pi) * sin(x) )/sqrt(x); +} + +void computeB(complex* B, double radius, complex refIndex, double lambda, int Nl) +{ + double k = (2*pi)/lambda; + int b = 2; + + //allocate space for the real bessel functions + double* jv = (double*)malloc(sizeof(double)*(Nl+b)); + double* yv = (double*)malloc(sizeof(double)*(Nl+b)); + double* jvp = (double*)malloc(sizeof(double)*(Nl+b)); + double* yvp = (double*)malloc(sizeof(double)*(Nl+b)); + + //allocate space for the complex bessel functions + complex* cjv = (complex*)malloc(sizeof(complex)*(Nl+b)); + complex* cyv = (complex*)malloc(sizeof(complex)*(Nl+b)); + complex* cjvp = (complex*)malloc(sizeof(complex)*(Nl+b)); + complex* cyvp = (complex*)malloc(sizeof(complex)*(Nl+b)); + + double kr = k*radius; + complex knr = k*refIndex*(double)radius; + complex n = refIndex; + + //compute the bessel functions for k*r + double vm;// = Nl - 1; + bessjyv((Nl)+0.5, kr, vm, jv, yv, jvp, yvp); + //cout<<"Nl: "< scale_knr = sqrt(pi/(2.0*knr)); + + complex numer, denom; + double j_kr; + double y_kr; + complex j_knr; + complex j_d_knr; + double j_d_kr; + complex h_kr; + complex h_d_kr; + complex h_neg; + complex h_pos; + + //cout<<"B coefficients:"<(j_kr, y_kr); + + //compute the derivatives + if(l == 0) + { + //spherical bessel functions for l=0 + j_d_kr = scale_kr * (Jl_neg(kr) - (jv[l] + kr*jv[l+1])/kr )/2.0; + j_d_knr = scale_knr * ( Jl_neg(knr) - (cjv[l] + knr*cjv[l+1])/knr )/2.0; + h_neg = complex(scale_kr*Jl_neg(kr), scale_kr*Yl_neg(kr)); + h_pos = complex(scale_kr*jv[l+1], scale_kr*yv[l+1]); + h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0; + } + else + { + //spherical bessel functions + j_d_kr = scale_kr * (jv[l-1] - (jv[l] + kr*jv[l+1])/kr )/2.0; + j_d_knr = scale_knr * ( cjv[l-1] - (cjv[l] + knr*cjv[l+1])/knr )/2.0; + h_neg = complex(scale_kr*jv[l-1], scale_kr*yv[l-1]); + h_pos = complex(scale_kr*jv[l+1], scale_kr*yv[l+1]); + h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0; + } + + numer = j_kr*j_d_knr*n - j_knr*j_d_kr; + denom = j_knr*h_d_kr - h_kr*j_d_knr*n; + B[l] = numer/denom; + + //B[l] = scComplex(temp.real(), temp.imag()); + //cout< integrateUi(double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi) +{ + /*This function integrates the incident field of magnitude M in the far zone + in order to evaluate the field at the central pixel of a detector. + cNAi = condenser inner angle + cNAo = condenser outer angle + oNAi = objective inner angle + oNAo = objective outer angle + M = field magnitude*/ + + double alphaIn = max(cAngleI, oAngleI); + double alphaOut = min(cAngleO,oAngleO); + + complex Ui; + if(alphaIn > alphaOut) + Ui = complex(0.0, 0.0); + else + Ui = complex(M * 2 * pi * (cos(alphaIn) - cos(alphaOut)), 0.0f); + + return Ui; + +} + +void computeCondenserAlpha(double* alpha, int Nl, double cAngleI, double cAngleO) +{ + /*This function computes the condenser integral in order to build the field of incident light + alpha = list of Nl floating point values representing the condenser alpha as a function of l + Nl = number of orders in the incident field + cAngleI, cAngleO = inner and outer condenser angles (inner and outer NA)*/ + + //compute the Legendre polynomials for the condenser aperature + double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1)); + Legendre(PcNAo, cos(cAngleO), Nl+1); + double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1)); + Legendre(PcNAi, cos(cAngleI), Nl+1); + + for(int l=0; l integrateUs(double r, double lambda, complex eta, + double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi) +{ + /*This function integrates the incident field of magnitude M in the far zone + in order to evaluate the field at the central pixel of a detector. + r = sphere radius + lambda = wavelength + eta = index of refraction + cNAi = condenser inner NA + cNAo = condenser outer NA + oNAi = objective inner NA + oNAo = objective outer NA + M = field magnitude*/ + + //compute the required number of orders + double k = 2*pi/lambda; + int Nl = (int)ceil( k + 4 * exp(log(k*r)/3) + 3 ); + + //compute the material coefficients B + complex* B = (complex*)malloc(sizeof(complex)*Nl); + //compute the Legendre polynomials for the condenser and objective aperatures + double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1)); + Legendre(PcNAo, cos(cAngleO), Nl+1); + double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1)); + Legendre(PcNAi, cos(cAngleI), Nl+1); + + double* PoNAo = (double*)malloc(sizeof(double)*(Nl+1)); + Legendre(PoNAo, cos(oAngleO), Nl+1); + double* PoNAi = (double*)malloc(sizeof(double)*(Nl+1)); + Legendre(PoNAi, cos(oAngleI), Nl+1); + + //store the index of refraction; + complex IR(eta.real(), eta.imag()); + + //compute the scattering coefficients + computeB(B, r, IR, lambda, Nl); + + //aperature terms for the condenser (alpha) and objective (beta) + double alpha; + double beta; + double c; + complex Us(0.0, 0.0); + + for(int l=0; l Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi); + double I0 = Ui.real() * Ui.real() + Ui.imag() * Ui.imag(); + I0 *= scaleI0; + + + + //double I; + SpecPair temp; + double nu; + complex eta; + complex Us, U; + + double vecLen = 0.0; + for(unsigned int i=0; i(EtaN[i].A, EtaK[i].A); + else + eta = complex(baseIR, 0.0); + + + //integrate the scattered field at the detector position + Us = integrateUs(radius, lambda, eta, cAngleI, cAngleO, oAngleI, oAngleO, 2*pi); + U = Us + Ui; + double I = U.real() * U.real() + U.imag() * U.imag(); + + temp.nu = nu; + + //set the spectrum value based on the current display type + if(dispSimType == AbsorbanceSpecType) + temp.A = -log10(I/I0); + else + temp.A = I; + + if(dispNormalize) + vecLen += temp.A * temp.A; + + SimSpectrum.push_back(temp); + } + vecLen = sqrt(vecLen); + + if(dispNormalize) + for(unsigned int i=0; i* B, int Nl, int nLambda) +{ + double nu; + complex eta; + double* Lambda = (double*)malloc(sizeof(double) * nLambda); + + //for each wavenumber nu + for(unsigned int i=0; i(EtaN[i].A, EtaK[i].A); + else + eta = complex(baseIR, 0.0); + + //allocate memory for the scattering coefficients + //complex* B = (complex*)malloc(sizeof(complex)*Nl); + + complex IR(eta.real(), eta.imag()); + computeB(&B[i * Nl], radius, IR, Lambda[i], Nl); + } +} + +void computeOpticalParameters(double& cAngleI, double& cAngleO, double& oAngleI, double& oAngleO, double& I0, double* alpha, int Nl) +{ + computeCassegrainAngles(cAngleI, cAngleO, oAngleI, oAngleO); + + //evaluate the incident field intensity + I0 = 0.0; + complex Ui; + + Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi); + I0 = Ui.real()*2*pi; + + //compute alpha (condenser integral) + computeCondenserAlpha(alpha, Nl, cAngleI, cAngleO); +} + +void gpuDetectorSpectrum(int numSamples) +{ + //allocate space for a list of wavelengths + int nLambda = EtaK.size(); + if(nLambda == 0) + return; + + //integrate across the objective aperature and calculate the resulting intensity on a detector + PD.StartTimer(SIMULATE_SPECTRUM); + //clear the previous spectrum + SimSpectrum.clear(); + + //compute Nl (maximum order of the spectrum) + int Nl = computeNl(); + + + double* alpha = (double*)malloc(sizeof(double)*(Nl + 1)); + double cAngleI, cAngleO, oAngleI, oAngleO, I0; + computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl); + + + + + + //allocate space for the 2D array (Nl x nu) of scattering coefficients + complex* B = (complex*)malloc(sizeof(complex) * Nl * nLambda); + computeBArray(B, Nl, nLambda); + + + + //allocate temporary space for the spectrum + double* I = (double*)malloc(sizeof(double) * EtaK.size()); + + //compute the spectrum on the GPU + PD.StartTimer(SIMULATE_GPU); + cudaComputeSpectrum(I, (double*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, numSamples); + PD.EndTimer(SIMULATE_GPU); + + updateSpectrum(I, I0, nLambda); + + PD.EndTimer(SIMULATE_SPECTRUM); + +} + +void SimulateSpectrum() +{ + if(pointDetector) + pointSpectrum(); + else + gpuDetectorSpectrum(objectiveSamples); + +} + +double absorbanceDistortion() { + + //compute the mean of the spectrum + double sumSim = 0.0; + for(unsigned int i=0; i* B = (complex*)malloc(sizeof(complex) * Nl * nLambda); + computeBArray(B, Nl, nLambda); + + QProgressDialog progress("Computing distortion map...", "Stop", 0, nSteps * nSteps); + progress.setWindowModality(Qt::WindowModal); + + double D; + double e = 0.001; + int i, o; + for(i=0; i= cNAo || cNAi >= oNAo || oNAi >= cNAo || oNAi >= oNAo) + D = -1.0; + else + D = absorbanceDistortion(); + } + else + { + if(cNAi >= cNAo || oNAi >= oNAo) + D = -1.0; + else + D = intensityDistortion(); + } + distortionMap[o * nSteps + i] = D; + outFile< -#include -using namespace std; -#define eps 1e-15 -#define el 0.5772156649015329 - -int msta1(double x,int mp); -int msta2(double x,int n,int mp); -int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1, - double &j0p,double &j1p,double &y0p,double &y1p); -int bessjy01b(double x,double &j0,double &j1,double &y0,double &y1, - double &j0p,double &j1p,double &y0p,double &y1p); -int bessjyna(int n,double x,int &nm,double *jn,double *yn, - double *jnp,double *ynp); -int bessjynb(int n,double x,int &nm,double *jn,double *yn, - double *jnp,double *ynp); -int bessjyv(double v,double x,double &vm,double *jv,double *yv, - double *jvp,double *yvp); -int bessik01a(double x,double &i0,double &i1,double &k0,double &k1, - double &i0p,double &i1p,double &k0p,double &k1p); -int bessik01b(double x,double &i0,double &i1,double &k0,double &k1, - double &i0p,double &i1p,double &k0p,double &k1p); -int bessikna(int n,double x,int &nm,double *in,double *kn, - double *inp,double *knp); -int bessiknb(int n,double x,int &nm,double *in,double *kn, - double *inp,double *knp); -int bessikv(double v,double x,double &vm,double *iv,double *kv, - double *ivp,double *kvp); -int cbessjy01(complex z,complex &cj0,complex &cj1, - complex &cy0,complex &cy1,complex &cj0p, - complex &cj1p,complex &cy0p,complex &cy1p); -int cbessjyna(int n,complex z,int &nm,complex *cj, - complex *cy,complex *cjp,complex *cyp); -int cbessjynb(int n,complex z,int &nm,complex *cj, - complex *cy,complex *cjp,complex *cyp); -int cbessik01(complexz,complex&ci0,complex&ci1, - complex&ck0,complex&ck1,complex&ci0p, - complex&ci1p,complex&ck0p,complex&ck1p); -int cbessikna(int n,complex z,int &nm,complex *ci, - complex *ck,complex *cip,complex *ckp); -int cbessiknb(int n,complex z,int &nm,complex *ci, - complex *ck,complex *cip,complex *ckp); -int cbessjyva(double v,complex z,double &vm,complex*cjv, - complex*cyv,complex*cjvp,complex*cyvp); -int cbessikv(double v,complexz,double &vm,complex *civ, - complex *ckv,complex *civp,complex *ckvp); - -#endif +#ifndef bessH +#define bessH +#define _USE_MATH_DEFINES +#include +#include +using namespace std; +#define eps 1e-15 +#define el 0.5772156649015329 + +int msta1(double x,int mp); +int msta2(double x,int n,int mp); +int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1, + double &j0p,double &j1p,double &y0p,double &y1p); +int bessjy01b(double x,double &j0,double &j1,double &y0,double &y1, + double &j0p,double &j1p,double &y0p,double &y1p); +int bessjyna(int n,double x,int &nm,double *jn,double *yn, + double *jnp,double *ynp); +int bessjynb(int n,double x,int &nm,double *jn,double *yn, + double *jnp,double *ynp); +int bessjyv(double v,double x,double &vm,double *jv,double *yv, + double *jvp,double *yvp); +int bessik01a(double x,double &i0,double &i1,double &k0,double &k1, + double &i0p,double &i1p,double &k0p,double &k1p); +int bessik01b(double x,double &i0,double &i1,double &k0,double &k1, + double &i0p,double &i1p,double &k0p,double &k1p); +int bessikna(int n,double x,int &nm,double *in,double *kn, + double *inp,double *knp); +int bessiknb(int n,double x,int &nm,double *in,double *kn, + double *inp,double *knp); +int bessikv(double v,double x,double &vm,double *iv,double *kv, + double *ivp,double *kvp); +int cbessjy01(complex z,complex &cj0,complex &cj1, + complex &cy0,complex &cy1,complex &cj0p, + complex &cj1p,complex &cy0p,complex &cy1p); +int cbessjyna(int n,complex z,int &nm,complex *cj, + complex *cy,complex *cjp,complex *cyp); +int cbessjynb(int n,complex z,int &nm,complex *cj, + complex *cy,complex *cjp,complex *cyp); +int cbessik01(complexz,complex&ci0,complex&ci1, + complex&ck0,complex&ck1,complex&ci0p, + complex&ci1p,complex&ck0p,complex&ck1p); +int cbessikna(int n,complex z,int &nm,complex *ci, + complex *ck,complex *cip,complex *ckp); +int cbessiknb(int n,complex z,int &nm,complex *ci, + complex *ck,complex *cip,complex *ckp); +int cbessjyva(double v,complex z,double &vm,complex*cjv, + complex*cyv,complex*cjvp,complex*cyvp); +int cbessikv(double v,complexz,double &vm,complex *civ, + complex *ckv,complex *civp,complex *ckvp); + +#endif diff --git a/bessik.CPP b/bessik.CPP index 322000b..fc70d22 100644 --- a/bessik.CPP +++ b/bessik.CPP @@ -1,487 +1,490 @@ -// bessik.cpp -- computation of modified Bessel functions In, Kn -// and their derivatives. Algorithms and coefficient values from -// "Computation of Special Functions", Zhang and Jin, John -// Wiley and Sons, 1996. -// -// (C) 2003, C. Bond. All rights reserved. -// -#define _USE_MATH_DEFINES -#include -#include "bessel.h" - -double gamma(double x); - -int bessik01a(double x,double &i0,double &i1,double &k0,double &k1, - double &i0p,double &i1p,double &k0p,double &k1p) -{ - double r,x2,ca,cb,ct,ww,w0,xr,xr2; - int k,kz; - static double a[] = { - 0.125, - 7.03125e-2, - 7.32421875e-2, - 1.1215209960938e-1, - 2.2710800170898e-1, - 5.7250142097473e-1, - 1.7277275025845, - 6.0740420012735, - 2.4380529699556e1, - 1.1001714026925e2, - 5.5133589612202e2, - 3.0380905109224e3}; - static double b[] = { - -0.375, - -1.171875e-1, - -1.025390625e-1, - -1.4419555664063e-1, - -2.7757644653320e-1, - -6.7659258842468e-1, - -1.9935317337513, - -6.8839142681099, - -2.7248827311269e1, - -1.2159789187654e2, - -6.0384407670507e2, - -3.3022722944809e3}; - static double a1[] = { - 0.125, - 0.2109375, - 1.0986328125, - 1.1775970458984e1, - 2.1461706161499e2, - 5.9511522710323e3, - 2.3347645606175e5, - 1.2312234987631e7}; - - if (x < 0.0) return 1; - if (x == 0.0) { - i0 = 1.0; - i1 = 0.0; - k0 = 1e308; - k1 = 1e308; - i0p = 0.0; - i1p = 0.5; - k0p = -1e308; - k1p = -1e308; - return 0; - } - x2 = x*x; - if (x <= 18.0) { - i0 = 1.0; - r = 1.0; - for (k=1;k<=50;k++) { - r *= 0.25*x2/(k*k); - i0 += r; - if (fabs(r/i0) < eps) break; - } - i1 = 1.0; - r = 1.0; - for (k=1;k<=50;k++) { - r *= 0.25*x2/(k*(k+1)); - i1 += r; - if (fabs(r/i1) < eps) break; - } - i1 *= 0.5*x; - } - else { - if (x >= 50.0) kz = 7; - else if (x >= 35.0) kz = 9; - else kz = 12; - ca = exp(x)/sqrt(2.0*M_PI*x); - i0 = 1.0; - xr = 1.0/x; - for (k=0;k 40.0) && (n < (int)(0.25*x))) { - h0 = bi0; - h1 = bi1; - for (k=2;k<=n;k++) { - h = -2.0*(k-1.0)*h1/x+h0; - in[k] = h; - h0 = h1; - h1 = h; - } - } - else { - m = msta1(x,200); - if (m < n) nm = m; - else m = msta2(x,n,15); - f0 = 0.0; - f1 = 1.0e-100; - for (k=m;k>=0;k--) { - f = 2.0*(k+1.0)*f1/x+f0; - if (x <= nm) in[k] = f; - f0 = f1; - f1 = f; - } - s0 = bi0/f; - for (k=0;k<=m;k++) { - in[k] *= s0; - } - } - g0 = bk0; - g1 = bk1; - for (k=2;k<=nm;k++) { - g = 2.0*(k-1.0)*g1/x+g0; - kn[k] = g; - g0 = g1; - g1 = g; - } - for (k=2;k<=nm;k++) { - inp[k] = in[k-1]-k*in[k]/x; - knp[k] = -kn[k-1]-k*kn[k]/x; - } - return 0; -} -int bessiknb(int n,double x,int &nm,double *in,double *kn, - double *inp,double *knp) -{ - double s0,bs,f,f0,f1,sk0,a0,bkl,vt,r,g,g0,g1; - int k,kz,m,l; - - if ((x < 0.0) || (n < 0)) return 1; - if (x < eps) { - for (k=0;k<=n;k++) { - in[k] = 0.0; - kn[k] = 1e308; - inp[k] = 0.0; - knp[k] = -1e308; - } - in[0] = 1.0; - inp[1] = 0.5; - return 0; - } - nm = n; - if (n == 0) nm = 1; - m = msta1(x,200); - if (m < nm) nm = m; - else m = msta2(x,nm,15); - bs = 0.0; - sk0 = 0.0; - f0 = 0.0; - f1 = 1.0e-100; - for (k=m;k>=0;k--) { - f = 2.0*(k+1.0)*f1/x+f0; - if (k <= nm) in[k] = f; - if ((k != 0) && (k == 2*(int)(k/2))) { - sk0 += 4.0*f/k; - } - bs += 2.0*f; - f0 = f1; - f1 = f; - } - s0 = exp(x)/(bs-f); - for (k=0;k<=nm;k++) { - in[k] *= s0; - } - if (x <= 8.0) { - kn[0] = -(log(0.5*x)+el)*in[0]+s0*sk0; - kn[1] = (1.0/x-in[1]*kn[0])/in[0]; - } - else { - a0 = sqrt(M_PI_2/x)*exp(-x); - if (x >= 200.0) kz = 6; - else if (x >= 80.0) kz = 8; - else if (x >= 25.0) kz = 10; - else kz = 16; - for (l=0;l<2;l++) { - bkl = 1.0; - vt = 4.0*l; - r = 1.0; - for (k=1;k<=kz;k++) { - r *= 0.125*(vt-pow(2.0*k-1.0,2))/(k*x); - bkl += r; - } - kn[l] = a0*bkl; - } - } - g0 = kn[0]; - g1 = kn[1]; - for (k=2;k<=nm;k++) { - g = 2.0*(k-1.0)*g1/x+g0; - kn[k] = g; - g0 = g1; - g1 = g; - } - inp[0] = in[1]; - knp[0] = -kn[1]; - for (k=1;k<=nm;k++) { - inp[k] = in[k-1]-k*in[k]/x; - knp[k] = -kn[k-1]-k*kn[k]/x; - } - return 0; -} - -// The following program computes the modified Bessel functions -// Iv(x) and Kv(x) for arbitrary positive order. For negative -// order use: -// -// I-v(x) = Iv(x) + 2/pi sin(v pi) Kv(x) -// K-v(x) = Kv(x) -// -int bessikv(double v,double x,double &vm,double *iv,double *kv, - double *ivp,double *kvp) -{ - double x2,v0,piv,vt,a1,v0p,gap,r,bi0,ca,sum; - double f,f1,f2,ct,cs,wa,gan,ww,w0,v0n; - double r1,r2,bk0,bk1,bk2,a2,cb; - int n,k,kz,m; - - if ((v < 0.0) || (x < 0.0)) return 1; - x2 = x*x; - n = (int)v; - v0 = v-n; - if (n == 0) n = 1; - if (x == 0.0) { - for (k=0;k<=n;k++) { - iv[k] = 0.0; - kv[k] = -1e308; - ivp[k] = 0.0; - kvp[k] = 1e308; - } - if (v0 == 0.0) { - iv[0] = 1.0; - ivp[1] = 0.5; - } - vm = v; - return 0; - } - piv = M_PI*v0; - vt = 4.0*v0*v0; - if (v0 == 0.0) { - a1 = 1.0; - } - else { - v0p = 1.0+v0; - gap = gamma(v0p); - a1 = pow(0.5*x,v0)/gap; - } - if (x >= 50.0) kz = 8; - else if (x >= 35.0) kz = 10; - else kz = 14; - if (x <= 18.0) { - bi0 = 1.0; - r = 1.0; - for (k=1;k<=30;k++) { - r *= 0.25*x2/(k*(k+v0)); - bi0 += r; - if (fabs(r/bi0) < eps) break; - } - bi0 *= a1; - } - else { - ca = exp(x)/sqrt(2.0*M_PI*x); - sum = 1.0; - r = 1.0; - for (k=1;k<=kz;k++) { - r *= -0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x); - sum += r; - } - bi0 = ca*sum; - } - m = msta1(x,200); - if (m < n) n = m; - else m = msta2(x,n,15); - f2 = 0.0; - f1 = 1.0e-100; - for (k=m;k>=0;k--) { - f = 2.0*(v0+k+1.0)*f1/x+f2; - if (k <= n) iv[k] = f; - f2 = f1; - f1 = f; - } - cs = bi0/f; - for (k=0;k<=n;k++) { - iv[k] *= cs; - } - ivp[0] = v0*iv[0]/x+iv[1]; - for (k=1;k<=n;k++) { - ivp[k] = -(k+v0)*iv[k]/x+iv[k-1]; - } - ww = 0.0; - if (x <= 9.0) { - if (v0 == 0.0) { - ct = -log(0.5*x)-el; - cs = 0.0; - w0 = 0.0; - r = 1.0; - for (k=1;k<=50;k++) { - w0 += 1.0/k; - r *= 0.25*x2/(k*k); - cs += r*(w0+ct); - wa = fabs(cs); - if (fabs((wa-ww)/wa) < eps) break; - ww = wa; - } - bk0 = ct+cs; - } - else { - v0n = 1.0-v0; - gan = gamma(v0n); - a2 = 1.0/(gan*pow(0.5*x,v0)); - a1 = pow(0.5*x,v0)/gap; - sum = a2-a1; - r1 = 1.0; - r2 = 1.0; - for (k=1;k<=120;k++) { - r1 *= 0.25*x2/(k*(k-v0)); - r2 *= 0.25*x2/(k*(k+v0)); - sum += a2*r1-a1*r2; - wa = fabs(sum); - if (fabs((wa-ww)/wa) < eps) break; - ww = wa; - } - bk0 = M_PI_2*sum/sin(piv); - } - } - else { - cb = exp(-x)*sqrt(M_PI_2/x); - sum = 1.0; - r = 1.0; - for (k=1;k<=kz;k++) { - r *= 0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x); - sum += r; - } - bk0 = cb*sum; - } - bk1 = (1.0/x-iv[1]*bk0)/iv[0]; - kv[0] = bk0; - kv[1] = bk1; - for (k=2;k<=n;k++) { - bk2 = 2.0*(v0+k-1.0)*bk1/x+bk0; - kv[k] = bk2; - bk0 = bk1; - bk1 = bk2; - } - kvp[0] = v0*kv[0]/x-kv[1]; - for (k=1;k<=n;k++) { - kvp[k] = -(k+v0)*kv[k]/x-kv[k-1]; - } - vm = n+v0; - return 0; -} +// bessik.cpp -- computation of modified Bessel functions In, Kn +// and their derivatives. Algorithms and coefficient values from +// "Computation of Special Functions", Zhang and Jin, John +// Wiley and Sons, 1996. +// +// (C) 2003, C. Bond. All rights reserved. +// +#define _USE_MATH_DEFINES +#include +#include "bessel.h" + +double gamma(double x); + +int bessik01a(double x,double &i0,double &i1,double &k0,double &k1, + double &i0p,double &i1p,double &k0p,double &k1p) +{ + double r,x2,ca,cb,ct,ww,w0,xr,xr2; + int k,kz; + static double a[] = { + 0.125, + 7.03125e-2, + 7.32421875e-2, + 1.1215209960938e-1, + 2.2710800170898e-1, + 5.7250142097473e-1, + 1.7277275025845, + 6.0740420012735, + 2.4380529699556e1, + 1.1001714026925e2, + 5.5133589612202e2, + 3.0380905109224e3 + }; + static double b[] = { + -0.375, + -1.171875e-1, + -1.025390625e-1, + -1.4419555664063e-1, + -2.7757644653320e-1, + -6.7659258842468e-1, + -1.9935317337513, + -6.8839142681099, + -2.7248827311269e1, + -1.2159789187654e2, + -6.0384407670507e2, + -3.3022722944809e3 + }; + static double a1[] = { + 0.125, + 0.2109375, + 1.0986328125, + 1.1775970458984e1, + 2.1461706161499e2, + 5.9511522710323e3, + 2.3347645606175e5, + 1.2312234987631e7 + }; + + if (x < 0.0) return 1; + if (x == 0.0) { + i0 = 1.0; + i1 = 0.0; + k0 = 1e308; + k1 = 1e308; + i0p = 0.0; + i1p = 0.5; + k0p = -1e308; + k1p = -1e308; + return 0; + } + x2 = x*x; + if (x <= 18.0) { + i0 = 1.0; + r = 1.0; + for (k=1; k<=50; k++) { + r *= 0.25*x2/(k*k); + i0 += r; + if (fabs(r/i0) < eps) break; + } + i1 = 1.0; + r = 1.0; + for (k=1; k<=50; k++) { + r *= 0.25*x2/(k*(k+1)); + i1 += r; + if (fabs(r/i1) < eps) break; + } + i1 *= 0.5*x; + } + else { + if (x >= 50.0) kz = 7; + else if (x >= 35.0) kz = 9; + else kz = 12; + ca = exp(x)/sqrt(2.0*M_PI*x); + i0 = 1.0; + xr = 1.0/x; + for (k=0; k 40.0) && (n < (int)(0.25*x))) { + h0 = bi0; + h1 = bi1; + for (k=2; k<=n; k++) { + h = -2.0*(k-1.0)*h1/x+h0; + in[k] = h; + h0 = h1; + h1 = h; + } + } + else { + m = msta1(x,200); + if (m < n) nm = m; + else m = msta2(x,n,15); + f0 = 0.0; + f1 = 1.0e-100; + for (k=m; k>=0; k--) { + f = 2.0*(k+1.0)*f1/x+f0; + if (x <= nm) in[k] = f; + f0 = f1; + f1 = f; + } + s0 = bi0/f; + for (k=0; k<=m; k++) { + in[k] *= s0; + } + } + g0 = bk0; + g1 = bk1; + for (k=2; k<=nm; k++) { + g = 2.0*(k-1.0)*g1/x+g0; + kn[k] = g; + g0 = g1; + g1 = g; + } + for (k=2; k<=nm; k++) { + inp[k] = in[k-1]-k*in[k]/x; + knp[k] = -kn[k-1]-k*kn[k]/x; + } + return 0; +} +int bessiknb(int n,double x,int &nm,double *in,double *kn, + double *inp,double *knp) +{ + double s0,bs,f,f0,f1,sk0,a0,bkl,vt,r,g,g0,g1; + int k,kz,m,l; + + if ((x < 0.0) || (n < 0)) return 1; + if (x < eps) { + for (k=0; k<=n; k++) { + in[k] = 0.0; + kn[k] = 1e308; + inp[k] = 0.0; + knp[k] = -1e308; + } + in[0] = 1.0; + inp[1] = 0.5; + return 0; + } + nm = n; + if (n == 0) nm = 1; + m = msta1(x,200); + if (m < nm) nm = m; + else m = msta2(x,nm,15); + bs = 0.0; + sk0 = 0.0; + f0 = 0.0; + f1 = 1.0e-100; + for (k=m; k>=0; k--) { + f = 2.0*(k+1.0)*f1/x+f0; + if (k <= nm) in[k] = f; + if ((k != 0) && (k == 2*(int)(k/2))) { + sk0 += 4.0*f/k; + } + bs += 2.0*f; + f0 = f1; + f1 = f; + } + s0 = exp(x)/(bs-f); + for (k=0; k<=nm; k++) { + in[k] *= s0; + } + if (x <= 8.0) { + kn[0] = -(log(0.5*x)+el)*in[0]+s0*sk0; + kn[1] = (1.0/x-in[1]*kn[0])/in[0]; + } + else { + a0 = sqrt(M_PI_2/x)*exp(-x); + if (x >= 200.0) kz = 6; + else if (x >= 80.0) kz = 8; + else if (x >= 25.0) kz = 10; + else kz = 16; + for (l=0; l<2; l++) { + bkl = 1.0; + vt = 4.0*l; + r = 1.0; + for (k=1; k<=kz; k++) { + r *= 0.125*(vt-pow(2.0*k-1.0,2))/(k*x); + bkl += r; + } + kn[l] = a0*bkl; + } + } + g0 = kn[0]; + g1 = kn[1]; + for (k=2; k<=nm; k++) { + g = 2.0*(k-1.0)*g1/x+g0; + kn[k] = g; + g0 = g1; + g1 = g; + } + inp[0] = in[1]; + knp[0] = -kn[1]; + for (k=1; k<=nm; k++) { + inp[k] = in[k-1]-k*in[k]/x; + knp[k] = -kn[k-1]-k*kn[k]/x; + } + return 0; +} + +// The following program computes the modified Bessel functions +// Iv(x) and Kv(x) for arbitrary positive order. For negative +// order use: +// +// I-v(x) = Iv(x) + 2/pi sin(v pi) Kv(x) +// K-v(x) = Kv(x) +// +int bessikv(double v,double x,double &vm,double *iv,double *kv, + double *ivp,double *kvp) +{ + double x2,v0,piv,vt,a1,v0p,gap,r,bi0,ca,sum; + double f,f1,f2,ct,cs,wa,gan,ww,w0,v0n; + double r1,r2,bk0,bk1,bk2,a2,cb; + int n,k,kz,m; + + if ((v < 0.0) || (x < 0.0)) return 1; + x2 = x*x; + n = (int)v; + v0 = v-n; + if (n == 0) n = 1; + if (x == 0.0) { + for (k=0; k<=n; k++) { + iv[k] = 0.0; + kv[k] = -1e308; + ivp[k] = 0.0; + kvp[k] = 1e308; + } + if (v0 == 0.0) { + iv[0] = 1.0; + ivp[1] = 0.5; + } + vm = v; + return 0; + } + piv = M_PI*v0; + vt = 4.0*v0*v0; + if (v0 == 0.0) { + a1 = 1.0; + } + else { + v0p = 1.0+v0; + gap = gamma(v0p); + a1 = pow(0.5*x,v0)/gap; + } + if (x >= 50.0) kz = 8; + else if (x >= 35.0) kz = 10; + else kz = 14; + if (x <= 18.0) { + bi0 = 1.0; + r = 1.0; + for (k=1; k<=30; k++) { + r *= 0.25*x2/(k*(k+v0)); + bi0 += r; + if (fabs(r/bi0) < eps) break; + } + bi0 *= a1; + } + else { + ca = exp(x)/sqrt(2.0*M_PI*x); + sum = 1.0; + r = 1.0; + for (k=1; k<=kz; k++) { + r *= -0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x); + sum += r; + } + bi0 = ca*sum; + } + m = msta1(x,200); + if (m < n) n = m; + else m = msta2(x,n,15); + f2 = 0.0; + f1 = 1.0e-100; + for (k=m; k>=0; k--) { + f = 2.0*(v0+k+1.0)*f1/x+f2; + if (k <= n) iv[k] = f; + f2 = f1; + f1 = f; + } + cs = bi0/f; + for (k=0; k<=n; k++) { + iv[k] *= cs; + } + ivp[0] = v0*iv[0]/x+iv[1]; + for (k=1; k<=n; k++) { + ivp[k] = -(k+v0)*iv[k]/x+iv[k-1]; + } + ww = 0.0; + if (x <= 9.0) { + if (v0 == 0.0) { + ct = -log(0.5*x)-el; + cs = 0.0; + w0 = 0.0; + r = 1.0; + for (k=1; k<=50; k++) { + w0 += 1.0/k; + r *= 0.25*x2/(k*k); + cs += r*(w0+ct); + wa = fabs(cs); + if (fabs((wa-ww)/wa) < eps) break; + ww = wa; + } + bk0 = ct+cs; + } + else { + v0n = 1.0-v0; + gan = gamma(v0n); + a2 = 1.0/(gan*pow(0.5*x,v0)); + a1 = pow(0.5*x,v0)/gap; + sum = a2-a1; + r1 = 1.0; + r2 = 1.0; + for (k=1; k<=120; k++) { + r1 *= 0.25*x2/(k*(k-v0)); + r2 *= 0.25*x2/(k*(k+v0)); + sum += a2*r1-a1*r2; + wa = fabs(sum); + if (fabs((wa-ww)/wa) < eps) break; + ww = wa; + } + bk0 = M_PI_2*sum/sin(piv); + } + } + else { + cb = exp(-x)*sqrt(M_PI_2/x); + sum = 1.0; + r = 1.0; + for (k=1; k<=kz; k++) { + r *= 0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x); + sum += r; + } + bk0 = cb*sum; + } + bk1 = (1.0/x-iv[1]*bk0)/iv[0]; + kv[0] = bk0; + kv[1] = bk1; + for (k=2; k<=n; k++) { + bk2 = 2.0*(v0+k-1.0)*bk1/x+bk0; + kv[k] = bk2; + bk0 = bk1; + bk1 = bk2; + } + kvp[0] = v0*kv[0]/x-kv[1]; + for (k=1; k<=n; k++) { + kvp[k] = -(k+v0)*kv[k]/x-kv[k-1]; + } + vm = n+v0; + return 0; +} diff --git a/bessjy.cpp b/bessjy.cpp index 8a9f22f..33be752 100644 --- a/bessjy.cpp +++ b/bessjy.cpp @@ -1,706 +1,714 @@ -// bessjy.cpp -- computation of Bessel functions Jn, Yn and their -// derivatives. Algorithms and coefficient values from -// "Computation of Special Functions", Zhang and Jin, John -// Wiley and Sons, 1996. -// -// (C) 2003, C. Bond. All rights reserved. -// -// Note that 'math.h' provides (or should provide) values for: -// pi M_PI -// 2/pi M_2_PI -// pi/4 M_PI_4 -// pi/2 M_PI_2 -// -#define _USE_MATH_DEFINES -#include -#include "bessel.h" - -double gamma(double x); -// -// INPUT: -// double x -- argument of Bessel function -// -// OUTPUT (via address pointers): -// double j0 -- Bessel function of 1st kind, 0th order -// double j1 -- Bessel function of 1st kind, 1st order -// double y0 -- Bessel function of 2nd kind, 0th order -// double y1 -- Bessel function of 2nd kind, 1st order -// double j0p -- derivative of Bessel function of 1st kind, 0th order -// double j1p -- derivative of Bessel function of 1st kind, 1st order -// double y0p -- derivative of Bessel function of 2nd kind, 0th order -// double y1p -- derivative of Bessel function of 2nd kind, 1st order -// -// RETURN: -// int error code: 0 = OK, 1 = error -// -// This algorithm computes the above functions using series expansions. -// -int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1, - double &j0p,double &j1p,double &y0p,double &y1p) -{ - double x2,r,ec,w0,w1,r0,r1,cs0,cs1; - double cu,p0,q0,p1,q1,t1,t2; - int k,kz; - static double a[] = { - -7.03125e-2, - 0.112152099609375, - -0.5725014209747314, - 6.074042001273483, - -1.100171402692467e2, - 3.038090510922384e3, - -1.188384262567832e5, - 6.252951493434797e6, - -4.259392165047669e8, - 3.646840080706556e10, - -3.833534661393944e12, - 4.854014686852901e14, - -7.286857349377656e16, - 1.279721941975975e19}; - static double b[] = { - 7.32421875e-2, - -0.2271080017089844, - 1.727727502584457, - -2.438052969955606e1, - 5.513358961220206e2, - -1.825775547429318e4, - 8.328593040162893e5, - -5.006958953198893e7, - 3.836255180230433e9, - -3.649010818849833e11, - 4.218971570284096e13, - -5.827244631566907e15, - 9.476288099260110e17, - -1.792162323051699e20}; - static double a1[] = { - 0.1171875, - -0.1441955566406250, - 0.6765925884246826, - -6.883914268109947, - 1.215978918765359e2, - -3.302272294480852e3, - 1.276412726461746e5, - -6.656367718817688e6, - 4.502786003050393e8, - -3.833857520742790e10, - 4.011838599133198e12, - -5.060568503314727e14, - 7.572616461117958e16, - -1.326257285320556e19}; - static double b1[] = { - -0.1025390625, - 0.2775764465332031, - -1.993531733751297, - 2.724882731126854e1, - -6.038440767050702e2, - 1.971837591223663e4, - -8.902978767070678e5, - 5.310411010968522e7, - -4.043620325107754e9, - 3.827011346598605e11, - -4.406481417852278e13, - 6.065091351222699e15, - -9.833883876590679e17, - 1.855045211579828e20}; - - if (x < 0.0) return 1; - if (x == 0.0) { - j0 = 1.0; - j1 = 0.0; - y0 = -1e308; - y1 = -1e308; - j0p = 0.0; - j1p = 0.5; - y0p = 1e308; - y1p = 1e308; - return 0; - } - x2 = x*x; - if (x <= 12.0) { - j0 = 1.0; - r = 1.0; - for (k=1;k<=30;k++) { - r *= -0.25*x2/(k*k); - j0 += r; - if (fabs(r) < fabs(j0)*1e-15) break; - } - j1 = 1.0; - r = 1.0; - for (k=1;k<=30;k++) { - r *= -0.25*x2/(k*(k+1)); - j1 += r; - if (fabs(r) < fabs(j1)*1e-15) break; - } - j1 *= 0.5*x; - ec = log(0.5*x)+el; - cs0 = 0.0; - w0 = 0.0; - r0 = 1.0; - for (k=1;k<=30;k++) { - w0 += 1.0/k; - r0 *= -0.25*x2/(k*k); - r = r0 * w0; - cs0 += r; - if (fabs(r) < fabs(cs0)*1e-15) break; - } - y0 = M_2_PI*(ec*j0-cs0); - cs1 = 1.0; - w1 = 0.0; - r1 = 1.0; - for (k=1;k<=30;k++) { - w1 += 1.0/k; - r1 *= -0.25*x2/(k*(k+1)); - r = r1*(2.0*w1+1.0/(k+1)); - cs1 += r; - if (fabs(r) < fabs(cs1)*1e-15) break; - } - y1 = M_2_PI * (ec*j1-1.0/x-0.25*x*cs1); - } - else { - if (x >= 50.0) kz = 8; // Can be changed to 10 - else if (x >= 35.0) kz = 10; // " " 12 - else kz = 12; // " " 14 - t1 = x-M_PI_4; - p0 = 1.0; - q0 = -0.125/x; - for (k=0;k=0;k--) { - f = 2.0*(k+1.0)/x*f1-f2; - if (k <= nm) jn[k] = f; - f2 = f1; - f1 = f; - } - if (fabs(bj0) > fabs(bj1)) cs = bj0/f; - else cs = bj1/f2; - for (k=0;k<=nm;k++) { - jn[k] *= cs; - } - } - for (k=2;k<=nm;k++) { - jnp[k] = jn[k-1]-k*jn[k]/x; - } - f0 = yn[0]; - f1 = yn[1]; - for (k=2;k<=nm;k++) { - f = 2.0*(k-1.0)*f1/x-f0; - yn[k] = f; - f0 = f1; - f1 = f; - } - for (k=2;k<=nm;k++) { - ynp[k] = yn[k-1]-k*yn[k]/x; - } - return 0; -} -// -// Same input and output conventions as above. Different recurrence -// relations used for 'x' < 300. -// -int bessjynb(int n,double x,int &nm,double *jn,double *yn, - double *jnp,double *ynp) -{ - double t1,t2,f,f1,f2,bj0,bj1,bjk,by0,by1,cu,s0,su,sv; - double ec,bs,byk,p0,p1,q0,q1; - static double a[] = { - -0.7031250000000000e-1, - 0.1121520996093750, - -0.5725014209747314, - 6.074042001273483}; - static double b[] = { - 0.7324218750000000e-1, - -0.2271080017089844, - 1.727727502584457, - -2.438052969955606e1}; - static double a1[] = { - 0.1171875, - -0.1441955566406250, - 0.6765925884246826, - -6.883914268109947}; - static double b1[] = { - -0.1025390625, - 0.2775764465332031, - -1.993531733751297, - 2.724882731126854e1}; - - int i,k,m; - nm = n; - if ((x < 0.0) || (n < 0)) return 1; - if (x < 1e-15) { - for (i=0;i<=n;i++) { - jn[i] = 0.0; - yn[i] = -1e308; - jnp[i] = 0.0; - ynp[i] = 1e308; - } - jn[0] = 1.0; - jnp[1] = 0.5; - return 0; - } - if (x <= 300.0 || n > (int)(0.9*x)) { - if (n == 0) nm = 1; - m = msta1(x,200); - if (m < nm) nm = m; - else m = msta2(x,nm,15); - bs = 0.0; - su = 0.0; - sv = 0.0; - f2 = 0.0; - f1 = 1.0e-100; - for (k = m;k>=0;k--) { - f = 2.0*(k+1.0)/x*f1 - f2; - if (k <= nm) jn[k] = f; - if ((k == 2*(int)(k/2)) && (k != 0)) { - bs += 2.0*f; -// su += pow(-1,k>>1)*f/(double)k; - su += (-1)*((k & 2)-1)*f/(double)k; - } - else if (k > 1) { -// sv += pow(-1,k>>1)*k*f/(k*k-1.0); - sv += (-1)*((k & 2)-1)*(double)k*f/(k*k-1.0); - } - f2 = f1; - f1 = f; - } - s0 = bs+f; - for (k=0;k<=nm;k++) { - jn[k] /= s0; - } - ec = log(0.5*x) +0.5772156649015329; - by0 = M_2_PI*(ec*jn[0]-4.0*su/s0); - yn[0] = by0; - by1 = M_2_PI*((ec-1.0)*jn[1]-jn[0]/x-4.0*sv/s0); - yn[1] = by1; - } - else { - t1 = x-M_PI_4; - p0 = 1.0; - q0 = -0.125/x; - for (k=0;k<4;k++) { - p0 += a[k]*pow(x,-2*k-2); - q0 += b[k]*pow(x,-2*k-3); - } - cu = sqrt(M_2_PI/x); - bj0 = cu*(p0*cos(t1)-q0*sin(t1)); - by0 = cu*(p0*sin(t1)+q0*cos(t1)); - jn[0] = bj0; - yn[0] = by0; - t2 = x-0.75*M_PI; - p1 = 1.0; - q1 = 0.375/x; - for (k=0;k<4;k++) { - p1 += a1[k]*pow(x,-2*k-2); - q1 += b1[k]*pow(x,-2*k-3); - } - bj1 = cu*(p1*cos(t2)-q1*sin(t2)); - by1 = cu*(p1*sin(t2)+q1*cos(t2)); - jn[1] = bj1; - yn[1] = by1; - for (k=2;k<=nm;k++) { - bjk = 2.0*(k-1.0)*bj1/x-bj0; - jn[k] = bjk; - bj0 = bj1; - bj1 = bjk; - } - } - jnp[0] = -jn[1]; - for (k=1;k<=nm;k++) { - jnp[k] = jn[k-1]-k*jn[k]/x; - } - for (k=2;k<=nm;k++) { - byk = 2.0*(k-1.0)*by1/x-by0; - yn[k] = byk; - by0 = by1; - by1 = byk; - } - ynp[0] = -yn[1]; - for (k=1;k<=nm;k++) { - ynp[k] = yn[k-1]-k*yn[k]/x; - } - return 0; - -} - -// The following routine computes Bessel Jv(x) and Yv(x) for -// arbitrary positive order (v). For negative order, use: -// -// J-v(x) = Jv(x)cos(v pi) - Yv(x)sin(v pi) -// Y-v(x) = Jv(x)sin(v pi) + Yv(x)cos(v pi) -// -int bessjyv(double v,double x,double &vm,double *jv,double *yv, - double *djv,double *dyv) -{ - double v0,vl,vg,vv,a,a0,r,x2,bjv0,bjv1,bjvl,f,f0,f1,f2; - double r0,r1,ck,cs,cs0,cs1,sk,qx,px,byv0,byv1,rp,xk,rq; - double b,ec,w0,w1,bju0,bju1,pv0,pv1,byvk; - int j,k,l,m,n,kz; - - x2 = x*x; - n = (int)v; - v0 = v-n; - if ((x < 0.0) || (v < 0.0)) return 1; - if (x < 1e-15) { - for (k=0;k<=n;k++) { - jv[k] = 0.0; - yv[k] = -1e308; - djv[k] = 0.0; - dyv[k] = 1e308; - if (v0 == 0.0) { - jv[0] = 1.0; - djv[1] = 0.5; - } - else djv[0] = 1e308; - } - vm = v; - return 0; - } - if (x <= 12.0) { - for (l=0;l<2;l++) { - vl = v0 + l; - bjvl = 1.0; - r = 1.0; - for (k=1;k<=40;k++) { - r *= -0.25*x2/(k*(k+vl)); - bjvl += r; - if (fabs(r) < fabs(bjvl)*1e-15) break; - } - vg = 1.0 + vl; - a = pow(0.5*x,vl)/gamma(vg); - if (l == 0) bjv0 = bjvl*a; - else bjv1 = bjvl*a; - } - } - else { - if (x >= 50.0) kz = 8; - else if (x >= 35.0) kz = 10; - else kz = 11; - for (j=0;j<2;j++) { - vv = 4.0*(j+v0)*(j+v0); - px = 1.0; - rp = 1.0; - for (k=1;k<=kz;k++) { - rp *= (-0.78125e-2)*(vv-pow(4.0*k-3.0,2.0))* - (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*x2); - px += rp; - } - qx = 1.0; - rq = 1.0; - for (k=1;k<=kz;k++) { - rq *= (-0.78125e-2)*(vv-pow(4.0*k-1.0,2.0))* - (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*x2); - qx += rq; - } - qx *= 0.125*(vv-1.0)/x; - xk = x-(0.5*(j+v0)+0.25)*M_PI; - a0 = sqrt(M_2_PI/x); - ck = cos(xk); - sk = sin(xk); - - if (j == 0) { - bjv0 = a0*(px*ck-qx*sk); - byv0 = a0*(px*sk+qx*ck); - } - else if (j == 1) { - bjv1 = a0*(px*ck-qx*sk); - byv1 = a0*(px*sk+qx*ck); - } - } - } - jv[0] = bjv0; - jv[1] = bjv1; - djv[0] = v0*jv[0]/x-jv[1]; - djv[1] = -(1.0+v0)*jv[1]/x+jv[0]; - if ((n >= 2) && (n <= (int)(0.9*x))) { - f0 = bjv0; - f1 = bjv1; - for (k=2;k<=n;k++) { - f = 2.0*(k+v0-1.0)*f1/x-f0; - jv[k] = f; - f0 = f1; - f1 = f; - } - } - else if (n >= 2) { - m = msta1(x,200); - if (m < n) n = m; - else m = msta2(x,n,15); - f2 = 0.0; - f1 = 1.0e-100; - for (k=m;k>=0;k--) { - f = 2.0*(v0+k+1.0)*f1/x-f2; - if (k <= n) jv[k] = f; - f2 = f1; - f1 = f; - } - if (fabs(bjv0) > fabs(bjv1)) cs = bjv0/f; - else cs = bjv1/f2; - for (k=0;k<=n;k++) { - jv[k] *= cs; - } - } - for (k=2;k<=n;k++) { - djv[k] = -(k+v0)*jv[k]/x+jv[k-1]; - } - if (x <= 12.0) { - if (v0 != 0.0) { - for (l=0;l<2;l++) { - vl = v0 +l; - bjvl = 1.0; - r = 1.0; - for (k=1;k<=40;k++) { - r *= -0.25*x2/(k*(k-vl)); - bjvl += r; - if (fabs(r) < fabs(bjvl)*1e-15) break; - } - vg = 1.0-vl; - b = pow(2.0/x,vl)/gamma(vg); - if (l == 0) bju0 = bjvl*b; - else bju1 = bjvl*b; - } - pv0 = M_PI*v0; - pv1 = M_PI*(1.0+v0); - byv0 = (bjv0*cos(pv0)-bju0)/sin(pv0); - byv1 = (bjv1*cos(pv1)-bju1)/sin(pv1); - } - else { - ec = log(0.5*x)+el; - cs0 = 0.0; - w0 = 0.0; - r0 = 1.0; - for (k=1;k<=30;k++) { - w0 += 1.0/k; - r0 *= -0.25*x2/(k*k); - cs0 += r0*w0; - } - byv0 = M_2_PI*(ec*bjv0-cs0); - cs1 = 1.0; - w1 = 0.0; - r1 = 1.0; - for (k=1;k<=30;k++) { - w1 += 1.0/k; - r1 *= -0.25*x2/(k*(k+1)); - cs1 += r1*(2.0*w1+1.0/(k+1.0)); - } - byv1 = M_2_PI*(ec*bjv1-1.0/x-0.25*x*cs1); - } - } - yv[0] = byv0; - yv[1] = byv1; - for (k=2;k<=n;k++) { - byvk = 2.0*(v0+k-1.0)*byv1/x-byv0; - yv[k] = byvk; - byv0 = byv1; - byv1 = byvk; - } - dyv[0] = v0*yv[0]/x-yv[1]; - for (k=1;k<=n;k++) { - dyv[k] = -(k+v0)*yv[k]/x+yv[k-1]; - } - vm = n + v0; - return 0; -} - +// bessjy.cpp -- computation of Bessel functions Jn, Yn and their +// derivatives. Algorithms and coefficient values from +// "Computation of Special Functions", Zhang and Jin, John +// Wiley and Sons, 1996. +// +// (C) 2003, C. Bond. All rights reserved. +// +// Note that 'math.h' provides (or should provide) values for: +// pi M_PI +// 2/pi M_2_PI +// pi/4 M_PI_4 +// pi/2 M_PI_2 +// +#define _USE_MATH_DEFINES +#include +#include "bessel.h" + +double gamma(double x); +// +// INPUT: +// double x -- argument of Bessel function +// +// OUTPUT (via address pointers): +// double j0 -- Bessel function of 1st kind, 0th order +// double j1 -- Bessel function of 1st kind, 1st order +// double y0 -- Bessel function of 2nd kind, 0th order +// double y1 -- Bessel function of 2nd kind, 1st order +// double j0p -- derivative of Bessel function of 1st kind, 0th order +// double j1p -- derivative of Bessel function of 1st kind, 1st order +// double y0p -- derivative of Bessel function of 2nd kind, 0th order +// double y1p -- derivative of Bessel function of 2nd kind, 1st order +// +// RETURN: +// int error code: 0 = OK, 1 = error +// +// This algorithm computes the above functions using series expansions. +// +int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1, + double &j0p,double &j1p,double &y0p,double &y1p) +{ + double x2,r,ec,w0,w1,r0,r1,cs0,cs1; + double cu,p0,q0,p1,q1,t1,t2; + int k,kz; + static double a[] = { + -7.03125e-2, + 0.112152099609375, + -0.5725014209747314, + 6.074042001273483, + -1.100171402692467e2, + 3.038090510922384e3, + -1.188384262567832e5, + 6.252951493434797e6, + -4.259392165047669e8, + 3.646840080706556e10, + -3.833534661393944e12, + 4.854014686852901e14, + -7.286857349377656e16, + 1.279721941975975e19 + }; + static double b[] = { + 7.32421875e-2, + -0.2271080017089844, + 1.727727502584457, + -2.438052969955606e1, + 5.513358961220206e2, + -1.825775547429318e4, + 8.328593040162893e5, + -5.006958953198893e7, + 3.836255180230433e9, + -3.649010818849833e11, + 4.218971570284096e13, + -5.827244631566907e15, + 9.476288099260110e17, + -1.792162323051699e20 + }; + static double a1[] = { + 0.1171875, + -0.1441955566406250, + 0.6765925884246826, + -6.883914268109947, + 1.215978918765359e2, + -3.302272294480852e3, + 1.276412726461746e5, + -6.656367718817688e6, + 4.502786003050393e8, + -3.833857520742790e10, + 4.011838599133198e12, + -5.060568503314727e14, + 7.572616461117958e16, + -1.326257285320556e19 + }; + static double b1[] = { + -0.1025390625, + 0.2775764465332031, + -1.993531733751297, + 2.724882731126854e1, + -6.038440767050702e2, + 1.971837591223663e4, + -8.902978767070678e5, + 5.310411010968522e7, + -4.043620325107754e9, + 3.827011346598605e11, + -4.406481417852278e13, + 6.065091351222699e15, + -9.833883876590679e17, + 1.855045211579828e20 + }; + + if (x < 0.0) return 1; + if (x == 0.0) { + j0 = 1.0; + j1 = 0.0; + y0 = -1e308; + y1 = -1e308; + j0p = 0.0; + j1p = 0.5; + y0p = 1e308; + y1p = 1e308; + return 0; + } + x2 = x*x; + if (x <= 12.0) { + j0 = 1.0; + r = 1.0; + for (k=1; k<=30; k++) { + r *= -0.25*x2/(k*k); + j0 += r; + if (fabs(r) < fabs(j0)*1e-15) break; + } + j1 = 1.0; + r = 1.0; + for (k=1; k<=30; k++) { + r *= -0.25*x2/(k*(k+1)); + j1 += r; + if (fabs(r) < fabs(j1)*1e-15) break; + } + j1 *= 0.5*x; + ec = log(0.5*x)+el; + cs0 = 0.0; + w0 = 0.0; + r0 = 1.0; + for (k=1; k<=30; k++) { + w0 += 1.0/k; + r0 *= -0.25*x2/(k*k); + r = r0 * w0; + cs0 += r; + if (fabs(r) < fabs(cs0)*1e-15) break; + } + y0 = M_2_PI*(ec*j0-cs0); + cs1 = 1.0; + w1 = 0.0; + r1 = 1.0; + for (k=1; k<=30; k++) { + w1 += 1.0/k; + r1 *= -0.25*x2/(k*(k+1)); + r = r1*(2.0*w1+1.0/(k+1)); + cs1 += r; + if (fabs(r) < fabs(cs1)*1e-15) break; + } + y1 = M_2_PI * (ec*j1-1.0/x-0.25*x*cs1); + } + else { + if (x >= 50.0) kz = 8; // Can be changed to 10 + else if (x >= 35.0) kz = 10; // " " 12 + else kz = 12; // " " 14 + t1 = x-M_PI_4; + p0 = 1.0; + q0 = -0.125/x; + for (k=0; k=0; k--) { + f = 2.0*(k+1.0)/x*f1-f2; + if (k <= nm) jn[k] = f; + f2 = f1; + f1 = f; + } + if (fabs(bj0) > fabs(bj1)) cs = bj0/f; + else cs = bj1/f2; + for (k=0; k<=nm; k++) { + jn[k] *= cs; + } + } + for (k=2; k<=nm; k++) { + jnp[k] = jn[k-1]-k*jn[k]/x; + } + f0 = yn[0]; + f1 = yn[1]; + for (k=2; k<=nm; k++) { + f = 2.0*(k-1.0)*f1/x-f0; + yn[k] = f; + f0 = f1; + f1 = f; + } + for (k=2; k<=nm; k++) { + ynp[k] = yn[k-1]-k*yn[k]/x; + } + return 0; +} +// +// Same input and output conventions as above. Different recurrence +// relations used for 'x' < 300. +// +int bessjynb(int n,double x,int &nm,double *jn,double *yn, + double *jnp,double *ynp) +{ + double t1,t2,f,f1,f2,bj0,bj1,bjk,by0,by1,cu,s0,su,sv; + double ec,bs,byk,p0,p1,q0,q1; + static double a[] = { + -0.7031250000000000e-1, + 0.1121520996093750, + -0.5725014209747314, + 6.074042001273483 + }; + static double b[] = { + 0.7324218750000000e-1, + -0.2271080017089844, + 1.727727502584457, + -2.438052969955606e1 + }; + static double a1[] = { + 0.1171875, + -0.1441955566406250, + 0.6765925884246826, + -6.883914268109947 + }; + static double b1[] = { + -0.1025390625, + 0.2775764465332031, + -1.993531733751297, + 2.724882731126854e1 + }; + + int i,k,m; + nm = n; + if ((x < 0.0) || (n < 0)) return 1; + if (x < 1e-15) { + for (i=0; i<=n; i++) { + jn[i] = 0.0; + yn[i] = -1e308; + jnp[i] = 0.0; + ynp[i] = 1e308; + } + jn[0] = 1.0; + jnp[1] = 0.5; + return 0; + } + if (x <= 300.0 || n > (int)(0.9*x)) { + if (n == 0) nm = 1; + m = msta1(x,200); + if (m < nm) nm = m; + else m = msta2(x,nm,15); + bs = 0.0; + su = 0.0; + sv = 0.0; + f2 = 0.0; + f1 = 1.0e-100; + for (k = m; k>=0; k--) { + f = 2.0*(k+1.0)/x*f1 - f2; + if (k <= nm) jn[k] = f; + if ((k == 2*(int)(k/2)) && (k != 0)) { + bs += 2.0*f; +// su += pow(-1,k>>1)*f/(double)k; + su += (-1)*((k & 2)-1)*f/(double)k; + } + else if (k > 1) { +// sv += pow(-1,k>>1)*k*f/(k*k-1.0); + sv += (-1)*((k & 2)-1)*(double)k*f/(k*k-1.0); + } + f2 = f1; + f1 = f; + } + s0 = bs+f; + for (k=0; k<=nm; k++) { + jn[k] /= s0; + } + ec = log(0.5*x) +0.5772156649015329; + by0 = M_2_PI*(ec*jn[0]-4.0*su/s0); + yn[0] = by0; + by1 = M_2_PI*((ec-1.0)*jn[1]-jn[0]/x-4.0*sv/s0); + yn[1] = by1; + } + else { + t1 = x-M_PI_4; + p0 = 1.0; + q0 = -0.125/x; + for (k=0; k<4; k++) { + p0 += a[k]*pow(x,-2*k-2); + q0 += b[k]*pow(x,-2*k-3); + } + cu = sqrt(M_2_PI/x); + bj0 = cu*(p0*cos(t1)-q0*sin(t1)); + by0 = cu*(p0*sin(t1)+q0*cos(t1)); + jn[0] = bj0; + yn[0] = by0; + t2 = x-0.75*M_PI; + p1 = 1.0; + q1 = 0.375/x; + for (k=0; k<4; k++) { + p1 += a1[k]*pow(x,-2*k-2); + q1 += b1[k]*pow(x,-2*k-3); + } + bj1 = cu*(p1*cos(t2)-q1*sin(t2)); + by1 = cu*(p1*sin(t2)+q1*cos(t2)); + jn[1] = bj1; + yn[1] = by1; + for (k=2; k<=nm; k++) { + bjk = 2.0*(k-1.0)*bj1/x-bj0; + jn[k] = bjk; + bj0 = bj1; + bj1 = bjk; + } + } + jnp[0] = -jn[1]; + for (k=1; k<=nm; k++) { + jnp[k] = jn[k-1]-k*jn[k]/x; + } + for (k=2; k<=nm; k++) { + byk = 2.0*(k-1.0)*by1/x-by0; + yn[k] = byk; + by0 = by1; + by1 = byk; + } + ynp[0] = -yn[1]; + for (k=1; k<=nm; k++) { + ynp[k] = yn[k-1]-k*yn[k]/x; + } + return 0; + +} + +// The following routine computes Bessel Jv(x) and Yv(x) for +// arbitrary positive order (v). For negative order, use: +// +// J-v(x) = Jv(x)cos(v pi) - Yv(x)sin(v pi) +// Y-v(x) = Jv(x)sin(v pi) + Yv(x)cos(v pi) +// +int bessjyv(double v,double x,double &vm,double *jv,double *yv, + double *djv,double *dyv) +{ + double v0,vl,vg,vv,a,a0,r,x2,bjv0,bjv1,bjvl,f,f0,f1,f2; + double r0,r1,ck,cs,cs0,cs1,sk,qx,px,byv0,byv1,rp,xk,rq; + double b,ec,w0,w1,bju0,bju1,pv0,pv1,byvk; + int j,k,l,m,n,kz; + + x2 = x*x; + n = (int)v; + v0 = v-n; + if ((x < 0.0) || (v < 0.0)) return 1; + if (x < 1e-15) { + for (k=0; k<=n; k++) { + jv[k] = 0.0; + yv[k] = -1e308; + djv[k] = 0.0; + dyv[k] = 1e308; + if (v0 == 0.0) { + jv[0] = 1.0; + djv[1] = 0.5; + } + else djv[0] = 1e308; + } + vm = v; + return 0; + } + if (x <= 12.0) { + for (l=0; l<2; l++) { + vl = v0 + l; + bjvl = 1.0; + r = 1.0; + for (k=1; k<=40; k++) { + r *= -0.25*x2/(k*(k+vl)); + bjvl += r; + if (fabs(r) < fabs(bjvl)*1e-15) break; + } + vg = 1.0 + vl; + a = pow(0.5*x,vl)/gamma(vg); + if (l == 0) bjv0 = bjvl*a; + else bjv1 = bjvl*a; + } + } + else { + if (x >= 50.0) kz = 8; + else if (x >= 35.0) kz = 10; + else kz = 11; + for (j=0; j<2; j++) { + vv = 4.0*(j+v0)*(j+v0); + px = 1.0; + rp = 1.0; + for (k=1; k<=kz; k++) { + rp *= (-0.78125e-2)*(vv-pow(4.0*k-3.0,2.0))* + (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*x2); + px += rp; + } + qx = 1.0; + rq = 1.0; + for (k=1; k<=kz; k++) { + rq *= (-0.78125e-2)*(vv-pow(4.0*k-1.0,2.0))* + (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*x2); + qx += rq; + } + qx *= 0.125*(vv-1.0)/x; + xk = x-(0.5*(j+v0)+0.25)*M_PI; + a0 = sqrt(M_2_PI/x); + ck = cos(xk); + sk = sin(xk); + + if (j == 0) { + bjv0 = a0*(px*ck-qx*sk); + byv0 = a0*(px*sk+qx*ck); + } + else if (j == 1) { + bjv1 = a0*(px*ck-qx*sk); + byv1 = a0*(px*sk+qx*ck); + } + } + } + jv[0] = bjv0; + jv[1] = bjv1; + djv[0] = v0*jv[0]/x-jv[1]; + djv[1] = -(1.0+v0)*jv[1]/x+jv[0]; + if ((n >= 2) && (n <= (int)(0.9*x))) { + f0 = bjv0; + f1 = bjv1; + for (k=2; k<=n; k++) { + f = 2.0*(k+v0-1.0)*f1/x-f0; + jv[k] = f; + f0 = f1; + f1 = f; + } + } + else if (n >= 2) { + m = msta1(x,200); + if (m < n) n = m; + else m = msta2(x,n,15); + f2 = 0.0; + f1 = 1.0e-100; + for (k=m; k>=0; k--) { + f = 2.0*(v0+k+1.0)*f1/x-f2; + if (k <= n) jv[k] = f; + f2 = f1; + f1 = f; + } + if (fabs(bjv0) > fabs(bjv1)) cs = bjv0/f; + else cs = bjv1/f2; + for (k=0; k<=n; k++) { + jv[k] *= cs; + } + } + for (k=2; k<=n; k++) { + djv[k] = -(k+v0)*jv[k]/x+jv[k-1]; + } + if (x <= 12.0) { + if (v0 != 0.0) { + for (l=0; l<2; l++) { + vl = v0 +l; + bjvl = 1.0; + r = 1.0; + for (k=1; k<=40; k++) { + r *= -0.25*x2/(k*(k-vl)); + bjvl += r; + if (fabs(r) < fabs(bjvl)*1e-15) break; + } + vg = 1.0-vl; + b = pow(2.0/x,vl)/gamma(vg); + if (l == 0) bju0 = bjvl*b; + else bju1 = bjvl*b; + } + pv0 = M_PI*v0; + pv1 = M_PI*(1.0+v0); + byv0 = (bjv0*cos(pv0)-bju0)/sin(pv0); + byv1 = (bjv1*cos(pv1)-bju1)/sin(pv1); + } + else { + ec = log(0.5*x)+el; + cs0 = 0.0; + w0 = 0.0; + r0 = 1.0; + for (k=1; k<=30; k++) { + w0 += 1.0/k; + r0 *= -0.25*x2/(k*k); + cs0 += r0*w0; + } + byv0 = M_2_PI*(ec*bjv0-cs0); + cs1 = 1.0; + w1 = 0.0; + r1 = 1.0; + for (k=1; k<=30; k++) { + w1 += 1.0/k; + r1 *= -0.25*x2/(k*(k+1)); + cs1 += r1*(2.0*w1+1.0/(k+1.0)); + } + byv1 = M_2_PI*(ec*bjv1-1.0/x-0.25*x*cs1); + } + } + yv[0] = byv0; + yv[1] = byv1; + for (k=2; k<=n; k++) { + byvk = 2.0*(v0+k-1.0)*byv1/x-byv0; + yv[k] = byvk; + byv0 = byv1; + byv1 = byvk; + } + dyv[0] = v0*yv[0]/x-yv[1]; + for (k=1; k<=n; k++) { + dyv[k] = -(k+v0)*yv[k]/x+yv[k-1]; + } + vm = n + v0; + return 0; +} + diff --git a/cbessik.cpp b/cbessik.cpp index 524c3f2..93f986e 100644 --- a/cbessik.cpp +++ b/cbessik.cpp @@ -1,454 +1,457 @@ -// cbessik.cpp -- complex modified Bessel functions. -// Algorithms and coefficient values from "Computation of Special -// Functions", Zhang and Jin, John Wiley and Sons, 1996. -// -// (C) 2003, C. Bond. All rights reserved. -// -#include -using namespace std; -#include "bessel.h" - -static complex cii(0.0,1.0); -static complex czero(0.0,0.0); -static complex cone(1.0,0.0); - -double gamma(double x); - -int cbessik01(complexz,complex&ci0,complex&ci1, - complex&ck0,complex&ck1,complex&ci0p, - complex&ci1p,complex&ck0p,complex&ck1p) -{ - complex z1,z2,zr,zr2,cr,ca,cb,cs,ct,cw; - double a0,w0; - int k,kz; - static double a[] = { - 0.125, - 7.03125e-2, - 7.32421875e-2, - 1.1215209960938e-1, - 2.2710800170898e-1, - 5.7250142097473e-1, - 1.7277275025845, - 6.0740420012735, - 2.4380529699556e1, - 1.1001714026925e2, - 5.5133589612202e2, - 3.0380905109224e3}; - static double b[] = { - -0.375, - -1.171875e-1, - -1.025390625e-1, - -1.4419555664063e-1, - -2.7757644653320e-1, - -6.7659258842468e-1, - -1.9935317337513, - -6.8839142681099, - -2.7248827311269e1, - -1.2159789187654e2, - -6.0384407670507e2, - -3.3022722944809e3}; - static double a1[] = { - 0.125, - 0.2109375, - 1.0986328125, - 1.1775970458984e1, - 2.1461706161499e2, - 5.9511522710323e3, - 2.3347645606175e5, - 1.2312234987631e7, - 8.401390346421e08, - 7.2031420482627e10}; - - a0 = abs(z); - z2 = z*z; - z1 = z; - if (a0 == 0.0) { - ci0 = cone; - ci1 = czero; - ck0 = complex (1e308,0); - ck1 = complex (1e308,0); - ci0p = czero; - ci1p = complex(0.5,0.0); - ck0p = complex(-1e308,0); - ck1p = complex(-1e308,0); - return 0; - } - if (real(z) < 0.0) z1 = -z; - if (a0 <= 18.0) { - ci0 = cone; - cr = cone; - for (k=1;k<=50;k++) { - cr *= 0.25*z2/(double)(k*k); - ci0 += cr; - if (abs(cr/ci0) < eps) break; - } - ci1 = cone; - cr = cone; - for (k=1;k<=50;k++) { - cr *= 0.25*z2/(double)(k*(k+1.0)); - ci1 += cr; - if (abs(cr/ci1) < eps) break; - } - ci1 *= 0.5*z1; - } - else { - if (a0 >= 50.0) kz = 7; - else if (a0 >= 35.0) kz = 9; - else kz = 12; - ca = exp(z1)/sqrt(2.0*M_PI*z1); - ci0 = cone; - zr = 1.0/z1; - for (k=0;k 0.0) { - ck0 -= cii*M_PI*ci0; - ck1 = -ck1-cii*M_PI*ci1; - } - ci1 = -ci1; - } - ci0p = ci1; - ci1p = ci0-1.0*ci1/z; - ck0p = -ck1; - ck1p = -ck0-1.0*ck1/z; - return 0; -} -int cbessikna(int n,complex z,int &nm,complex *ci, - complex *ck,complex *cip,complex *ckp) -{ - complex ci0,ci1,ck0,ck1,ckk,cf,cf1,cf2,cs; - double a0; - int k,m,ecode; - a0 = abs(z); - nm = n; - if (a0 < 1.0e-100) { - for (k=0;k<=n;k++) { - ci[k] = czero; - ck[k] = complex(-1e308,0); - cip[k] = czero; - ckp[k] = complex(1e308,0); - } - ci[0] = cone; - cip[1] = complex(0.5,0.0); - return 0; - } - ecode = cbessik01(z,ci[0],ci[1],ck[0],ck[1],cip[0],cip[1],ckp[0],ckp[1]); - if (n < 2) return 0; - ci0 = ci[0]; - ci1 = ci[1]; - ck0 = ck[0]; - ck1 = ck[1]; - m = msta1(a0,200); - if (m < n) nm = m; - else m = msta2(a0,n,15); - cf2 = czero; - cf1 = complex(1.0e-100,0.0); - for (k=m;k>=0;k--) { - cf = 2.0*(k+1.0)*cf1/z+cf2; - if (k <= nm) ci[k] = cf; - cf2 = cf1; - cf1 = cf; - } - cs = ci0/cf; - for (k=0;k<=nm;k++) { - ci[k] *= cs; - } - for (k=2;k<=nm;k++) { - if (abs(ci[k-1]) > abs(ci[k-2])) { - ckk = (1.0/z-ci[k]*ck[k-1])/ci[k-1]; - } - else { - ckk = (ci[k]*ck[k-2]+2.0*(k-1.0)/(z*z))/ci[k-2]; - } - ck[k] = ckk; - } - for (k=2;k<=nm;k++) { - cip[k] = ci[k-1]-(double)k*ci[k]/z; - ckp[k] = -ck[k-1]-(double)k*ck[k]/z; - } - return 0; -} -int cbessiknb(int n,complex z,int &nm,complex *ci, - complex *ck,complex *cip,complex *ckp) -{ - complex z1,cbs,csk0,cf,cf0,cf1,ca0,cbkl; - complex cg,cg0,cg1,cs0,cs,cr; - double a0,vt,fac; - int k,kz,l,m; - - a0 = abs(z); - nm = n; - if (a0 < 1.0e-100) { - for (k=0;k<=n;k++) { - ci[k] = czero; - ck[k] = complex(1e308,0); - cip[k] = czero; - ckp[k] = complex(-1e308,0); - } - ci[0] = complex(1.0,0.0); - cip[1] = complex(0.5,0.0); - return 0; - } - z1 = z; - if (real(z) < 0.0) z1 = -z; - if (n == 0) nm = 1; - m = msta1(a0,200); - if (m < nm) nm = m; - else m = msta2(a0,nm,15); - cbs = czero; - csk0 = czero; - cf0 = czero; - cf1 = complex(1.0e-100,0.0); - for (k=m;k>=0;k--) { - cf = 2.0*(k+1.0)*cf1/z1+cf0; - if (k <=nm) ci[k] = cf; - if ((k != 0) && (k == 2*(k>>1))) csk0 += 4.0*cf/(double)k; - cbs += 2.0*cf; - cf0 = cf1; - cf1 = cf; - } - cs0 = exp(z1)/(cbs-cf); - for (k=0;k<=nm;k++) { - ci[k] *= cs0; - } - if (a0 <= 9.0) { - ck[0] = -(log(0.5*z1)+el)*ci[0]+cs0*csk0; - ck[1] = (1.0/z1-ci[1]*ck[0])/ci[0]; - } - else { - ca0 = sqrt(M_PI_2/z1)*exp(-z1); - if (a0 >= 200.0) kz = 6; - else if (a0 >= 80.0) kz = 8; - else if (a0 >= 25.0) kz = 10; - else kz = 16; - for (l=0;l<2;l++) { - cbkl = cone; - vt = 4.0*l; - cr = cone; - for (k=1;k<=kz;k++) { - cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1); - cbkl += cr; - } - ck[l] = ca0*cbkl; - } - } - cg0 = ck[0]; - cg1 = ck[1]; - for (k=2;k<=nm;k++) { - cg = 2.0*(k-1.0)*cg1/z1+cg0; - ck[k] = cg; - cg0 = cg1; - cg1 = cg; - } - if (real(z) < 0.0) { - fac = 1.0; - for (k=0;k<=nm;k++) { - if (imag(z) < 0.0) { - ck[k] = fac*ck[k]+cii*M_PI*ci[k]; - } - else { - ck[k] = fac*ck[k]-cii*M_PI*ci[k]; - } - ci[k] *= fac; - fac = -fac; - } - } - cip[0] = ci[1]; - ckp[0] = -ck[1]; - for (k=1;k<=nm;k++) { - cip[k] = ci[k-1]-(double)k*ci[k]/z; - ckp[k] = -ck[k-1]-(double)k*ck[k]/z; - } - return 0; -} -int cbessikv(double v,complexz,double &vm,complex *civ, - complex *ckv,complex *civp,complex *ckvp) -{ - complex z1,z2,ca1,ca,cs,cr,ci0,cbi0,cf,cf1,cf2; - complex ct,cp,cbk0,ca2,cr1,cr2,csu,cws,cb; - complex cg0,cg1,cgk,cbk1,cvk; - double a0,v0,v0p,v0n,vt,w0,piv,gap,gan; - int m,n,k,kz; - - a0 = abs(z); - z1 = z; - z2 = z*z; - n = (int)v; - v0 = v-n; - piv = M_PI*v0; - vt = 4.0*v0*v0; - if (n == 0) n = 1; - if (a0 < 1e-100) { - for (k=0;k<=n;k++) { - civ[k] = czero; - ckv[k] = complex(-1e308,0); - civp[k] = czero; - ckvp[k] = complex(1e308,0); - } - if (v0 == 0.0) { - civ[0] = cone; - civp[1] = complex (0.5,0.0); - } - vm = v; - return 0; - } - if (a0 >= 50.0) kz = 8; - else if (a0 >= 35.0) kz = 10; - else kz = 14; - if (real(z) <= 0.0) z1 = -z; - if (a0 < 18.0) { - if (v0 == 0.0) { - ca1 = cone; - } - else { - v0p = 1.0+v0; - gap = gamma(v0p); - ca1 = pow(0.5*z1,v0)/gap; - } - ci0 = cone; - cr = cone; - for (k=1;k<=50;k++) { - cr *= 0.25*z2/(k*(k+v0)); - ci0 += cr; - if (abs(cr/ci0) < eps) break; - } - cbi0 = ci0*ca1; - } - else { - ca = exp(z1)/sqrt(2.0*M_PI*z1); - cs = cone; - cr = cone; - for (k=1;k<=kz;k++) { - cr *= -0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1); - cs += cr; - } - cbi0 = ca*cs; - } - m = msta1(a0,200); - if (m < n) n = m; - else m = msta2(a0,n,15); - cf2 = czero; - cf1 = complex(1.0e-100,0.0); - for (k=m;k>=0;k--) { - cf = 2.0*(v0+k+1.0)*cf1/z1+cf2; - if (k <= n) civ[k] = cf; - cf2 = cf1; - cf1 = cf; - } - cs = cbi0/cf; - for (k=0;k<=n;k++) { - civ[k] *= cs; - } - if (a0 <= 9.0) { - if (v0 == 0.0) { - ct = -log(0.5*z1)-el; - cs = czero; - w0 = 0.0; - cr = cone; - for (k=1;k<=50;k++) { - w0 += 1.0/k; - cr *= 0.25*z2/(double)(k*k); - cp = cr*(w0+ct); - cs += cp; - if ((k >= 10) && (abs(cp/cs) < eps)) break; - } - cbk0 = ct+cs; - } - else { - v0n = 1.0-v0; - gan = gamma(v0n); - ca2 = 1.0/(gan*pow(0.5*z1,v0)); - ca1 = pow(0.5*z1,v0)/gap; - csu = ca2-ca1; - cr1 = cone; - cr2 = cone; - cws = czero; - for (k=1;k<=50;k++) { - cr1 *= 0.25*z2/(k*(k-v0)); - cr2 *= 0.25*z2/(k*(k+v0)); - csu += ca2*cr1-ca1*cr2; - if ((k >= 10) && (abs((cws-csu)/csu) < eps)) break; - cws = csu; - } - cbk0 = csu*M_PI_2/sin(piv); - } - } - else { - cb = exp(-z1)*sqrt(M_PI_2/z1); - cs = cone; - cr = cone; - for (k=1;k<=kz;k++) { - cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1); - cs += cr; - } - cbk0 = cb*cs; - } - cbk1 = (1.0/z1-civ[1]*cbk0)/civ[0]; - ckv[0] = cbk0; - ckv[1] = cbk1; - cg0 = cbk0; - cg1 = cbk1; - for (k=2;k<=n;k++) { - cgk = 2.0*(v0+k-1.0)*cg1/z1+cg0; - ckv[k] = cgk; - cg0 = cg1; - cg1 = cgk; - } - if (real(z) < 0.0) { - for (k=0;k<=n;k++) { - cvk = exp((k+v0)*M_PI*cii); - if (imag(z) < 0.0) { - ckv[k] = cvk*ckv[k]+M_PI*cii*civ[k]; - civ[k] /= cvk; - } - else if (imag(z) > 0.0) { - ckv[k] = ckv[k]/cvk-M_PI*cii*civ[k]; - civ[k] *= cvk; - } - } - } - civp[0] = v0*civ[0]/z+civ[1]; - ckvp[0] = v0*ckv[0]/z-ckv[1]; - for (k=1;k<=n;k++) { - civp[k] = -(k+v0)*civ[k]/z+civ[k-1]; - ckvp[k] = -(k+v0)*ckv[k]/z-ckv[k-1]; - } - vm = n+v0; - return 0; -} +// cbessik.cpp -- complex modified Bessel functions. +// Algorithms and coefficient values from "Computation of Special +// Functions", Zhang and Jin, John Wiley and Sons, 1996. +// +// (C) 2003, C. Bond. All rights reserved. +// +#include +using namespace std; +#include "bessel.h" + +static complex cii(0.0,1.0); +static complex czero(0.0,0.0); +static complex cone(1.0,0.0); + +double gamma(double x); + +int cbessik01(complexz,complex&ci0,complex&ci1, + complex&ck0,complex&ck1,complex&ci0p, + complex&ci1p,complex&ck0p,complex&ck1p) +{ + complex z1,z2,zr,zr2,cr,ca,cb,cs,ct,cw; + double a0,w0; + int k,kz; + static double a[] = { + 0.125, + 7.03125e-2, + 7.32421875e-2, + 1.1215209960938e-1, + 2.2710800170898e-1, + 5.7250142097473e-1, + 1.7277275025845, + 6.0740420012735, + 2.4380529699556e1, + 1.1001714026925e2, + 5.5133589612202e2, + 3.0380905109224e3 + }; + static double b[] = { + -0.375, + -1.171875e-1, + -1.025390625e-1, + -1.4419555664063e-1, + -2.7757644653320e-1, + -6.7659258842468e-1, + -1.9935317337513, + -6.8839142681099, + -2.7248827311269e1, + -1.2159789187654e2, + -6.0384407670507e2, + -3.3022722944809e3 + }; + static double a1[] = { + 0.125, + 0.2109375, + 1.0986328125, + 1.1775970458984e1, + 2.1461706161499e2, + 5.9511522710323e3, + 2.3347645606175e5, + 1.2312234987631e7, + 8.401390346421e08, + 7.2031420482627e10 + }; + + a0 = abs(z); + z2 = z*z; + z1 = z; + if (a0 == 0.0) { + ci0 = cone; + ci1 = czero; + ck0 = complex (1e308,0); + ck1 = complex (1e308,0); + ci0p = czero; + ci1p = complex(0.5,0.0); + ck0p = complex(-1e308,0); + ck1p = complex(-1e308,0); + return 0; + } + if (real(z) < 0.0) z1 = -z; + if (a0 <= 18.0) { + ci0 = cone; + cr = cone; + for (k=1; k<=50; k++) { + cr *= 0.25*z2/(double)(k*k); + ci0 += cr; + if (abs(cr/ci0) < eps) break; + } + ci1 = cone; + cr = cone; + for (k=1; k<=50; k++) { + cr *= 0.25*z2/(double)(k*(k+1.0)); + ci1 += cr; + if (abs(cr/ci1) < eps) break; + } + ci1 *= 0.5*z1; + } + else { + if (a0 >= 50.0) kz = 7; + else if (a0 >= 35.0) kz = 9; + else kz = 12; + ca = exp(z1)/sqrt(2.0*M_PI*z1); + ci0 = cone; + zr = 1.0/z1; + for (k=0; k 0.0) { + ck0 -= cii*M_PI*ci0; + ck1 = -ck1-cii*M_PI*ci1; + } + ci1 = -ci1; + } + ci0p = ci1; + ci1p = ci0-1.0*ci1/z; + ck0p = -ck1; + ck1p = -ck0-1.0*ck1/z; + return 0; +} +int cbessikna(int n,complex z,int &nm,complex *ci, + complex *ck,complex *cip,complex *ckp) +{ + complex ci0,ci1,ck0,ck1,ckk,cf,cf1,cf2,cs; + double a0; + int k,m,ecode; + a0 = abs(z); + nm = n; + if (a0 < 1.0e-100) { + for (k=0; k<=n; k++) { + ci[k] = czero; + ck[k] = complex(-1e308,0); + cip[k] = czero; + ckp[k] = complex(1e308,0); + } + ci[0] = cone; + cip[1] = complex(0.5,0.0); + return 0; + } + ecode = cbessik01(z,ci[0],ci[1],ck[0],ck[1],cip[0],cip[1],ckp[0],ckp[1]); + if (n < 2) return 0; + ci0 = ci[0]; + ci1 = ci[1]; + ck0 = ck[0]; + ck1 = ck[1]; + m = msta1(a0,200); + if (m < n) nm = m; + else m = msta2(a0,n,15); + cf2 = czero; + cf1 = complex(1.0e-100,0.0); + for (k=m; k>=0; k--) { + cf = 2.0*(k+1.0)*cf1/z+cf2; + if (k <= nm) ci[k] = cf; + cf2 = cf1; + cf1 = cf; + } + cs = ci0/cf; + for (k=0; k<=nm; k++) { + ci[k] *= cs; + } + for (k=2; k<=nm; k++) { + if (abs(ci[k-1]) > abs(ci[k-2])) { + ckk = (1.0/z-ci[k]*ck[k-1])/ci[k-1]; + } + else { + ckk = (ci[k]*ck[k-2]+2.0*(k-1.0)/(z*z))/ci[k-2]; + } + ck[k] = ckk; + } + for (k=2; k<=nm; k++) { + cip[k] = ci[k-1]-(double)k*ci[k]/z; + ckp[k] = -ck[k-1]-(double)k*ck[k]/z; + } + return 0; +} +int cbessiknb(int n,complex z,int &nm,complex *ci, + complex *ck,complex *cip,complex *ckp) +{ + complex z1,cbs,csk0,cf,cf0,cf1,ca0,cbkl; + complex cg,cg0,cg1,cs0,cs,cr; + double a0,vt,fac; + int k,kz,l,m; + + a0 = abs(z); + nm = n; + if (a0 < 1.0e-100) { + for (k=0; k<=n; k++) { + ci[k] = czero; + ck[k] = complex(1e308,0); + cip[k] = czero; + ckp[k] = complex(-1e308,0); + } + ci[0] = complex(1.0,0.0); + cip[1] = complex(0.5,0.0); + return 0; + } + z1 = z; + if (real(z) < 0.0) z1 = -z; + if (n == 0) nm = 1; + m = msta1(a0,200); + if (m < nm) nm = m; + else m = msta2(a0,nm,15); + cbs = czero; + csk0 = czero; + cf0 = czero; + cf1 = complex(1.0e-100,0.0); + for (k=m; k>=0; k--) { + cf = 2.0*(k+1.0)*cf1/z1+cf0; + if (k <=nm) ci[k] = cf; + if ((k != 0) && (k == 2*(k>>1))) csk0 += 4.0*cf/(double)k; + cbs += 2.0*cf; + cf0 = cf1; + cf1 = cf; + } + cs0 = exp(z1)/(cbs-cf); + for (k=0; k<=nm; k++) { + ci[k] *= cs0; + } + if (a0 <= 9.0) { + ck[0] = -(log(0.5*z1)+el)*ci[0]+cs0*csk0; + ck[1] = (1.0/z1-ci[1]*ck[0])/ci[0]; + } + else { + ca0 = sqrt(M_PI_2/z1)*exp(-z1); + if (a0 >= 200.0) kz = 6; + else if (a0 >= 80.0) kz = 8; + else if (a0 >= 25.0) kz = 10; + else kz = 16; + for (l=0; l<2; l++) { + cbkl = cone; + vt = 4.0*l; + cr = cone; + for (k=1; k<=kz; k++) { + cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1); + cbkl += cr; + } + ck[l] = ca0*cbkl; + } + } + cg0 = ck[0]; + cg1 = ck[1]; + for (k=2; k<=nm; k++) { + cg = 2.0*(k-1.0)*cg1/z1+cg0; + ck[k] = cg; + cg0 = cg1; + cg1 = cg; + } + if (real(z) < 0.0) { + fac = 1.0; + for (k=0; k<=nm; k++) { + if (imag(z) < 0.0) { + ck[k] = fac*ck[k]+cii*M_PI*ci[k]; + } + else { + ck[k] = fac*ck[k]-cii*M_PI*ci[k]; + } + ci[k] *= fac; + fac = -fac; + } + } + cip[0] = ci[1]; + ckp[0] = -ck[1]; + for (k=1; k<=nm; k++) { + cip[k] = ci[k-1]-(double)k*ci[k]/z; + ckp[k] = -ck[k-1]-(double)k*ck[k]/z; + } + return 0; +} +int cbessikv(double v,complexz,double &vm,complex *civ, + complex *ckv,complex *civp,complex *ckvp) +{ + complex z1,z2,ca1,ca,cs,cr,ci0,cbi0,cf,cf1,cf2; + complex ct,cp,cbk0,ca2,cr1,cr2,csu,cws,cb; + complex cg0,cg1,cgk,cbk1,cvk; + double a0,v0,v0p,v0n,vt,w0,piv,gap,gan; + int m,n,k,kz; + + a0 = abs(z); + z1 = z; + z2 = z*z; + n = (int)v; + v0 = v-n; + piv = M_PI*v0; + vt = 4.0*v0*v0; + if (n == 0) n = 1; + if (a0 < 1e-100) { + for (k=0; k<=n; k++) { + civ[k] = czero; + ckv[k] = complex(-1e308,0); + civp[k] = czero; + ckvp[k] = complex(1e308,0); + } + if (v0 == 0.0) { + civ[0] = cone; + civp[1] = complex (0.5,0.0); + } + vm = v; + return 0; + } + if (a0 >= 50.0) kz = 8; + else if (a0 >= 35.0) kz = 10; + else kz = 14; + if (real(z) <= 0.0) z1 = -z; + if (a0 < 18.0) { + if (v0 == 0.0) { + ca1 = cone; + } + else { + v0p = 1.0+v0; + gap = gamma(v0p); + ca1 = pow(0.5*z1,v0)/gap; + } + ci0 = cone; + cr = cone; + for (k=1; k<=50; k++) { + cr *= 0.25*z2/(k*(k+v0)); + ci0 += cr; + if (abs(cr/ci0) < eps) break; + } + cbi0 = ci0*ca1; + } + else { + ca = exp(z1)/sqrt(2.0*M_PI*z1); + cs = cone; + cr = cone; + for (k=1; k<=kz; k++) { + cr *= -0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1); + cs += cr; + } + cbi0 = ca*cs; + } + m = msta1(a0,200); + if (m < n) n = m; + else m = msta2(a0,n,15); + cf2 = czero; + cf1 = complex(1.0e-100,0.0); + for (k=m; k>=0; k--) { + cf = 2.0*(v0+k+1.0)*cf1/z1+cf2; + if (k <= n) civ[k] = cf; + cf2 = cf1; + cf1 = cf; + } + cs = cbi0/cf; + for (k=0; k<=n; k++) { + civ[k] *= cs; + } + if (a0 <= 9.0) { + if (v0 == 0.0) { + ct = -log(0.5*z1)-el; + cs = czero; + w0 = 0.0; + cr = cone; + for (k=1; k<=50; k++) { + w0 += 1.0/k; + cr *= 0.25*z2/(double)(k*k); + cp = cr*(w0+ct); + cs += cp; + if ((k >= 10) && (abs(cp/cs) < eps)) break; + } + cbk0 = ct+cs; + } + else { + v0n = 1.0-v0; + gan = gamma(v0n); + ca2 = 1.0/(gan*pow(0.5*z1,v0)); + ca1 = pow(0.5*z1,v0)/gap; + csu = ca2-ca1; + cr1 = cone; + cr2 = cone; + cws = czero; + for (k=1; k<=50; k++) { + cr1 *= 0.25*z2/(k*(k-v0)); + cr2 *= 0.25*z2/(k*(k+v0)); + csu += ca2*cr1-ca1*cr2; + if ((k >= 10) && (abs((cws-csu)/csu) < eps)) break; + cws = csu; + } + cbk0 = csu*M_PI_2/sin(piv); + } + } + else { + cb = exp(-z1)*sqrt(M_PI_2/z1); + cs = cone; + cr = cone; + for (k=1; k<=kz; k++) { + cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1); + cs += cr; + } + cbk0 = cb*cs; + } + cbk1 = (1.0/z1-civ[1]*cbk0)/civ[0]; + ckv[0] = cbk0; + ckv[1] = cbk1; + cg0 = cbk0; + cg1 = cbk1; + for (k=2; k<=n; k++) { + cgk = 2.0*(v0+k-1.0)*cg1/z1+cg0; + ckv[k] = cgk; + cg0 = cg1; + cg1 = cgk; + } + if (real(z) < 0.0) { + for (k=0; k<=n; k++) { + cvk = exp((k+v0)*M_PI*cii); + if (imag(z) < 0.0) { + ckv[k] = cvk*ckv[k]+M_PI*cii*civ[k]; + civ[k] /= cvk; + } + else if (imag(z) > 0.0) { + ckv[k] = ckv[k]/cvk-M_PI*cii*civ[k]; + civ[k] *= cvk; + } + } + } + civp[0] = v0*civ[0]/z+civ[1]; + ckvp[0] = v0*ckv[0]/z-ckv[1]; + for (k=1; k<=n; k++) { + civp[k] = -(k+v0)*civ[k]/z+civ[k-1]; + ckvp[k] = -(k+v0)*ckv[k]/z-ckv[k-1]; + } + vm = n+v0; + return 0; +} diff --git a/cbessjy.cpp b/cbessjy.cpp index 230c7dd..50734b0 100644 --- a/cbessjy.cpp +++ b/cbessjy.cpp @@ -1,716 +1,724 @@ -// cbessjy.cpp -- complex Bessel functions. -// Algorithms and coefficient values from "Computation of Special -// Functions", Zhang and Jin, John Wiley and Sons, 1996. -// -// (C) 2003, C. Bond. All rights reserved. -// -#include -using namespace std; -#include "bessel.h" -double gamma(double); - -static complex cii(0.0,1.0); -static complex cone(1.0,0.0); -static complex czero(0.0,0.0); - -int cbessjy01(complex z,complex &cj0,complex &cj1, - complex &cy0,complex &cy1,complex &cj0p, - complex &cj1p,complex &cy0p,complex &cy1p) -{ - complex z1,z2,cr,cp,cs,cp0,cq0,cp1,cq1,ct1,ct2,cu; - double a0,w0,w1; - int k,kz; - - static double a[] = { - -7.03125e-2, - 0.112152099609375, - -0.5725014209747314, - 6.074042001273483, - -1.100171402692467e2, - 3.038090510922384e3, - -1.188384262567832e5, - 6.252951493434797e6, - -4.259392165047669e8, - 3.646840080706556e10, - -3.833534661393944e12, - 4.854014686852901e14, - -7.286857349377656e16, - 1.279721941975975e19}; - static double b[] = { - 7.32421875e-2, - -0.2271080017089844, - 1.727727502584457, - -2.438052969955606e1, - 5.513358961220206e2, - -1.825775547429318e4, - 8.328593040162893e5, - -5.006958953198893e7, - 3.836255180230433e9, - -3.649010818849833e11, - 4.218971570284096e13, - -5.827244631566907e15, - 9.476288099260110e17, - -1.792162323051699e20}; - static double a1[] = { - 0.1171875, - -0.1441955566406250, - 0.6765925884246826, - -6.883914268109947, - 1.215978918765359e2, - -3.302272294480852e3, - 1.276412726461746e5, - -6.656367718817688e6, - 4.502786003050393e8, - -3.833857520742790e10, - 4.011838599133198e12, - -5.060568503314727e14, - 7.572616461117958e16, - -1.326257285320556e19}; - static double b1[] = { - -0.1025390625, - 0.2775764465332031, - -1.993531733751297, - 2.724882731126854e1, - -6.038440767050702e2, - 1.971837591223663e4, - -8.902978767070678e5, - 5.310411010968522e7, - -4.043620325107754e9, - 3.827011346598605e11, - -4.406481417852278e13, - 6.065091351222699e15, - -9.833883876590679e17, - 1.855045211579828e20}; - - a0 = abs(z); - z2 = z*z; - z1 = z; - if (a0 == 0.0) { - cj0 = cone; - cj1 = czero; - cy0 = complex(-1e308,0); - cy1 = complex(-1e308,0); - cj0p = czero; - cj1p = complex(0.5,0.0); - cy0p = complex(1e308,0); - cy1p = complex(1e308,0); - return 0; - } - if (real(z) < 0.0) z1 = -z; - if (a0 <= 12.0) { - cj0 = cone; - cr = cone; - for (k=1;k<=40;k++) { - cr *= -0.25*z2/(double)(k*k); - cj0 += cr; - if (abs(cr) < abs(cj0)*eps) break; - } - cj1 = cone; - cr = cone; - for (k=1;k<=40;k++) { - cr *= -0.25*z2/(k*(k+1.0)); - cj1 += cr; - if (abs(cr) < abs(cj1)*eps) break; - } - cj1 *= 0.5*z1; - w0 = 0.0; - cr = cone; - cs = czero; - for (k=1;k<=40;k++) { - w0 += 1.0/k; - cr *= -0.25*z2/(double)(k*k); - cp = cr*w0; - cs += cp; - if (abs(cp) < abs(cs)*eps) break; - } - cy0 = M_2_PI*((log(0.5*z1)+el)*cj0-cs); - w1 = 0.0; - cr = cone; - cs = cone; - for (k=1;k<=40;k++) { - w1 += 1.0/k; - cr *= -0.25*z2/(k*(k+1.0)); - cp = cr*(2.0*w1+1.0/(k+1.0)); - cs += cp; - if (abs(cp) < abs(cs)*eps) break; - } - cy1 = M_2_PI*((log(0.5*z1)+el)*cj1-1.0/z1-0.25*z1*cs); - } - else { - if (a0 >= 50.0) kz = 8; // can be changed to 10 - else if (a0 >= 35.0) kz = 10; // " " " 12 - else kz = 12; // " " " 14 - ct1 = z1 - M_PI_4; - cp0 = cone; - for (k=0;k 0.0) { - cy0 += 2.0*cii*cj0; - cy1 = -(cy1+2.0*cii*cj1); - } - cj1 = -cj1; - } - cj0p = -cj1; - cj1p = cj0-cj1/z; - cy0p = -cy1; - cy1p = cy0-cy1/z; - return 0; -} - -int cbessjyna(int n,complex z,int &nm,complex *cj, - complex *cy,complex *cjp,complex *cyp) -{ - complex cbj0,cbj1,cby0,cby1,cj0,cjk,cj1,cf,cf1,cf2; - complex cs,cg0,cg1,cyk,cyl1,cyl2,cylk,cp11,cp12,cp21,cp22; - complex ch0,ch1,ch2; - double a0,yak,ya1,ya0,wa; - int m,k,lb,lb0; - - if (n < 0) return 1; - a0 = abs(z); - nm = n; - if (a0 < 1.0e-100) { - for (k=0;k<=n;k++) { - cj[k] = czero; - cy[k] = complex (-1e308,0); - cjp[k] = czero; - cyp[k] = complex(1e308,0); - } - cj[0] = cone; - cjp[1] = complex(0.5,0.0); - return 0; - } - cbessjy01(z,cj[0],cj[1],cy[0],cy[1],cjp[0],cjp[1],cyp[0],cyp[1]); - cbj0 = cj[0]; - cbj1 = cj[1]; - cby0 = cy[0]; - cby1 = cy[1]; - if (n <= 1) return 0; - if (n < (int)0.25*a0) { - cj0 = cbj0; - cj1 = cbj1; - for (k=2;k<=n;k++) { - cjk = 2.0*(k-1.0)*cj1/z-cj0; - cj[k] = cjk; - cj0 = cj1; - cj1 = cjk; - } - } - else { - m = msta1(a0,200); - if (m < n) nm = m; - else m = msta2(a0,n,15); - cf2 = czero; - cf1 = complex (1.0e-100,0.0); - for (k=m;k>=0;k--) { - cf = 2.0*(k+1.0)*cf1/z-cf2; - if (k <=nm) cj[k] = cf; - cf2 = cf1; - cf1 = cf; - } - if (abs(cbj0) > abs(cbj1)) cs = cbj0/cf; - else cs = cbj1/cf2; - for (k=0;k<=nm;k++) { - cj[k] *= cs; - } - } - for (k=2;k<=nm;k++) { - cjp[k] = cj[k-1]-(double)k*cj[k]/z; - } - ya0 = abs(cby0); - lb = 0; - cg0 = cby0; - cg1 = cby1; - for (k=2;k<=nm;k++) { - cyk = 2.0*(k-1.0)*cg1/z-cg0; - yak = abs(cyk); - ya1 = abs(cg0); - if ((yak < ya0) && (yak < ya1)) lb = k; - cy[k] = cyk; - cg0 = cg1; - cg1 = cyk; - } - lb0 = 0; - if ((lb > 4) && (imag(z) != 0.0)) { - while (lb != lb0) { - ch2 = cone; - ch1 = czero; - lb0 = lb; - for (k=lb;k>=1;k--) { - ch0 = 2.0*k*ch1/z-ch2; - ch2 = ch1; - ch1 = ch0; - } - cp12 = ch0; - cp22 = ch2; - ch2 = czero; - ch1 = cone; - for (k=lb;k>=1;k--) { - ch0 = 2.0*k*ch1/z-ch2; - ch2 = ch1; - ch1 = ch0; - } - cp11 = ch0; - cp21 = ch2; - if (lb == nm) - cj[lb+1] = 2.0*lb*cj[lb]/z-cj[lb-1]; - if (abs(cj[0]) > abs(cj[1])) { - cy[lb+1] = (cj[lb+1]*cby0-2.0*cp11/(M_PI*z))/cj[0]; - cy[lb] = (cj[lb]*cby0+2.0*cp12/(M_PI*z))/cj[0]; - } - else { - cy[lb+1] = (cj[lb+1]*cby1-2.0*cp21/(M_PI*z))/cj[1]; - cy[lb] = (cj[lb]*cby1+2.0*cp22/(M_PI*z))/cj[1]; - } - cyl2 = cy[lb+1]; - cyl1 = cy[lb]; - for (k=lb-1;k>=0;k--) { - cylk = 2.0*(k+1.0)*cyl1/z-cyl2; - cy[k] = cylk; - cyl2 = cyl1; - cyl1 = cylk; - } - cyl1 = cy[lb]; - cyl2 = cy[lb+1]; - for (k=lb+1;k z,int &nm,complex *cj, - complex *cy,complex *cjp,complex *cyp) -{ - complex cf,cf0,cf1,cf2,cbs,csu,csv,cs0,ce; - complex ct1,cp0,cq0,cp1,cq1,cu,cbj0,cby0,cbj1,cby1; - complex cyy,cbjk,ct2; - double a0,y0; - int k,m; - static double a[] = { - -0.7031250000000000e-1, - 0.1121520996093750, - -0.5725014209747314, - 6.074042001273483}; - static double b[] = { - 0.7324218750000000e-1, - -0.2271080017089844, - 1.727727502584457, - -2.438052969955606e1}; - static double a1[] = { - 0.1171875, - -0.1441955566406250, - 0.6765925884246826, - -6.883914268109947}; - static double b1[] = { - -0.1025390625, - 0.2775764465332031, - -1.993531733751297, - 2.724882731126854e1}; - - y0 = abs(imag(z)); - a0 = abs(z); - nm = n; - if (a0 < 1.0e-100) { - for (k=0;k<=n;k++) { - cj[k] = czero; - cy[k] = complex (-1e308,0); - cjp[k] = czero; - cyp[k] = complex(1e308,0); - } - cj[0] = cone; - cjp[1] = complex(0.5,0.0); - return 0; - } - if ((a0 <= 300.0) || (n > (int)(0.25*a0))) { - if (n == 0) nm = 1; - m = msta1(a0,200); - if (m < nm) nm = m; - else m = msta2(a0,nm,15); - cbs = czero; - csu = czero; - csv = czero; - cf2 = czero; - cf1 = complex (1.0e-100,0.0); - for (k=m;k>=0;k--) { - cf = 2.0*(k+1.0)*cf1/z-cf2; - if (k <= nm) cj[k] = cf; - if (((k & 1) == 0) && (k != 0)) { - if (y0 <= 1.0) { - cbs += 2.0*cf; - } - else { - cbs += (-1)*((k & 2)-1)*2.0*cf; - } - csu += (double)((-1)*((k & 2)-1))*cf/(double)k; - } - else if (k > 1) { - csv += (double)((-1)*((k & 2)-1)*k)*cf/(double)(k*k-1.0); - } - cf2 = cf1; - cf1 = cf; - } - if (y0 <= 1.0) cs0 = cbs+cf; - else cs0 = (cbs+cf)/cos(z); - for (k=0;k<=nm;k++) { - cj[k] /= cs0; - } - ce = log(0.5*z)+el; - cy[0] = M_2_PI*(ce*cj[0]-4.0*csu/cs0); - cy[1] = M_2_PI*(-cj[0]/z+(ce-1.0)*cj[1]-4.0*csv/cs0); - } - else { - ct1 = z-M_PI_4; - cp0 = cone; - for (k=0;k<4;k++) { - cp0 += a[k]*pow(z,-2.0*k-2.0); - } - cq0 = -0.125/z; - for (k=0;k<4;k++) { - cq0 += b[k] *pow(z,-2.0*k-3.0); - } - cu = sqrt(M_2_PI/z); - cbj0 = cu*(cp0*cos(ct1)-cq0*sin(ct1)); - cby0 = cu*(cp0*sin(ct1)+cq0*cos(ct1)); - cj[0] = cbj0; - cy[0] = cby0; - ct2 = z-0.75*M_PI; - cp1 = cone; - for (k=0;k<4;k++) { - cp1 += a1[k]*pow(z,-2.0*k-2.0); - } - cq1 = 0.375/z; - for (k=0;k<4;k++) { - cq1 += b1[k]*pow(z,-2.0*k-3.0); - } - cbj1 = cu*(cp1*cos(ct2)-cq1*sin(ct2)); - cby1 = cu*(cp1*sin(ct2)+cq1*cos(ct2)); - cj[1] = cbj1; - cy[1] = cby1; - for (k=2;k<=n;k++) { - cbjk = 2.0*(k-1.0)*cbj1/z-cbj0; - cj[k] = cbjk; - cbj0 = cbj1; - cbj1 = cbjk; - } - } - cjp[0] = -cj[1]; - for (k=1;k<=nm;k++) { - cjp[k] = cj[k-1]-(double)k*cj[k]/z; - } - if (abs(cj[0]) > 1.0) - cy[1] = (cj[1]*cy[0]-2.0/(M_PI*z))/cj[0]; - for (k=2;k<=nm;k++) { - if (abs(cj[k-1]) >= abs(cj[k-2])) - cyy = (cj[k]*cy[k-1]-2.0/(M_PI*z))/cj[k-1]; - else - cyy = (cj[k]*cy[k-2]-4.0*(k-1.0)/(M_PI*z*z))/cj[k-2]; - cy[k] = cyy; - } - cyp[0] = -cy[1]; - for (k=1;k<=nm;k++) { - cyp[k] = cy[k-1]-(double)k*cy[k]/z; - } - - return 0; -} - -int cbessjyva(double v,complex z,double &vm,complex*cjv, - complex*cyv,complex*cjvp,complex*cyvp) -{ - complex z1,z2,zk,cjvl,cr,ca,cjv0,cjv1,cpz,crp; - complex cqz,crq,ca0,cck,csk,cyv0,cyv1,cju0,cju1,cb; - complex cs,cs0,cr0,cs1,cr1,cec,cf,cf0,cf1,cf2; - complex cfac0,cfac1,cg0,cg1,cyk,cp11,cp12,cp21,cp22; - complex ch0,ch1,ch2,cyl1,cyl2,cylk; - - double a0,v0,pv0,pv1,vl,ga,gb,vg,vv,w0,w1,ya0,yak,ya1,wa; - int j,n,k,kz,l,lb,lb0,m; - - a0 = abs(z); - z1 = z; - z2 = z*z; - n = (int)v; - - - v0 = v-n; - - pv0 = M_PI*v0; - pv1 = M_PI*(1.0+v0); - if (a0 < 1.0e-100) { - for (k=0;k<=n;k++) { - cjv[k] = czero; - cyv[k] = complex (-1e308,0); - cjvp[k] = czero; - cyvp[k] = complex (1e308,0); - - } - if (v0 == 0.0) { - cjv[0] = cone; - cjvp[1] = complex (0.5,0.0); - } - else { - cjvp[0] = complex (1e308,0); - } - vm = v; - return 0; - } - if (real(z1) < 0.0) z1 = -z; - if (a0 <= 12.0) { - for (l=0;l<2;l++) { - vl = v0+l; - cjvl = cone; - cr = cone; - for (k=1;k<=40;k++) { - cr *= -0.25*z2/(k*(k+vl)); - cjvl += cr; - if (abs(cr) < abs(cjvl)*eps) break; - } - vg = 1.0 + vl; - ga = gamma(vg); - ca = pow(0.5*z1,vl)/ga; - if (l == 0) cjv0 = cjvl*ca; - else cjv1 = cjvl*ca; - } - } - else { - if (a0 >= 50.0) kz = 8; - else if (a0 >= 35.0) kz = 10; - else kz = 11; - for (j=0;j<2;j++) { - vv = 4.0*(j+v0)*(j+v0); - cpz = cone; - crp = cone; - for (k=1;k<=kz;k++) { - crp = -0.78125e-2*crp*(vv-pow(4.0*k-3.0,2.0))* - (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*z2); - cpz += crp; - } - cqz = cone; - crq = cone; - for (k=1;k<=kz;k++) { - crq = -0.78125e-2*crq*(vv-pow(4.0*k-1.0,2.0))* - (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*z2); - cqz += crq; - } - cqz *= 0.125*(vv-1.0)/z1; - zk = z1-(0.5*(j+v0)+0.25)*M_PI; - ca0 = sqrt(M_2_PI/z1); - cck = cos(zk); - csk = sin(zk); - if (j == 0) { - cjv0 = ca0*(cpz*cck-cqz*csk); - cyv0 = ca0*(cpz*csk+cqz+cck); - } - else { - cjv1 = ca0*(cpz*cck-cqz*csk); - cyv1 = ca0*(cpz*csk+cqz*cck); - } - } - } - if (a0 <= 12.0) { - if (v0 != 0.0) { - for (l=0;l<2;l++) { - vl = v0+l; - cjvl = cone; - cr = cone; - for (k=1;k<=40;k++) { - cr *= -0.25*z2/(k*(k-vl)); - cjvl += cr; - if (abs(cr) < abs(cjvl)*eps) break; - } - vg = 1.0-vl; - gb = gamma(vg); - cb = pow(2.0/z1,vl)/gb; - if (l == 0) cju0 = cjvl*cb; - else cju1 = cjvl*cb; - } - cyv0 = (cjv0*cos(pv0)-cju0)/sin(pv0); - cyv1 = (cjv1*cos(pv1)-cju1)/sin(pv1); - } - else { - cec = log(0.5*z1)+el; - cs0 = czero; - w0 = 0.0; - cr0 = cone; - for (k=1;k<=30;k++) { - w0 += 1.0/k; - cr0 *= -0.25*z2/(double)(k*k); - cs0 += cr0*w0; - } - cyv0 = M_2_PI*(cec*cjv0-cs0); - cs1 = cone; - w1 = 0.0; - cr1 = cone; - for (k=1;k<=30;k++) { - w1 += 1.0/k; - cr1 *= -0.25*z2/(k*(k+1.0)); - cs1 += cr1*(2.0*w1+1.0/(k+1.0)); - } - cyv1 = M_2_PI*(cec*cjv1-1.0/z1-0.25*z1*cs1); - } - } - if (real(z) < 0.0) { - cfac0 = exp(pv0*cii); - cfac1 = exp(pv1*cii); - if (imag(z) < 0.0) { - cyv0 = cfac0*cyv0-2.0*cii*cos(pv0)*cjv0; - cyv1 = cfac1*cyv1-2.0*cii*cos(pv1)*cjv1; - cjv0 /= cfac0; - cjv1 /= cfac1; - } - else if (imag(z) > 0.0) { - cyv0 = cyv0/cfac0+2.0*cii*cos(pv0)*cjv0; - cyv1 = cyv1/cfac1+2.0*cii*cos(pv1)*cjv1; - cjv0 *= cfac0; - cjv1 *= cfac1; - } - } - cjv[0] = cjv0; - cjv[1] = cjv1; - if ((n >= 2) && (n <= (int)(0.25*a0))) { - cf0 = cjv0; - cf1 = cjv1; - for (k=2;k<= n;k++) { - cf = 2.0*(k+v0-1.0)*cf1/z-cf0; - cjv[k] = cf; - cf0 = cf1; - cf1 = cf; - } - } - else if (n >= 2) { - m = msta1(a0,200); - if (m < n) n = m; - else m = msta2(a0,n,15); - cf2 = czero; - cf1 = complex(1.0e-100,0.0); - for (k=m;k>=0;k--) { - cf = 2.0*(v0+k+1.0)*cf1/z-cf2; - if (k <= n) cjv[k] = cf; - cf2 = cf1; - cf1 = cf; - } - if (abs(cjv0) > abs(cjv1)) cs = cjv0/cf; - else cs = cjv1/cf2; - for (k=0;k<=n;k++) { - cjv[k] *= cs; - } - } - cjvp[0] = v0*cjv[0]/z-cjv[1]; - for (k=1;k<=n;k++) { - cjvp[k] = -(k+v0)*cjv[k]/z+cjv[k-1]; - } - cyv[0] = cyv0; - cyv[1] = cyv1; - ya0 = abs(cyv0); - lb = 0; - cg0 = cyv0; - cg1 = cyv1; - for (k=2;k<=n;k++) { - cyk = 2.0*(v0+k-1.0)*cg1/z-cg0; - yak = abs(cyk); - ya1 = abs(cg0); - if ((yak < ya0) && (yak< ya1)) lb = k; - cyv[k] = cyk; - cg0 = cg1; - cg1 = cyk; - } - lb0 = 0; - if ((lb > 4) && (imag(z) != 0.0)) { - while(lb != lb0) { - ch2 = cone; - ch1 = czero; - lb0 = lb; - for (k=lb;k>=1;k--) { - ch0 = 2.0*(k+v0)*ch1/z-ch2; - ch2 = ch1; - ch1 = ch0; - } - cp12 = ch0; - cp22 = ch2; - ch2 = czero; - ch1 = cone; - for (k=lb;k>=1;k--) { - ch0 = 2.0*(k+v0)*ch1/z-ch2; - ch2 = ch1; - ch1 = ch0; - } - cp11 = ch0; - cp21 = ch2; - if (lb == n) - cjv[lb+1] = 2.0*(lb+v0)*cjv[lb]/z-cjv[lb-1]; - if (abs(cjv[0]) > abs(cjv[1])) { - cyv[lb+1] = (cjv[lb+1]*cyv0-2.0*cp11/(M_PI*z))/cjv[0]; - cyv[lb] = (cjv[lb]*cyv0+2.0*cp12/(M_PI*z))/cjv[0]; - } - else { - cyv[lb+1] = (cjv[lb+1]*cyv1-2.0*cp21/(M_PI*z))/cjv[1]; - cyv[lb] = (cjv[lb]*cyv1+2.0*cp22/(M_PI*z))/cjv[1]; - } - cyl2 = cyv[lb+1]; - cyl1 = cyv[lb]; - for (k=lb-1;k>=0;k--) { - cylk = 2.0*(k+v0+1.0)*cyl1/z-cyl2; - cyv[k] = cylk; - cyl2 = cyl1; - cyl1 = cylk; - } - cyl1 = cyv[lb]; - cyl2 = cyv[lb+1]; - for (k=lb+1;k +using namespace std; +#include "bessel.h" +double gamma(double); + +static complex cii(0.0,1.0); +static complex cone(1.0,0.0); +static complex czero(0.0,0.0); + +int cbessjy01(complex z,complex &cj0,complex &cj1, + complex &cy0,complex &cy1,complex &cj0p, + complex &cj1p,complex &cy0p,complex &cy1p) +{ + complex z1,z2,cr,cp,cs,cp0,cq0,cp1,cq1,ct1,ct2,cu; + double a0,w0,w1; + int k,kz; + + static double a[] = { + -7.03125e-2, + 0.112152099609375, + -0.5725014209747314, + 6.074042001273483, + -1.100171402692467e2, + 3.038090510922384e3, + -1.188384262567832e5, + 6.252951493434797e6, + -4.259392165047669e8, + 3.646840080706556e10, + -3.833534661393944e12, + 4.854014686852901e14, + -7.286857349377656e16, + 1.279721941975975e19 + }; + static double b[] = { + 7.32421875e-2, + -0.2271080017089844, + 1.727727502584457, + -2.438052969955606e1, + 5.513358961220206e2, + -1.825775547429318e4, + 8.328593040162893e5, + -5.006958953198893e7, + 3.836255180230433e9, + -3.649010818849833e11, + 4.218971570284096e13, + -5.827244631566907e15, + 9.476288099260110e17, + -1.792162323051699e20 + }; + static double a1[] = { + 0.1171875, + -0.1441955566406250, + 0.6765925884246826, + -6.883914268109947, + 1.215978918765359e2, + -3.302272294480852e3, + 1.276412726461746e5, + -6.656367718817688e6, + 4.502786003050393e8, + -3.833857520742790e10, + 4.011838599133198e12, + -5.060568503314727e14, + 7.572616461117958e16, + -1.326257285320556e19 + }; + static double b1[] = { + -0.1025390625, + 0.2775764465332031, + -1.993531733751297, + 2.724882731126854e1, + -6.038440767050702e2, + 1.971837591223663e4, + -8.902978767070678e5, + 5.310411010968522e7, + -4.043620325107754e9, + 3.827011346598605e11, + -4.406481417852278e13, + 6.065091351222699e15, + -9.833883876590679e17, + 1.855045211579828e20 + }; + + a0 = abs(z); + z2 = z*z; + z1 = z; + if (a0 == 0.0) { + cj0 = cone; + cj1 = czero; + cy0 = complex(-1e308,0); + cy1 = complex(-1e308,0); + cj0p = czero; + cj1p = complex(0.5,0.0); + cy0p = complex(1e308,0); + cy1p = complex(1e308,0); + return 0; + } + if (real(z) < 0.0) z1 = -z; + if (a0 <= 12.0) { + cj0 = cone; + cr = cone; + for (k=1; k<=40; k++) { + cr *= -0.25*z2/(double)(k*k); + cj0 += cr; + if (abs(cr) < abs(cj0)*eps) break; + } + cj1 = cone; + cr = cone; + for (k=1; k<=40; k++) { + cr *= -0.25*z2/(k*(k+1.0)); + cj1 += cr; + if (abs(cr) < abs(cj1)*eps) break; + } + cj1 *= 0.5*z1; + w0 = 0.0; + cr = cone; + cs = czero; + for (k=1; k<=40; k++) { + w0 += 1.0/k; + cr *= -0.25*z2/(double)(k*k); + cp = cr*w0; + cs += cp; + if (abs(cp) < abs(cs)*eps) break; + } + cy0 = M_2_PI*((log(0.5*z1)+el)*cj0-cs); + w1 = 0.0; + cr = cone; + cs = cone; + for (k=1; k<=40; k++) { + w1 += 1.0/k; + cr *= -0.25*z2/(k*(k+1.0)); + cp = cr*(2.0*w1+1.0/(k+1.0)); + cs += cp; + if (abs(cp) < abs(cs)*eps) break; + } + cy1 = M_2_PI*((log(0.5*z1)+el)*cj1-1.0/z1-0.25*z1*cs); + } + else { + if (a0 >= 50.0) kz = 8; // can be changed to 10 + else if (a0 >= 35.0) kz = 10; // " " " 12 + else kz = 12; // " " " 14 + ct1 = z1 - M_PI_4; + cp0 = cone; + for (k=0; k 0.0) { + cy0 += 2.0*cii*cj0; + cy1 = -(cy1+2.0*cii*cj1); + } + cj1 = -cj1; + } + cj0p = -cj1; + cj1p = cj0-cj1/z; + cy0p = -cy1; + cy1p = cy0-cy1/z; + return 0; +} + +int cbessjyna(int n,complex z,int &nm,complex *cj, + complex *cy,complex *cjp,complex *cyp) +{ + complex cbj0,cbj1,cby0,cby1,cj0,cjk,cj1,cf,cf1,cf2; + complex cs,cg0,cg1,cyk,cyl1,cyl2,cylk,cp11,cp12,cp21,cp22; + complex ch0,ch1,ch2; + double a0,yak,ya1,ya0,wa; + int m,k,lb,lb0; + + if (n < 0) return 1; + a0 = abs(z); + nm = n; + if (a0 < 1.0e-100) { + for (k=0; k<=n; k++) { + cj[k] = czero; + cy[k] = complex (-1e308,0); + cjp[k] = czero; + cyp[k] = complex(1e308,0); + } + cj[0] = cone; + cjp[1] = complex(0.5,0.0); + return 0; + } + cbessjy01(z,cj[0],cj[1],cy[0],cy[1],cjp[0],cjp[1],cyp[0],cyp[1]); + cbj0 = cj[0]; + cbj1 = cj[1]; + cby0 = cy[0]; + cby1 = cy[1]; + if (n <= 1) return 0; + if (n < (int)0.25*a0) { + cj0 = cbj0; + cj1 = cbj1; + for (k=2; k<=n; k++) { + cjk = 2.0*(k-1.0)*cj1/z-cj0; + cj[k] = cjk; + cj0 = cj1; + cj1 = cjk; + } + } + else { + m = msta1(a0,200); + if (m < n) nm = m; + else m = msta2(a0,n,15); + cf2 = czero; + cf1 = complex (1.0e-100,0.0); + for (k=m; k>=0; k--) { + cf = 2.0*(k+1.0)*cf1/z-cf2; + if (k <=nm) cj[k] = cf; + cf2 = cf1; + cf1 = cf; + } + if (abs(cbj0) > abs(cbj1)) cs = cbj0/cf; + else cs = cbj1/cf2; + for (k=0; k<=nm; k++) { + cj[k] *= cs; + } + } + for (k=2; k<=nm; k++) { + cjp[k] = cj[k-1]-(double)k*cj[k]/z; + } + ya0 = abs(cby0); + lb = 0; + cg0 = cby0; + cg1 = cby1; + for (k=2; k<=nm; k++) { + cyk = 2.0*(k-1.0)*cg1/z-cg0; + yak = abs(cyk); + ya1 = abs(cg0); + if ((yak < ya0) && (yak < ya1)) lb = k; + cy[k] = cyk; + cg0 = cg1; + cg1 = cyk; + } + lb0 = 0; + if ((lb > 4) && (imag(z) != 0.0)) { + while (lb != lb0) { + ch2 = cone; + ch1 = czero; + lb0 = lb; + for (k=lb; k>=1; k--) { + ch0 = 2.0*k*ch1/z-ch2; + ch2 = ch1; + ch1 = ch0; + } + cp12 = ch0; + cp22 = ch2; + ch2 = czero; + ch1 = cone; + for (k=lb; k>=1; k--) { + ch0 = 2.0*k*ch1/z-ch2; + ch2 = ch1; + ch1 = ch0; + } + cp11 = ch0; + cp21 = ch2; + if (lb == nm) + cj[lb+1] = 2.0*lb*cj[lb]/z-cj[lb-1]; + if (abs(cj[0]) > abs(cj[1])) { + cy[lb+1] = (cj[lb+1]*cby0-2.0*cp11/(M_PI*z))/cj[0]; + cy[lb] = (cj[lb]*cby0+2.0*cp12/(M_PI*z))/cj[0]; + } + else { + cy[lb+1] = (cj[lb+1]*cby1-2.0*cp21/(M_PI*z))/cj[1]; + cy[lb] = (cj[lb]*cby1+2.0*cp22/(M_PI*z))/cj[1]; + } + cyl2 = cy[lb+1]; + cyl1 = cy[lb]; + for (k=lb-1; k>=0; k--) { + cylk = 2.0*(k+1.0)*cyl1/z-cyl2; + cy[k] = cylk; + cyl2 = cyl1; + cyl1 = cylk; + } + cyl1 = cy[lb]; + cyl2 = cy[lb+1]; + for (k=lb+1; k z,int &nm,complex *cj, + complex *cy,complex *cjp,complex *cyp) +{ + complex cf,cf0,cf1,cf2,cbs,csu,csv,cs0,ce; + complex ct1,cp0,cq0,cp1,cq1,cu,cbj0,cby0,cbj1,cby1; + complex cyy,cbjk,ct2; + double a0,y0; + int k,m; + static double a[] = { + -0.7031250000000000e-1, + 0.1121520996093750, + -0.5725014209747314, + 6.074042001273483 + }; + static double b[] = { + 0.7324218750000000e-1, + -0.2271080017089844, + 1.727727502584457, + -2.438052969955606e1 + }; + static double a1[] = { + 0.1171875, + -0.1441955566406250, + 0.6765925884246826, + -6.883914268109947 + }; + static double b1[] = { + -0.1025390625, + 0.2775764465332031, + -1.993531733751297, + 2.724882731126854e1 + }; + + y0 = abs(imag(z)); + a0 = abs(z); + nm = n; + if (a0 < 1.0e-100) { + for (k=0; k<=n; k++) { + cj[k] = czero; + cy[k] = complex (-1e308,0); + cjp[k] = czero; + cyp[k] = complex(1e308,0); + } + cj[0] = cone; + cjp[1] = complex(0.5,0.0); + return 0; + } + if ((a0 <= 300.0) || (n > (int)(0.25*a0))) { + if (n == 0) nm = 1; + m = msta1(a0,200); + if (m < nm) nm = m; + else m = msta2(a0,nm,15); + cbs = czero; + csu = czero; + csv = czero; + cf2 = czero; + cf1 = complex (1.0e-100,0.0); + for (k=m; k>=0; k--) { + cf = 2.0*(k+1.0)*cf1/z-cf2; + if (k <= nm) cj[k] = cf; + if (((k & 1) == 0) && (k != 0)) { + if (y0 <= 1.0) { + cbs += 2.0*cf; + } + else { + cbs += (-1)*((k & 2)-1)*2.0*cf; + } + csu += (double)((-1)*((k & 2)-1))*cf/(double)k; + } + else if (k > 1) { + csv += (double)((-1)*((k & 2)-1)*k)*cf/(double)(k*k-1.0); + } + cf2 = cf1; + cf1 = cf; + } + if (y0 <= 1.0) cs0 = cbs+cf; + else cs0 = (cbs+cf)/cos(z); + for (k=0; k<=nm; k++) { + cj[k] /= cs0; + } + ce = log(0.5*z)+el; + cy[0] = M_2_PI*(ce*cj[0]-4.0*csu/cs0); + cy[1] = M_2_PI*(-cj[0]/z+(ce-1.0)*cj[1]-4.0*csv/cs0); + } + else { + ct1 = z-M_PI_4; + cp0 = cone; + for (k=0; k<4; k++) { + cp0 += a[k]*pow(z,-2.0*k-2.0); + } + cq0 = -0.125/z; + for (k=0; k<4; k++) { + cq0 += b[k] *pow(z,-2.0*k-3.0); + } + cu = sqrt(M_2_PI/z); + cbj0 = cu*(cp0*cos(ct1)-cq0*sin(ct1)); + cby0 = cu*(cp0*sin(ct1)+cq0*cos(ct1)); + cj[0] = cbj0; + cy[0] = cby0; + ct2 = z-0.75*M_PI; + cp1 = cone; + for (k=0; k<4; k++) { + cp1 += a1[k]*pow(z,-2.0*k-2.0); + } + cq1 = 0.375/z; + for (k=0; k<4; k++) { + cq1 += b1[k]*pow(z,-2.0*k-3.0); + } + cbj1 = cu*(cp1*cos(ct2)-cq1*sin(ct2)); + cby1 = cu*(cp1*sin(ct2)+cq1*cos(ct2)); + cj[1] = cbj1; + cy[1] = cby1; + for (k=2; k<=n; k++) { + cbjk = 2.0*(k-1.0)*cbj1/z-cbj0; + cj[k] = cbjk; + cbj0 = cbj1; + cbj1 = cbjk; + } + } + cjp[0] = -cj[1]; + for (k=1; k<=nm; k++) { + cjp[k] = cj[k-1]-(double)k*cj[k]/z; + } + if (abs(cj[0]) > 1.0) + cy[1] = (cj[1]*cy[0]-2.0/(M_PI*z))/cj[0]; + for (k=2; k<=nm; k++) { + if (abs(cj[k-1]) >= abs(cj[k-2])) + cyy = (cj[k]*cy[k-1]-2.0/(M_PI*z))/cj[k-1]; + else + cyy = (cj[k]*cy[k-2]-4.0*(k-1.0)/(M_PI*z*z))/cj[k-2]; + cy[k] = cyy; + } + cyp[0] = -cy[1]; + for (k=1; k<=nm; k++) { + cyp[k] = cy[k-1]-(double)k*cy[k]/z; + } + + return 0; +} + +int cbessjyva(double v,complex z,double &vm,complex*cjv, + complex*cyv,complex*cjvp,complex*cyvp) +{ + complex z1,z2,zk,cjvl,cr,ca,cjv0,cjv1,cpz,crp; + complex cqz,crq,ca0,cck,csk,cyv0,cyv1,cju0,cju1,cb; + complex cs,cs0,cr0,cs1,cr1,cec,cf,cf0,cf1,cf2; + complex cfac0,cfac1,cg0,cg1,cyk,cp11,cp12,cp21,cp22; + complex ch0,ch1,ch2,cyl1,cyl2,cylk; + + double a0,v0,pv0,pv1,vl,ga,gb,vg,vv,w0,w1,ya0,yak,ya1,wa; + int j,n,k,kz,l,lb,lb0,m; + + a0 = abs(z); + z1 = z; + z2 = z*z; + n = (int)v; + + + v0 = v-n; + + pv0 = M_PI*v0; + pv1 = M_PI*(1.0+v0); + if (a0 < 1.0e-100) { + for (k=0; k<=n; k++) { + cjv[k] = czero; + cyv[k] = complex (-1e308,0); + cjvp[k] = czero; + cyvp[k] = complex (1e308,0); + + } + if (v0 == 0.0) { + cjv[0] = cone; + cjvp[1] = complex (0.5,0.0); + } + else { + cjvp[0] = complex (1e308,0); + } + vm = v; + return 0; + } + if (real(z1) < 0.0) z1 = -z; + if (a0 <= 12.0) { + for (l=0; l<2; l++) { + vl = v0+l; + cjvl = cone; + cr = cone; + for (k=1; k<=40; k++) { + cr *= -0.25*z2/(k*(k+vl)); + cjvl += cr; + if (abs(cr) < abs(cjvl)*eps) break; + } + vg = 1.0 + vl; + ga = gamma(vg); + ca = pow(0.5*z1,vl)/ga; + if (l == 0) cjv0 = cjvl*ca; + else cjv1 = cjvl*ca; + } + } + else { + if (a0 >= 50.0) kz = 8; + else if (a0 >= 35.0) kz = 10; + else kz = 11; + for (j=0; j<2; j++) { + vv = 4.0*(j+v0)*(j+v0); + cpz = cone; + crp = cone; + for (k=1; k<=kz; k++) { + crp = -0.78125e-2*crp*(vv-pow(4.0*k-3.0,2.0))* + (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*z2); + cpz += crp; + } + cqz = cone; + crq = cone; + for (k=1; k<=kz; k++) { + crq = -0.78125e-2*crq*(vv-pow(4.0*k-1.0,2.0))* + (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*z2); + cqz += crq; + } + cqz *= 0.125*(vv-1.0)/z1; + zk = z1-(0.5*(j+v0)+0.25)*M_PI; + ca0 = sqrt(M_2_PI/z1); + cck = cos(zk); + csk = sin(zk); + if (j == 0) { + cjv0 = ca0*(cpz*cck-cqz*csk); + cyv0 = ca0*(cpz*csk+cqz+cck); + } + else { + cjv1 = ca0*(cpz*cck-cqz*csk); + cyv1 = ca0*(cpz*csk+cqz*cck); + } + } + } + if (a0 <= 12.0) { + if (v0 != 0.0) { + for (l=0; l<2; l++) { + vl = v0+l; + cjvl = cone; + cr = cone; + for (k=1; k<=40; k++) { + cr *= -0.25*z2/(k*(k-vl)); + cjvl += cr; + if (abs(cr) < abs(cjvl)*eps) break; + } + vg = 1.0-vl; + gb = gamma(vg); + cb = pow(2.0/z1,vl)/gb; + if (l == 0) cju0 = cjvl*cb; + else cju1 = cjvl*cb; + } + cyv0 = (cjv0*cos(pv0)-cju0)/sin(pv0); + cyv1 = (cjv1*cos(pv1)-cju1)/sin(pv1); + } + else { + cec = log(0.5*z1)+el; + cs0 = czero; + w0 = 0.0; + cr0 = cone; + for (k=1; k<=30; k++) { + w0 += 1.0/k; + cr0 *= -0.25*z2/(double)(k*k); + cs0 += cr0*w0; + } + cyv0 = M_2_PI*(cec*cjv0-cs0); + cs1 = cone; + w1 = 0.0; + cr1 = cone; + for (k=1; k<=30; k++) { + w1 += 1.0/k; + cr1 *= -0.25*z2/(k*(k+1.0)); + cs1 += cr1*(2.0*w1+1.0/(k+1.0)); + } + cyv1 = M_2_PI*(cec*cjv1-1.0/z1-0.25*z1*cs1); + } + } + if (real(z) < 0.0) { + cfac0 = exp(pv0*cii); + cfac1 = exp(pv1*cii); + if (imag(z) < 0.0) { + cyv0 = cfac0*cyv0-2.0*cii*cos(pv0)*cjv0; + cyv1 = cfac1*cyv1-2.0*cii*cos(pv1)*cjv1; + cjv0 /= cfac0; + cjv1 /= cfac1; + } + else if (imag(z) > 0.0) { + cyv0 = cyv0/cfac0+2.0*cii*cos(pv0)*cjv0; + cyv1 = cyv1/cfac1+2.0*cii*cos(pv1)*cjv1; + cjv0 *= cfac0; + cjv1 *= cfac1; + } + } + cjv[0] = cjv0; + cjv[1] = cjv1; + if ((n >= 2) && (n <= (int)(0.25*a0))) { + cf0 = cjv0; + cf1 = cjv1; + for (k=2; k<= n; k++) { + cf = 2.0*(k+v0-1.0)*cf1/z-cf0; + cjv[k] = cf; + cf0 = cf1; + cf1 = cf; + } + } + else if (n >= 2) { + m = msta1(a0,200); + if (m < n) n = m; + else m = msta2(a0,n,15); + cf2 = czero; + cf1 = complex(1.0e-100,0.0); + for (k=m; k>=0; k--) { + cf = 2.0*(v0+k+1.0)*cf1/z-cf2; + if (k <= n) cjv[k] = cf; + cf2 = cf1; + cf1 = cf; + } + if (abs(cjv0) > abs(cjv1)) cs = cjv0/cf; + else cs = cjv1/cf2; + for (k=0; k<=n; k++) { + cjv[k] *= cs; + } + } + cjvp[0] = v0*cjv[0]/z-cjv[1]; + for (k=1; k<=n; k++) { + cjvp[k] = -(k+v0)*cjv[k]/z+cjv[k-1]; + } + cyv[0] = cyv0; + cyv[1] = cyv1; + ya0 = abs(cyv0); + lb = 0; + cg0 = cyv0; + cg1 = cyv1; + for (k=2; k<=n; k++) { + cyk = 2.0*(v0+k-1.0)*cg1/z-cg0; + yak = abs(cyk); + ya1 = abs(cg0); + if ((yak < ya0) && (yak< ya1)) lb = k; + cyv[k] = cyk; + cg0 = cg1; + cg1 = cyk; + } + lb0 = 0; + if ((lb > 4) && (imag(z) != 0.0)) { + while(lb != lb0) { + ch2 = cone; + ch1 = czero; + lb0 = lb; + for (k=lb; k>=1; k--) { + ch0 = 2.0*(k+v0)*ch1/z-ch2; + ch2 = ch1; + ch1 = ch0; + } + cp12 = ch0; + cp22 = ch2; + ch2 = czero; + ch1 = cone; + for (k=lb; k>=1; k--) { + ch0 = 2.0*(k+v0)*ch1/z-ch2; + ch2 = ch1; + ch1 = ch0; + } + cp11 = ch0; + cp21 = ch2; + if (lb == n) + cjv[lb+1] = 2.0*(lb+v0)*cjv[lb]/z-cjv[lb-1]; + if (abs(cjv[0]) > abs(cjv[1])) { + cyv[lb+1] = (cjv[lb+1]*cyv0-2.0*cp11/(M_PI*z))/cjv[0]; + cyv[lb] = (cjv[lb]*cyv0+2.0*cp12/(M_PI*z))/cjv[0]; + } + else { + cyv[lb+1] = (cjv[lb+1]*cyv1-2.0*cp21/(M_PI*z))/cjv[1]; + cyv[lb] = (cjv[lb]*cyv1+2.0*cp22/(M_PI*z))/cjv[1]; + } + cyl2 = cyv[lb+1]; + cyl1 = cyv[lb]; + for (k=lb-1; k>=0; k--) { + cylk = 2.0*(k+v0+1.0)*cyl1/z-cyl2; + cyv[k] = cylk; + cyl2 = cyl1; + cyl1 = cylk; + } + cyl1 = cyv[lb]; + cyl2 = cyv[lb+1]; + for (k=lb+1; k= numVals) return; - double nuDelta = (nuEnd - nuStart)/(numVals - 1); - - double nu = nuStart + i*nuDelta; - double n = 0.0; - double jNu; - double jK; - for(int j=1; j>>(gpuN, gpuK, nVals, nuStart, nuEnd, nOffset); - - HANDLE_ERROR(cudaMemcpy(cpuN, gpuN, sizeof(double)*nVals, cudaMemcpyDeviceToHost)); - - //free resources - HANDLE_ERROR(cudaFree(gpuK)); - HANDLE_ERROR(cudaFree(gpuN)); -} - -__global__ void devComputeSpectrum(double* I, double2* B, double* alpha, int Nl, - int nSamples, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO) -{ - int i = blockIdx.x * blockDim.x + threadIdx.x; - if(i >= nLambda) - return; - - //compute the delta-theta value - double dTheta = (oThetaO - oThetaI)/nSamples; - - //allocate space for the Legendre polynomials - double Ptheta[2]; - - double cosTheta, theta; - cuDoubleComplex Us; - cuDoubleComplex UsSample; - cuDoubleComplex U; - //cuComplex Ui; - //Ui.x = 2*PI; - //Ui.y = 0.0; - cuDoubleComplex numer; - numer.x = 0.0; - cuDoubleComplex exp_numer; - cuDoubleComplex iL; - cuDoubleComplex imag; - imag.x = 0.0; imag.y = 1.0; - double realFac; - cuDoubleComplex complexFac; - double PlTheta; - double Isum = 0.0; - //float maxVal = 0; - //float val; - for(int iTheta = 0; iTheta < nSamples; iTheta++) - { - //calculate theta - theta = iTheta * dTheta + oThetaI; - cosTheta = cos(theta); - - //initialize the theta Legendre polynomial - Ptheta[0] = 1.0; - Ptheta[1] = cosTheta; - - //initialize the scattered field - Us.x = Us.y = 0.0; - iL.x = 1.0; - iL.y = 0.0; - for(int l = 0; l= cThetaI && theta <= cThetaO) - U = cAdd(Us, 2*PI); - else - U = Us; - Isum += (U.x*U.x + U.y*U.y) * sin(theta) * 2 * PI * dTheta; - } - - I[i] = Isum; -} - -void cudaComputeSpectrum(double* cpuI, double* cpuB, double* cpuAlpha, - int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples) -{ - //copy everything to the GPU - double2* gpuB; - HANDLE_ERROR(cudaMalloc(&gpuB, sizeof(double2) * nLambda * Nl)); - HANDLE_ERROR(cudaMemcpy(gpuB, cpuB, sizeof(double2) * nLambda * Nl, cudaMemcpyHostToDevice)); - - - double* gpuAlpha; - HANDLE_ERROR(cudaMalloc(&gpuAlpha, sizeof(double) * Nl)); - HANDLE_ERROR(cudaMemcpy(gpuAlpha, cpuAlpha, sizeof(double) * Nl, cudaMemcpyHostToDevice)); - - double* gpuI; - HANDLE_ERROR(cudaMalloc(&gpuI, sizeof(double) * nLambda)); - HANDLE_ERROR(cudaMemset(gpuI, 0, sizeof(double) * nLambda)); - - - //call the kernel to compute the spectrum - dim3 block(BLOCK_SIZE*BLOCK_SIZE); - dim3 grid(nLambda/block.x + 1); - - //devComputeSpectrum - devComputeSpectrum<<>>(gpuI, (double2*)gpuB, gpuAlpha, Nl, - nSamples, nLambda, oThetaI, oThetaO, cThetaI, cThetaO); - - HANDLE_ERROR(cudaMemcpy(cpuI, gpuI, sizeof(double) * nLambda, cudaMemcpyDeviceToHost)); - - //printf("Final array value: %f\n", cpuI[nLambda-1]); - - HANDLE_ERROR(cudaFree(gpuB)); - HANDLE_ERROR(cudaFree(gpuAlpha)); - HANDLE_ERROR(cudaFree(gpuI)); - - - - +#include +using namespace std; + +__device__ double g(double v0, double v1) +{ + return (v0 + v1)*log(abs(v0+v1)) + (v0-v1)*log(abs(v0-v1)); +} + +__device__ double hfin(double v0, double v1, double dv) +{ + double e = 0.001; + double t0 = g(v0+e, v1-dv)/dv; + double t1 = 2*g(v0+e, v1)/dv; + double t2 = g(v0+e, v1+dv)/dv; + + return -1.0/PI * (t0 - t1 + t2); +} + +__global__ void devKramersKronig(double* gpuN, double* gpuK, int numVals, double nuStart, double nuEnd, double nOffset) +{ + int i = blockIdx.x * blockDim.x + threadIdx.x; + + if(i >= numVals) return; + double nuDelta = (nuEnd - nuStart)/(numVals - 1); + + double nu = nuStart + i*nuDelta; + double n = 0.0; + double jNu; + double jK; + for(int j=1; j>>(gpuN, gpuK, nVals, nuStart, nuEnd, nOffset); + + HANDLE_ERROR(cudaMemcpy(cpuN, gpuN, sizeof(double)*nVals, cudaMemcpyDeviceToHost)); + + //free resources + HANDLE_ERROR(cudaFree(gpuK)); + HANDLE_ERROR(cudaFree(gpuN)); +} + +__global__ void devComputeSpectrum(double* I, double2* B, double* alpha, int Nl, + int nSamples, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO) +{ + int i = blockIdx.x * blockDim.x + threadIdx.x; + if(i >= nLambda) + return; + + //compute the delta-theta value + double dTheta = (oThetaO - oThetaI)/nSamples; + + //allocate space for the Legendre polynomials + double Ptheta[2]; + + double cosTheta, theta; + cuDoubleComplex Us; + cuDoubleComplex UsSample; + cuDoubleComplex U; + //cuComplex Ui; + //Ui.x = 2*PI; + //Ui.y = 0.0; + cuDoubleComplex numer; + numer.x = 0.0; + cuDoubleComplex exp_numer; + cuDoubleComplex iL; + cuDoubleComplex imag; + imag.x = 0.0; + imag.y = 1.0; + double realFac; + cuDoubleComplex complexFac; + double PlTheta; + double Isum = 0.0; + //float maxVal = 0; + //float val; + for(int iTheta = 0; iTheta < nSamples; iTheta++) + { + //calculate theta + theta = iTheta * dTheta + oThetaI; + cosTheta = cos(theta); + + //initialize the theta Legendre polynomial + Ptheta[0] = 1.0; + Ptheta[1] = cosTheta; + + //initialize the scattered field + Us.x = Us.y = 0.0; + iL.x = 1.0; + iL.y = 0.0; + for(int l = 0; l= cThetaI && theta <= cThetaO) + U = cAdd(Us, 2*PI); + else + U = Us; + Isum += (U.x*U.x + U.y*U.y) * sin(theta) * 2 * PI * dTheta; + } + + I[i] = Isum; +} + +void cudaComputeSpectrum(double* cpuI, double* cpuB, double* cpuAlpha, + int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples) +{ + //copy everything to the GPU + double2* gpuB; + HANDLE_ERROR(cudaMalloc(&gpuB, sizeof(double2) * nLambda * Nl)); + HANDLE_ERROR(cudaMemcpy(gpuB, cpuB, sizeof(double2) * nLambda * Nl, cudaMemcpyHostToDevice)); + + + double* gpuAlpha; + HANDLE_ERROR(cudaMalloc(&gpuAlpha, sizeof(double) * Nl)); + HANDLE_ERROR(cudaMemcpy(gpuAlpha, cpuAlpha, sizeof(double) * Nl, cudaMemcpyHostToDevice)); + + double* gpuI; + HANDLE_ERROR(cudaMalloc(&gpuI, sizeof(double) * nLambda)); + HANDLE_ERROR(cudaMemset(gpuI, 0, sizeof(double) * nLambda)); + + + //call the kernel to compute the spectrum + dim3 block(BLOCK_SIZE*BLOCK_SIZE); + dim3 grid(nLambda/block.x + 1); + + //devComputeSpectrum + devComputeSpectrum<<>>(gpuI, (double2*)gpuB, gpuAlpha, Nl, + nSamples, nLambda, oThetaI, oThetaO, cThetaI, cThetaO); + + HANDLE_ERROR(cudaMemcpy(cpuI, gpuI, sizeof(double) * nLambda, cudaMemcpyDeviceToHost)); + + //printf("Final array value: %f\n", cpuI[nLambda-1]); + + HANDLE_ERROR(cudaFree(gpuB)); + HANDLE_ERROR(cudaFree(gpuAlpha)); + HANDLE_ERROR(cudaFree(gpuI)); + + + + } diff --git a/cudaMain.cu b/cudaMain.cu index 7d163d6..d659588 100644 --- a/cudaMain.cu +++ b/cudaMain.cu @@ -1,61 +1,61 @@ -#include "cuComplex.h" -#include "cudaHandleError.h" - - -#define PI 3.14159 -#define BLOCK_SIZE 16 - -__device__ cuDoubleComplex cMult(cuDoubleComplex a, cuDoubleComplex b) -{ - cuDoubleComplex result; - result.x = a.x * b.x - a.y * b.y; - result.y = a.x * b.y + a.y * b.x; - - return result; -} - -__device__ cuDoubleComplex cMult(cuDoubleComplex a, float b) -{ - cuDoubleComplex result; - result.x = a.x * b; - result.y = a.y * b; - - return result; -} - -__device__ cuDoubleComplex cAdd(cuDoubleComplex a, cuDoubleComplex b) -{ - cuDoubleComplex r; - r.x = a.x + b.x; - r.y = a.y + b.y; - - return r; -} - -__device__ cuDoubleComplex cAdd(cuDoubleComplex a, float b) -{ - cuDoubleComplex r; - r.x = a.x + b; - r.y = a.y; - - return r; -} - -__device__ cuDoubleComplex cExp(cuDoubleComplex a) -{ - cuDoubleComplex r; - - r.x = exp(a.x) * cos(a.y); - r.y = exp(a.x) * sin(a.y); - - return r; -} - -__device__ double cMag(cuDoubleComplex a) -{ - double r = sqrt(a.x * a.x + a.y * a.y); - return r; -} - -#include "cudaKK.h" - +#include "cuComplex.h" +#include "cudaHandleError.h" + + +#define PI 3.14159 +#define BLOCK_SIZE 16 + +__device__ cuDoubleComplex cMult(cuDoubleComplex a, cuDoubleComplex b) +{ + cuDoubleComplex result; + result.x = a.x * b.x - a.y * b.y; + result.y = a.x * b.y + a.y * b.x; + + return result; +} + +__device__ cuDoubleComplex cMult(cuDoubleComplex a, float b) +{ + cuDoubleComplex result; + result.x = a.x * b; + result.y = a.y * b; + + return result; +} + +__device__ cuDoubleComplex cAdd(cuDoubleComplex a, cuDoubleComplex b) +{ + cuDoubleComplex r; + r.x = a.x + b.x; + r.y = a.y + b.y; + + return r; +} + +__device__ cuDoubleComplex cAdd(cuDoubleComplex a, float b) +{ + cuDoubleComplex r; + r.x = a.x + b; + r.y = a.y; + + return r; +} + +__device__ cuDoubleComplex cExp(cuDoubleComplex a) +{ + cuDoubleComplex r; + + r.x = exp(a.x) * cos(a.y); + r.y = exp(a.x) * sin(a.y); + + return r; +} + +__device__ double cMag(cuDoubleComplex a) +{ + double r = sqrt(a.x * a.x + a.y * a.y); + return r; +} + +#include "cudaKK.h" + diff --git a/etaToluene.txt b/etaToluene.txt new file mode 100644 index 0000000..b2148a7 --- /dev/null +++ b/etaToluene.txt @@ -0,0 +1,1602 @@ +nu n k +800 1.441201025 0.002370971 +802 1.442449524 0.002279499 +804 1.443622415 0.002218164 +806 1.444731575 0.00217471 +808 1.445769313 0.002154818 +810 1.446735153 0.002133884 +812 1.447631537 0.002093632 +814 1.448499976 0.002020828 +816 1.449371594 0.001935851 +818 1.450245111 0.001882509 +820 1.451098381 0.001845384 +822 1.451931801 0.001835367 +824 1.452743077 0.001859742 +826 1.453538627 0.001906472 +828 1.454316144 0.001993264 +830 1.455057831 0.002134999 +832 1.455752574 0.002332258 +834 1.456373935 0.00257594 +836 1.45689904 0.00287502 +838 1.457307689 0.003187541 +840 1.457541056 0.00349171 +842 1.457622779 0.003661082 +844 1.45763705 0.003626834 +846 1.457709742 0.003400597 +848 1.457929984 0.003056081 +850 1.458311946 0.002701293 +852 1.458792141 0.002396757 +854 1.459332546 0.002178644 +856 1.459889834 0.002030216 +858 1.460439885 0.001936861 +860 1.460982928 0.001877498 +862 1.461517236 0.00185772 +864 1.462038725 0.001889109 +866 1.462531922 0.001950935 +868 1.462978568 0.00204692 +870 1.463376438 0.002155221 +872 1.463691463 0.002260164 +874 1.463946436 0.002246045 +876 1.46431344 0.002102302 +878 1.464835949 0.001997437 +880 1.465438552 0.001992183 +882 1.46608463 0.002084809 +884 1.466770232 0.002282701 +886 1.467508982 0.002620306 +888 1.468317634 0.00319353 +890 1.469128024 0.004219724 +892 1.46954514 0.006023859 +894 1.468393318 0.00840405 +896 1.465223625 0.009006755 +898 1.463241024 0.006966132 +900 1.463248052 0.004995548 +902 1.463894773 0.003838499 +904 1.464602858 0.003205237 +906 1.465241891 0.00285555 +908 1.465786159 0.002664765 +910 1.466248706 0.002546277 +912 1.466651178 0.002453415 +914 1.467032669 0.002364593 +916 1.467407655 0.002292823 +918 1.46779669 0.00223036 +920 1.468201898 0.002212279 +922 1.468611417 0.002242387 +924 1.469017595 0.002350077 +926 1.469359926 0.002567263 +928 1.469513165 0.00284644 +930 1.469451982 0.00294228 +932 1.469507737 0.002759167 +934 1.469802525 0.00258731 +936 1.47016397 0.002557196 +938 1.470505278 0.002621533 +940 1.470798022 0.002738964 +942 1.471029562 0.002875389 +944 1.471215597 0.002997329 +946 1.471371939 0.003096987 +948 1.471520088 0.003166052 +950 1.471676729 0.003204709 +952 1.471870413 0.003234913 +954 1.472084483 0.003296926 +956 1.472297379 0.003385829 +958 1.472502688 0.003503316 +960 1.472670115 0.003659948 +962 1.472776059 0.00382798 +964 1.472810962 0.003950488 +966 1.472833778 0.003999093 +968 1.472885211 0.003977479 +970 1.473006806 0.003933385 +972 1.473183366 0.003915274 +974 1.473380818 0.003937115 +976 1.473579696 0.004020582 +978 1.47371821 0.004148016 +980 1.473755273 0.004260284 +982 1.473742435 0.004243433 +984 1.473813229 0.004119949 +986 1.473984876 0.003998672 +988 1.474206293 0.003886511 +990 1.474481309 0.003799505 +992 1.474815078 0.00373978 +994 1.475182296 0.003738812 +996 1.475570232 0.003799565 +998 1.475963266 0.003936431 +1000 1.476300807 0.004184267 +1002 1.476368232 0.004483668 +1004 1.476369967 0.004213951 +1006 1.476895249 0.004008063 +1008 1.477500322 0.003959639 +1010 1.478191588 0.003995866 +1012 1.478975059 0.004124533 +1014 1.479861671 0.004356501 +1016 1.480895138 0.004708233 +1018 1.482142712 0.005256522 +1020 1.48362439 0.006200346 +1022 1.48502768 0.007610747 +1024 1.48723564 0.009048626 +1026 1.490922897 0.012842061 +1028 1.49396376 0.023205465 +1030 1.478739354 0.040107032 +1032 1.461784885 0.023766251 +1034 1.466147284 0.015090077 +1036 1.469449728 0.01362093 +1038 1.470761398 0.01407228 +1040 1.470518602 0.014852004 +1042 1.469251081 0.015041876 +1044 1.467778886 0.01427413 +1046 1.466770622 0.01279836 +1048 1.466441044 0.011102025 +1050 1.466660858 0.009538868 +1052 1.467249956 0.008235735 +1054 1.46804819 0.007220159 +1056 1.468976816 0.006471992 +1058 1.469955855 0.005954506 +1060 1.470985909 0.00562082 +1062 1.472067145 0.005471556 +1064 1.47321735 0.005511631 +1066 1.474451756 0.005773786 +1068 1.475791945 0.006332171 +1070 1.477216814 0.007315265 +1072 1.478635789 0.008889418 +1074 1.479890364 0.011193667 +1076 1.480860176 0.014562718 +1078 1.480694748 0.019882054 +1080 1.476167315 0.027210144 +1082 1.463907719 0.0294764 +1084 1.455702239 0.02070909 +1086 1.455979715 0.012765529 +1088 1.458369419 0.008540043 +1090 1.460662356 0.006355266 +1092 1.462558732 0.005181408 +1094 1.464110518 0.00455405 +1096 1.465407938 0.00426269 +1098 1.466512044 0.004235102 +1100 1.46743002 0.00446506 +1102 1.468108911 0.004966537 +1104 1.468358263 0.005807079 +1106 1.467623162 0.006667401 +1108 1.466185738 0.006247327 +1110 1.465723585 0.004799082 +1112 1.466149203 0.003611219 +1114 1.466844726 0.002879426 +1116 1.467543668 0.002461487 +1118 1.468167662 0.002227789 +1120 1.468718605 0.002096505 +1122 1.469207707 0.002021218 +1124 1.469650731 0.00199324 +1126 1.4700526 0.002007979 +1128 1.470402126 0.002048125 +1130 1.470687738 0.002094174 +1132 1.470960018 0.002098497 +1134 1.471252614 0.00210954 +1136 1.471548918 0.002149273 +1138 1.471836992 0.002217813 +1140 1.47209801 0.002316543 +1142 1.472334568 0.002417003 +1144 1.472575735 0.002520905 +1146 1.472833567 0.002659262 +1148 1.473072594 0.002866525 +1150 1.473263818 0.003136477 +1152 1.473369962 0.003474161 +1154 1.473307105 0.003876619 +1156 1.472935095 0.004100433 +1158 1.472665948 0.003948862 +1160 1.472597073 0.003731488 +1162 1.472679826 0.003504946 +1164 1.47288582 0.003340222 +1166 1.473175646 0.003240538 +1168 1.473557613 0.003237282 +1170 1.474022096 0.003370304 +1172 1.474591972 0.003703318 +1174 1.475290735 0.004468614 +1176 1.47579202 0.006270984 +1178 1.473894528 0.009310786 +1180 1.46944889 0.007950277 +1182 1.46919538 0.005056482 +1184 1.469937066 0.003777164 +1186 1.47058585 0.003191365 +1188 1.47109418 0.002901376 +1190 1.47148385 0.002757916 +1192 1.471773562 0.002692267 +1194 1.47196611 0.00266088 +1196 1.472077286 0.002588178 +1198 1.472200969 0.002417009 +1200 1.472450427 0.00221559 +1202 1.472836622 0.002112174 +1204 1.473304311 0.002201829 +1206 1.473753424 0.002612947 +1208 1.47385318 0.003479745 +1210 1.472800275 0.004379301 +1212 1.47140252 0.003426489 +1214 1.471594891 0.002272601 +1216 1.472055163 0.001782587 +1218 1.4724316 0.001543926 +1220 1.472739169 0.001396985 +1222 1.47301273 0.001292807 +1224 1.473263934 0.001219469 +1226 1.473498895 0.001171845 +1228 1.473716592 0.00113723 +1230 1.473930592 0.001119123 +1232 1.474133787 0.00111391 +1234 1.4743347 0.001124438 +1236 1.474530392 0.001156601 +1238 1.474716479 0.001210456 +1240 1.47488492 0.001292746 +1242 1.475028515 0.001403963 +1244 1.475124956 0.001544106 +1246 1.475144089 0.001698604 +1248 1.475058922 0.001808401 +1250 1.474899721 0.00177689 +1252 1.474841067 0.001576011 +1254 1.474939237 0.001381063 +1256 1.475098463 0.001256209 +1258 1.475265678 0.001187172 +1260 1.475420572 0.001144965 +1262 1.475574395 0.001114299 +1264 1.47572117 0.001097405 +1266 1.475867451 0.001089675 +1268 1.476011473 0.001093157 +1270 1.476147019 0.001107013 +1272 1.476270154 0.001125473 +1274 1.47638091 0.001144171 +1276 1.476483619 0.001155498 +1278 1.476581834 0.001158617 +1280 1.476683135 0.001145768 +1282 1.476799599 0.001123074 +1284 1.476932611 0.001108033 +1286 1.477072975 0.001097907 +1288 1.477222834 0.001097104 +1290 1.477380706 0.001106987 +1292 1.477543374 0.001132459 +1294 1.477707163 0.001175521 +1296 1.477860282 0.001242672 +1298 1.477988876 0.001322776 +1300 1.478089342 0.00139218 +1302 1.478182431 0.001429737 +1304 1.478308272 0.001441882 +1306 1.478493641 0.001475415 +1308 1.478712211 0.001599567 +1310 1.478858087 0.001868439 +1312 1.478730102 0.002164861 +1314 1.478458036 0.002117289 +1316 1.478449306 0.001875076 +1318 1.478611792 0.001716774 +1320 1.478814603 0.001648375 +1322 1.479022917 0.001638998 +1324 1.479220666 0.001664106 +1326 1.479414128 0.001717646 +1328 1.479592108 0.001804795 +1330 1.479731678 0.001942749 +1332 1.479726919 0.002060225 +1334 1.479751059 0.001962173 +1336 1.479935123 0.001884928 +1338 1.480148376 0.001871222 +1340 1.480373607 0.001889214 +1342 1.480600388 0.001937007 +1344 1.480827533 0.002003134 +1346 1.481049681 0.002087781 +1348 1.481265532 0.002180662 +1350 1.481487164 0.002265881 +1352 1.481736476 0.002362769 +1354 1.482004468 0.002489159 +1356 1.482275995 0.002655474 +1358 1.48252792 0.002848203 +1360 1.482763249 0.003032115 +1362 1.483034583 0.003195386 +1364 1.483382233 0.003380113 +1366 1.483799025 0.003639964 +1368 1.484272236 0.004002658 +1370 1.484829603 0.00448977 +1372 1.48552802 0.005257737 +1374 1.486275464 0.006620297 +1376 1.486517001 0.009083761 +1378 1.484325992 0.012303151 +1380 1.47977969 0.012167198 +1382 1.478003551 0.009400075 +1384 1.478053165 0.007543182 +1386 1.478421432 0.006403564 +1388 1.478900248 0.005632571 +1390 1.479406516 0.005110109 +1392 1.479917129 0.004757894 +1394 1.480417549 0.004528335 +1396 1.480897509 0.004401862 +1398 1.481351587 0.004336878 +1400 1.481797711 0.004323178 +1402 1.482240699 0.004361754 +1404 1.482665796 0.004446542 +1406 1.483059442 0.004580452 +1408 1.483422987 0.004720702 +1410 1.483790308 0.004847301 +1412 1.484190359 0.004991696 +1414 1.484613428 0.005175265 +1416 1.485051641 0.005408562 +1418 1.485480056 0.00569302 +1420 1.485885882 0.006036094 +1422 1.486260365 0.006398155 +1424 1.486596633 0.006767043 +1426 1.486908375 0.007097025 +1428 1.487267526 0.007352865 +1430 1.487756499 0.007589461 +1432 1.488416197 0.007867817 +1434 1.489247587 0.00830203 +1436 1.49022965 0.00898232 +1438 1.491261092 0.010019784 +1440 1.492201579 0.011509506 +1442 1.492747862 0.013398599 +1444 1.492754368 0.015376887 +1446 1.492440408 0.017176535 +1448 1.492035068 0.01893611 +1450 1.49142868 0.020824529 +1452 1.490404699 0.022803925 +1454 1.488886984 0.024681051 +1456 1.486877843 0.026261841 +1458 1.484428504 0.027360806 +1460 1.481747232 0.027793093 +1462 1.479066932 0.027470624 +1464 1.476679553 0.026421119 +1466 1.47482397 0.024798079 +1468 1.473644256 0.022829656 +1470 1.473199283 0.020783461 +1472 1.473390477 0.018872465 +1474 1.474116298 0.017180199 +1476 1.475333747 0.015792075 +1478 1.47696196 0.014728301 +1480 1.479085272 0.014003049 +1482 1.481808665 0.013756925 +1484 1.48531764 0.01418798 +1486 1.489949287 0.015922624 +1488 1.494990654 0.020194058 +1490 1.501195156 0.026083679 +1492 1.509903786 0.040120276 +1494 1.511966946 0.076178677 +1496 1.445607958 0.108223079 +1498 1.414560032 0.052724926 +1500 1.425687258 0.027163552 +1502 1.435092428 0.017332219 +1504 1.441798717 0.012488921 +1506 1.446695961 0.009921313 +1508 1.450331767 0.008397527 +1510 1.453186827 0.007451763 +1512 1.45545228 0.006880209 +1514 1.457319215 0.006485335 +1516 1.458949324 0.006281002 +1518 1.460412276 0.006293795 +1520 1.461761735 0.006700333 +1522 1.462443847 0.007864531 +1524 1.461222896 0.008610001 +1526 1.460432858 0.006970267 +1528 1.461281615 0.005652274 +1530 1.462269708 0.00510003 +1532 1.463067013 0.004873301 +1534 1.463664 0.004776434 +1536 1.464094179 0.004671773 +1538 1.464441095 0.004490224 +1540 1.464777048 0.004239347 +1542 1.465191657 0.00393426 +1544 1.465688526 0.003656601 +1546 1.466238893 0.003489234 +1548 1.46677633 0.003427108 +1550 1.467191673 0.003468987 +1552 1.467477728 0.003382955 +1554 1.467919322 0.003213785 +1556 1.468447563 0.003134306 +1558 1.468982556 0.003169074 +1560 1.46952197 0.003304817 +1562 1.469996105 0.00356172 +1564 1.470387926 0.003888984 +1566 1.470664197 0.004296389 +1568 1.47075697 0.004721133 +1570 1.470675807 0.005049292 +1572 1.470472242 0.005192861 +1574 1.470309764 0.005092022 +1576 1.470330922 0.004817698 +1578 1.470574897 0.004555438 +1580 1.470999073 0.00435936 +1582 1.471583642 0.004339902 +1584 1.4721379 0.004607263 +1586 1.472404549 0.004920037 +1588 1.472734555 0.00490704 +1590 1.473437241 0.004927535 +1592 1.474460918 0.005185889 +1594 1.475741944 0.005925432 +1596 1.477051732 0.00720758 +1598 1.478673359 0.009128905 +1600 1.480620288 0.013029368 +1602 1.480361683 0.020680995 +1604 1.471342992 0.029995359 +1606 1.455082768 0.024815734 +1608 1.45359592 0.012735845 +1610 1.456936261 0.007467836 +1612 1.459649264 0.005372098 +1614 1.461565353 0.004451296 +1616 1.462944851 0.004053293 +1618 1.463933847 0.003991463 +1620 1.464541591 0.004096596 +1622 1.464785362 0.004250861 +1624 1.464675723 0.004253062 +1626 1.464436751 0.003880135 +1628 1.464428733 0.003227653 +1630 1.464682454 0.002598051 +1632 1.46507305 0.002086572 +1634 1.465510023 0.001698439 +1636 1.465976195 0.001417854 +1638 1.46639465 0.00123235 +1640 1.466777147 0.001097643 +1642 1.467133507 0.000997096 +1644 1.467460665 0.000923944 +1646 1.467776889 0.000867695 +1648 1.468072302 0.00085799 +1650 1.468323132 0.000876926 +1652 1.468535355 0.000900484 +1654 1.468711262 0.000924599 +1656 1.46886442 0.000943403 +1658 1.468977178 0.00095719 +1660 1.469060193 0.000919302 +1662 1.469173361 0.000829981 +1664 1.46933993 0.00074192 +1666 1.469532185 0.000684455 +1668 1.469734587 0.000660487 +1670 1.46993137 0.00067733 +1672 1.47010973 0.000733664 +1674 1.470235927 0.000829672 +1676 1.470261895 0.000923202 +1678 1.470230428 0.000900896 +1680 1.470268242 0.000787132 +1682 1.470391952 0.000676996 +1684 1.470558163 0.000611701 +1686 1.47072223 0.000595044 +1688 1.470881225 0.000601913 +1690 1.471020294 0.000631185 +1692 1.471140847 0.000675094 +1694 1.4712396 0.000731422 +1696 1.471287792 0.000808376 +1698 1.471263994 0.00079428 +1700 1.471328964 0.000709355 +1702 1.471436818 0.000657251 +1704 1.471559458 0.000631084 +1706 1.471675566 0.00062063 +1708 1.471789402 0.000614805 +1710 1.471906048 0.000610379 +1712 1.472029443 0.000608366 +1714 1.472165687 0.000610178 +1716 1.472315399 0.000628061 +1718 1.472483869 0.000671391 +1720 1.472654475 0.000748671 +1722 1.472817311 0.000874314 +1724 1.472950429 0.001041238 +1726 1.473046007 0.001237492 +1728 1.473093759 0.001471848 +1730 1.473059395 0.001732234 +1732 1.472917418 0.001975823 +1734 1.47267689 0.002155434 +1736 1.472355338 0.002204526 +1738 1.472048818 0.002091193 +1740 1.47183344 0.001857001 +1742 1.471742434 0.00156446 +1744 1.471768805 0.001278243 +1746 1.471881629 0.001038306 +1748 1.472046322 0.000858083 +1750 1.472232414 0.000736721 +1752 1.47242316 0.000665836 +1754 1.472608674 0.000633015 +1756 1.472783278 0.000636204 +1758 1.472932588 0.000664561 +1760 1.473060858 0.000700854 +1762 1.47317848 0.00073825 +1764 1.473290453 0.000779473 +1766 1.473395502 0.000831333 +1768 1.473491455 0.000887484 +1770 1.473578175 0.000943101 +1772 1.473667126 0.00100856 +1774 1.473739298 0.001088156 +1776 1.473785511 0.001173368 +1778 1.47379002 0.001227206 +1780 1.473813896 0.001208673 +1782 1.473923549 0.001173465 +1784 1.4740917 0.001193719 +1786 1.474271982 0.001285337 +1788 1.474426157 0.001425909 +1790 1.474572919 0.001580549 +1792 1.474748784 0.001798508 +1794 1.474893485 0.002133319 +1796 1.474934899 0.002583712 +1798 1.474781105 0.003106518 +1800 1.474370814 0.003584561 +1802 1.473736221 0.003845351 +1804 1.473045883 0.003772087 +1806 1.472512227 0.003409507 +1808 1.472234727 0.002925899 +1810 1.472178211 0.002462305 +1812 1.472272365 0.002095033 +1814 1.4724386 0.001852627 +1816 1.472597486 0.001717021 +1818 1.472717182 0.001638864 +1820 1.472795358 0.001577308 +1822 1.472849206 0.001496792 +1824 1.472912356 0.001388637 +1826 1.473013974 0.001277435 +1828 1.47314853 0.001184564 +1830 1.473293302 0.001129054 +1832 1.473425437 0.001086064 +1834 1.473570566 0.001030861 +1836 1.473758736 0.00098496 +1838 1.473981581 0.000979289 +1840 1.474224453 0.001022886 +1842 1.474480777 0.001120679 +1844 1.474745868 0.001283946 +1846 1.475006131 0.001527239 +1848 1.475247239 0.001888266 +1850 1.475396699 0.002392276 +1852 1.475351258 0.003009719 +1854 1.475042175 0.003640594 +1856 1.474423945 0.004145277 +1858 1.473584937 0.004284184 +1860 1.47284787 0.003973418 +1862 1.4724611 0.003434379 +1864 1.472411327 0.002946984 +1866 1.472536164 0.002656852 +1868 1.472665029 0.002575548 +1870 1.472679666 0.002623622 +1872 1.472529231 0.002673206 +1874 1.472271964 0.002596706 +1876 1.472035096 0.002353418 +1878 1.471921073 0.002013524 +1880 1.471942987 0.001671625 +1882 1.472053638 0.001387567 +1884 1.472207083 0.00117033 +1886 1.472370953 0.001011206 +1888 1.472530627 0.000892343 +1890 1.472681675 0.000799798 +1892 1.472830389 0.000722584 +1894 1.472985008 0.000668206 +1896 1.473131098 0.000645564 +1898 1.473247692 0.000645768 +1900 1.473331292 0.000633984 +1902 1.473415571 0.000588098 +1904 1.473530879 0.000535949 +1906 1.473665341 0.00050098 +1908 1.47380841 0.000480504 +1910 1.473958285 0.000475813 +1912 1.474113403 0.000486824 +1914 1.474274 0.000515196 +1916 1.47443781 0.000562568 +1918 1.474605934 0.000630428 +1920 1.474775821 0.00072361 +1922 1.474938799 0.000847642 +1924 1.475084387 0.00099279 +1926 1.475226982 0.001144293 +1928 1.475392648 0.001317285 +1930 1.475582607 0.001558937 +1932 1.475762194 0.001903731 +1934 1.475876407 0.002375566 +1936 1.475839086 0.002980401 +1938 1.475530609 0.003642932 +1940 1.474891504 0.004165896 +1942 1.474095429 0.004339444 +1944 1.47334202 0.004204135 +1946 1.472750025 0.003801614 +1948 1.472449258 0.003277199 +1950 1.472399446 0.002825764 +1952 1.472475793 0.002533488 +1954 1.472554597 0.002394375 +1956 1.472561971 0.002346038 +1958 1.472465217 0.002325749 +1960 1.472281353 0.002200395 +1962 1.472125511 0.001994452 +1964 1.472020751 0.001704955 +1966 1.472027616 0.001378758 +1968 1.472134206 0.001096906 +1970 1.472290432 0.000878129 +1972 1.472468078 0.000721601 +1974 1.472650017 0.00061742 +1976 1.472826436 0.000562113 +1978 1.472982261 0.000551026 +1980 1.473106514 0.000575712 +1982 1.473179497 0.000615371 +1984 1.473216719 0.000626639 +1986 1.473270062 0.000619345 +1988 1.473326863 0.000644973 +1990 1.473329296 0.000691942 +1992 1.473278226 0.000694255 +1994 1.473221507 0.000622443 +1996 1.473236186 0.0004952 +1998 1.473318243 0.00040262 +2000 1.473411355 0.00035752 +2002 1.473494127 0.000340716 +2004 1.473561544 0.000340726 +2006 1.473612248 0.000349588 +2008 1.473641865 0.00035789 +2010 1.47365636 0.000352783 +2012 1.473673369 0.000327905 +2014 1.473702337 0.0002987 +2016 1.473734437 0.000271842 +2018 1.473772058 0.000242333 +2020 1.473816484 0.000218337 +2022 1.473861113 0.000199195 +2024 1.47390578 0.000183912 +2026 1.473950288 0.000171888 +2028 1.473995645 0.000164785 +2030 1.474036603 0.000164392 +2032 1.474065198 0.000169012 +2034 1.47408331 0.000154128 +2036 1.47412047 0.000133851 +2038 1.474160982 0.000121768 +2040 1.474201156 0.000114542 +2042 1.47423947 0.000109961 +2044 1.474276129 0.000107325 +2046 1.474312184 0.00010532 +2048 1.474346481 0.0001044 +2050 1.474380714 0.000104561 +2052 1.474412784 0.000105683 +2054 1.474445206 0.000107138 +2056 1.47447627 0.000109851 +2058 1.474506759 0.000113964 +2060 1.474535887 0.00011916 +2062 1.474563867 0.000125394 +2064 1.474590735 0.000135383 +2066 1.474612054 0.000150829 +2068 1.474618173 0.000163896 +2070 1.474618403 0.000158539 +2072 1.474632772 0.000143857 +2074 1.474654279 0.000133839 +2076 1.474677092 0.000126083 +2078 1.47470099 0.000119111 +2080 1.474725901 0.000113979 +2082 1.474750651 0.000110908 +2084 1.474774681 0.000108575 +2086 1.474797765 0.00010575 +2088 1.474821422 0.000102758 +2090 1.474846336 0.000100315 +2092 1.474871219 9.89E-05 +2094 1.474896096 9.85E-05 +2096 1.474919997 9.87E-05 +2098 1.474944347 9.87E-05 +2100 1.474969806 9.95E-05 +2102 1.474995643 0.000102501 +2104 1.47502159 0.000108578 +2106 1.475044176 0.000117599 +2108 1.475062645 0.00012881 +2110 1.475073954 0.000138078 +2112 1.475083937 0.000139895 +2114 1.47510043 0.000140372 +2116 1.475111984 0.000147184 +2118 1.475112146 0.000142581 +2120 1.475127628 0.000126124 +2122 1.475152113 0.000119111 +2124 1.475171824 0.000117762 +2126 1.475187748 0.000110386 +2128 1.475213108 0.000100586 +2130 1.475241165 9.65E-05 +2132 1.475270052 9.72E-05 +2134 1.475295905 0.000100589 +2136 1.47531935 0.000104482 +2138 1.475342091 0.000107041 +2140 1.475365546 0.000108872 +2142 1.47539141 0.00011149 +2144 1.475417352 0.000115452 +2146 1.475444492 0.000120558 +2148 1.475473425 0.000126538 +2150 1.475506197 0.000134734 +2152 1.475541784 0.000148644 +2154 1.475582035 0.000172041 +2156 1.475621601 0.000210049 +2158 1.475652538 0.000268126 +2160 1.475661516 0.000351069 +2162 1.475612259 0.000450345 +2164 1.475480686 0.000489939 +2166 1.475372967 0.000409493 +2168 1.475362114 0.000304388 +2170 1.475398909 0.000235891 +2172 1.475446566 0.000200519 +2174 1.475491977 0.000185711 +2176 1.475532032 0.000182425 +2178 1.475568644 0.000187449 +2180 1.475602158 0.000203021 +2182 1.475624645 0.000231533 +2184 1.475620856 0.000266979 +2186 1.475589805 0.00027467 +2188 1.47557481 0.000249531 +2190 1.475580335 0.000224075 +2192 1.475592327 0.000200277 +2194 1.475614571 0.000177273 +2196 1.475644341 0.000160286 +2198 1.475678575 0.000150581 +2200 1.475716178 0.000148631 +2202 1.475757268 0.000159419 +2204 1.475793377 0.000190928 +2206 1.475797468 0.000246686 +2208 1.475741896 0.000270255 +2210 1.475711949 0.000222823 +2212 1.47572957 0.0001833 +2214 1.47575472 0.000159208 +2216 1.475786212 0.000141368 +2218 1.475819421 0.000133886 +2220 1.475850887 0.000133378 +2222 1.475878972 0.000136687 +2224 1.475902989 0.000141595 +2226 1.4759247 0.000145519 +2228 1.475947794 0.000148459 +2230 1.475972651 0.000153317 +2232 1.475997487 0.000163254 +2234 1.476018072 0.000178923 +2236 1.476026891 0.000194257 +2238 1.476030055 0.00019645 +2240 1.476042817 0.000188282 +2242 1.476067262 0.000182547 +2244 1.476097849 0.000184193 +2246 1.47612902 0.000192794 +2248 1.476159494 0.000207469 +2250 1.476188521 0.000228636 +2252 1.476214462 0.000256822 +2254 1.476234897 0.000293238 +2256 1.47624408 0.000339844 +2258 1.476230185 0.000394697 +2260 1.476177424 0.000433842 +2262 1.476112288 0.000418808 +2264 1.47608501 0.000365652 +2266 1.476098678 0.000317993 +2268 1.476129099 0.000289252 +2270 1.476164765 0.000276323 +2272 1.476199474 0.000276008 +2274 1.476232531 0.000285195 +2276 1.476263196 0.00030584 +2278 1.476282004 0.000341615 +2280 1.476266804 0.000378324 +2282 1.476243764 0.000375183 +2284 1.476247144 0.000372499 +2286 1.476239393 0.00037913 +2288 1.476222636 0.000369071 +2290 1.476217012 0.000344203 +2292 1.476224148 0.000313724 +2294 1.476246398 0.00028318 +2296 1.476282306 0.000260398 +2298 1.476326374 0.000248364 +2300 1.476373566 0.000246962 +2302 1.476425239 0.000257337 +2304 1.476478147 0.000282117 +2306 1.476529967 0.000327012 +2308 1.476570593 0.000402901 +2310 1.476566051 0.000515679 +2312 1.476464512 0.000613222 +2314 1.476321398 0.000587317 +2316 1.476264349 0.000479704 +2318 1.47628667 0.000387543 +2320 1.476341784 0.000331936 +2322 1.476406262 0.000305882 +2324 1.47647368 0.000301743 +2326 1.476544201 0.000318022 +2328 1.476616937 0.000360763 +2330 1.476682206 0.000442865 +2332 1.476708974 0.000580146 +2334 1.47661953 0.000746878 +2336 1.476406995 0.000778906 +2338 1.476289181 0.000655879 +2340 1.476279224 0.00054986 +2342 1.476296106 0.00047431 +2344 1.476337757 0.000414797 +2346 1.476396689 0.000384139 +2348 1.476454641 0.000382158 +2350 1.476502523 0.000402158 +2352 1.476533968 0.000435516 +2354 1.476551882 0.000472183 +2356 1.476566258 0.000515961 +2358 1.476563425 0.000592576 +2360 1.476468418 0.000693207 +2362 1.476279886 0.000643638 +2364 1.47623361 0.000478342 +2366 1.476283496 0.000369914 +2368 1.476347141 0.000314093 +2370 1.476405794 0.000287309 +2372 1.476456738 0.000274524 +2374 1.476503293 0.000270062 +2376 1.476544739 0.00027183 +2378 1.476585198 0.000279195 +2380 1.476623607 0.000294905 +2382 1.476655091 0.000319348 +2384 1.476679399 0.000350241 +2386 1.476689994 0.000391786 +2388 1.476668323 0.000432288 +2390 1.47662552 0.000431895 +2392 1.476612276 0.000400307 +2394 1.476623269 0.000373781 +2396 1.476645385 0.000355411 +2398 1.47667621 0.000347152 +2400 1.476708403 0.000350924 +2402 1.476737324 0.000365707 +2404 1.476760801 0.000389705 +2406 1.476775668 0.000421335 +2408 1.476777474 0.000459934 +2410 1.47675773 0.000500617 +2412 1.476711765 0.000525703 +2414 1.476658988 0.000513224 +2416 1.476628886 0.000478248 +2418 1.476616099 0.000439596 +2420 1.476618049 0.000399407 +2422 1.476633611 0.000365632 +2424 1.476656153 0.000342099 +2426 1.476679897 0.000327643 +2428 1.476701679 0.000319852 +2430 1.476718893 0.00031809 +2432 1.4767266 0.000318227 +2434 1.476725819 0.000307018 +2436 1.476735887 0.000284561 +2438 1.476756253 0.000265983 +2440 1.476778115 0.000252938 +2442 1.476802013 0.000242679 +2444 1.476826903 0.000236093 +2446 1.476851343 0.000233131 +2448 1.476874688 0.000233167 +2450 1.476895779 0.000235416 +2452 1.476914612 0.000239364 +2454 1.476931215 0.000244209 +2456 1.476944837 0.000248579 +2458 1.476957066 0.000251145 +2460 1.476968412 0.000252431 +2462 1.47698093 0.000253692 +2464 1.476991653 0.000255788 +2466 1.476998922 0.000256434 +2468 1.477005189 0.000251073 +2470 1.477016819 0.000241598 +2472 1.477033711 0.000234162 +2474 1.477051728 0.000229677 +2476 1.477069632 0.000227592 +2478 1.47708839 0.000226834 +2480 1.477105952 0.000227169 +2482 1.47712353 0.000228589 +2484 1.477140454 0.000231746 +2486 1.477155269 0.000236824 +2488 1.477167859 0.0002416 +2490 1.477177464 0.000244394 +2492 1.477187741 0.000244248 +2494 1.477201081 0.000245128 +2496 1.477211169 0.000251435 +2498 1.477209088 0.000247994 +2500 1.477219752 0.000232736 +2502 1.477241531 0.000222498 +2504 1.477268421 0.000221589 +2506 1.477291641 0.00023258 +2508 1.477297932 0.000250427 +2510 1.477287517 0.000252498 +2512 1.47728596 0.00023219 +2514 1.477303462 0.00021105 +2516 1.477328662 0.000198391 +2518 1.477354807 0.000193636 +2520 1.477377783 0.000193342 +2522 1.477396405 0.000193372 +2524 1.477413887 0.000189643 +2526 1.477436743 0.000181795 +2528 1.477466867 0.000178838 +2530 1.477498595 0.000183502 +2532 1.477527981 0.000194837 +2534 1.47755197 0.000211328 +2536 1.477570595 0.000231394 +2538 1.477580089 0.000255837 +2540 1.47756989 0.00027571 +2542 1.477554275 0.000266055 +2544 1.477563613 0.00024386 +2546 1.477586393 0.000235285 +2548 1.477602107 0.000236305 +2550 1.477611366 0.000232544 +2552 1.477623597 0.000218806 +2554 1.477646777 0.000204744 +2556 1.477674747 0.000196655 +2558 1.477702465 0.000191976 +2560 1.477730428 0.000186393 +2562 1.477763616 0.000182465 +2564 1.477799985 0.000182342 +2566 1.477838217 0.000186623 +2568 1.477878061 0.000194772 +2570 1.477920641 0.000207509 +2572 1.477964885 0.000227537 +2574 1.478009562 0.000256126 +2576 1.478053148 0.000293784 +2578 1.478098835 0.000344607 +2580 1.47814186 0.000421001 +2582 1.478159973 0.00053994 +2584 1.478093604 0.000691325 +2586 1.477908663 0.000768064 +2588 1.477734 0.000684349 +2590 1.477674804 0.000536496 +2592 1.477703642 0.000418108 +2594 1.477766627 0.000348163 +2596 1.47783459 0.000316562 +2598 1.477897132 0.000311606 +2600 1.477950764 0.000329719 +2602 1.47798212 0.000370011 +2604 1.477968395 0.000412185 +2606 1.477930226 0.000402482 +2608 1.477933844 0.00036847 +2610 1.477945647 0.000353398 +2612 1.477950473 0.000328282 +2614 1.477975395 0.000295401 +2616 1.478012745 0.000275903 +2618 1.478051085 0.000268299 +2620 1.47808604 0.000267512 +2622 1.478116632 0.000270974 +2624 1.478145774 0.000277238 +2626 1.478171009 0.000286764 +2628 1.478191857 0.000300107 +2630 1.478202008 0.000316525 +2632 1.478195093 0.000327263 +2634 1.478180696 0.000305877 +2636 1.478199378 0.000269148 +2638 1.478235352 0.000248173 +2640 1.478270816 0.000239824 +2642 1.478304044 0.000238746 +2644 1.478329954 0.000239869 +2646 1.478352433 0.000237698 +2648 1.478376736 0.000231659 +2650 1.478404223 0.00022456 +2652 1.478435039 0.000220155 +2654 1.478465258 0.000220025 +2656 1.478492298 0.000220822 +2658 1.478516192 0.000219097 +2660 1.478542286 0.000213669 +2662 1.478571831 0.000206552 +2664 1.478606758 0.000200133 +2666 1.478645026 0.000198263 +2668 1.478684425 0.000204157 +2670 1.478716452 0.000219582 +2672 1.478728447 0.000228529 +2674 1.47874645 0.000212671 +2676 1.478783675 0.000198554 +2678 1.478825771 0.000193734 +2680 1.478867341 0.000194427 +2682 1.47890576 0.000197546 +2684 1.478944105 0.000200582 +2686 1.478982467 0.000203985 +2688 1.479020786 0.000208935 +2690 1.479056977 0.000213886 +2692 1.479093486 0.000215781 +2694 1.479132532 0.000215167 +2696 1.479177137 0.000214896 +2698 1.479224944 0.00021736 +2700 1.479273702 0.000222624 +2702 1.479323501 0.000229951 +2704 1.479374778 0.00023778 +2706 1.47942978 0.000247271 +2708 1.47948663 0.000260084 +2710 1.479545725 0.000275286 +2712 1.479609 0.000293138 +2714 1.479675821 0.000315099 +2716 1.479747834 0.00034214 +2718 1.479826864 0.000376356 +2720 1.479914349 0.000422619 +2722 1.480011619 0.000488803 +2724 1.48011529 0.000585387 +2726 1.480217436 0.000728319 +2728 1.48029271 0.000938827 +2730 1.480284699 0.001230376 +2732 1.480093337 0.001552296 +2734 1.479686045 0.00172267 +2736 1.479260698 0.001584292 +2738 1.479043822 0.001262354 +2740 1.479031373 0.00095422 +2742 1.479122344 0.000733284 +2744 1.479244752 0.000590574 +2746 1.479368961 0.000500914 +2748 1.479485477 0.000444284 +2750 1.479593467 0.000408552 +2752 1.479693914 0.000386443 +2754 1.479786963 0.000373264 +2756 1.479874783 0.00036667 +2758 1.479957584 0.000363877 +2760 1.480037273 0.000361533 +2762 1.480119242 0.000363675 +2764 1.480199134 0.000366719 +2766 1.480279226 0.000373488 +2768 1.480357698 0.000385907 +2770 1.480433858 0.000398462 +2772 1.480507254 0.000413801 +2774 1.480575671 0.00042566 +2776 1.480651059 0.000436402 +2778 1.480722663 0.000446663 +2780 1.480799774 0.000455121 +2782 1.480880532 0.000464084 +2784 1.480966873 0.000471838 +2786 1.481055122 0.000485997 +2788 1.481149376 0.000502173 +2790 1.481244667 0.00052283 +2792 1.481341189 0.000548289 +2794 1.481440145 0.000579634 +2796 1.481533085 0.000611379 +2798 1.481628758 0.000641159 +2800 1.481730232 0.000672247 +2802 1.481835672 0.000711616 +2804 1.481937644 0.000756204 +2806 1.482037722 0.000806513 +2808 1.482133328 0.000854384 +2810 1.48221893 0.000899046 +2812 1.482301281 0.000920533 +2814 1.482415432 0.000922946 +2816 1.482561883 0.000938823 +2818 1.482721464 0.000975854 +2820 1.482885937 0.001037948 +2822 1.483031462 0.001114411 +2824 1.483165355 0.001171243 +2826 1.48333288 0.001205841 +2828 1.483538865 0.001261413 +2830 1.483762339 0.001347783 +2832 1.483993724 0.001461997 +2834 1.484228597 0.001597189 +2836 1.484469148 0.001753303 +2838 1.48472336 0.001935236 +2840 1.484988918 0.002148293 +2842 1.48526979 0.002396939 +2844 1.485562444 0.002709475 +2846 1.485850301 0.00308962 +2848 1.486116357 0.003559406 +2850 1.486317037 0.004122104 +2852 1.486426168 0.004768919 +2854 1.486389319 0.005472141 +2856 1.486172881 0.006174092 +2858 1.485780553 0.006787228 +2860 1.485282546 0.007238079 +2862 1.484774737 0.007520489 +2864 1.484313069 0.007694051 +2866 1.483902949 0.007806724 +2868 1.483527587 0.007892118 +2870 1.483159233 0.007959358 +2872 1.482763173 0.007997332 +2874 1.482330362 0.007959348 +2876 1.481900332 0.007786842 +2878 1.481569899 0.007485135 +2880 1.481358298 0.007127825 +2882 1.481270464 0.006747168 +2884 1.481292247 0.006365591 +2886 1.48142276 0.006002528 +2888 1.481661524 0.005680035 +2890 1.481994694 0.005418693 +2892 1.482412863 0.005231499 +2894 1.482906156 0.005138593 +2896 1.483461748 0.005149122 +2898 1.484060687 0.005282986 +2900 1.484697491 0.005548465 +2902 1.485349018 0.005966707 +2904 1.486004513 0.006560259 +2906 1.486633305 0.007373091 +2908 1.487160493 0.008443431 +2910 1.487494274 0.009807836 +2912 1.48745635 0.011436182 +2914 1.486879188 0.013204372 +2916 1.485646477 0.01486394 +2918 1.483781384 0.016032264 +2920 1.481608423 0.01638484 +2922 1.479639022 0.01593156 +2924 1.478175633 0.014971222 +2926 1.477253662 0.01381792 +2928 1.476800099 0.012683 +2930 1.476706003 0.011705176 +2932 1.476835929 0.010945412 +2934 1.477078489 0.010409493 +2936 1.47736368 0.010077746 +2938 1.477619988 0.009915762 +2940 1.47780992 0.009890928 +2942 1.477906166 0.009952539 +2944 1.477893522 0.010055844 +2946 1.47776643 0.010146665 +2948 1.477553036 0.010170091 +2950 1.477320986 0.010097042 +2952 1.477109823 0.009954455 +2954 1.476926564 0.009771848 +2956 1.476778657 0.009560314 +2958 1.476643898 0.009316728 +2960 1.4765395 0.009008413 +2962 1.476523809 0.008604525 +2964 1.476711438 0.008191732 +2966 1.477065906 0.007931884 +2968 1.477426843 0.00787857 +2970 1.477700092 0.007954067 +2972 1.477862473 0.008070214 +2974 1.477947414 0.00817434 +2976 1.477978994 0.008250035 +2978 1.477982236 0.008288556 +2980 1.47795004 0.008283863 +2982 1.477901474 0.00816951 +2984 1.477957354 0.007951471 +2986 1.478144969 0.007718758 +2988 1.478446924 0.007521776 +2990 1.478849187 0.00739483 +2992 1.479323443 0.007354951 +2994 1.479863068 0.007424008 +2996 1.48043188 0.007629477 +2998 1.480975377 0.008003502 +3000 1.481385171 0.008498811 +3002 1.481623564 0.008966242 +3004 1.48185212 0.009250402 +3006 1.482284404 0.009454556 +3008 1.482971786 0.009765818 +3010 1.48385674 0.010315072 +3012 1.484879935 0.011209164 +3014 1.485956652 0.012566574 +3016 1.48695938 0.014492031 +3018 1.487674683 0.017152331 +3020 1.487655241 0.020658807 +3022 1.486181326 0.024792757 +3024 1.48268462 0.028533826 +3026 1.477620824 0.030573743 +3028 1.472327275 0.030419773 +3030 1.467764639 0.028528571 +3032 1.464408789 0.025462618 +3034 1.462471976 0.021841785 +3036 1.461967693 0.018321478 +3038 1.462539472 0.015436726 +3040 1.463673822 0.013417427 +3042 1.464914177 0.012181431 +3044 1.466015631 0.011480242 +3046 1.466976865 0.011108233 +3048 1.467814648 0.011036495 +3050 1.468474029 0.011234121 +3052 1.468878533 0.01165214 +3054 1.468956751 0.012167935 +3056 1.468753239 0.012649209 +3058 1.468343027 0.013064024 +3060 1.467712827 0.013421784 +3062 1.466753005 0.013602735 +3064 1.465537036 0.013356676 +3066 1.464357344 0.012495783 +3068 1.463643333 0.01111858 +3070 1.463619676 0.009623122 +3072 1.464162707 0.00840019 +3074 1.465005896 0.00762786 +3076 1.46593266 0.007314317 +3078 1.466814971 0.007427694 +3080 1.467541081 0.008001699 +3082 1.467856909 0.009099248 +3084 1.467267609 0.010561298 +3086 1.465332472 0.011595346 +3088 1.462682921 0.010891552 +3090 1.461203035 0.008553483 +3092 1.461344785 0.006257663 +3094 1.462213698 0.00474251 +3096 1.463212479 0.00389488 +3098 1.464116618 0.003502421 +3100 1.464823693 0.003425661 +3102 1.465256367 0.003542455 +3104 1.465335815 0.0036633 +3106 1.465190984 0.003512557 +3108 1.465169074 0.003071606 +3110 1.465380607 0.002623191 +3112 1.465682768 0.002302389 +3114 1.465969313 0.002083306 +3116 1.466197395 0.00190296 +3118 1.46639102 0.001701246 +3120 1.466610549 0.001472218 +3122 1.466870492 0.001266802 +3124 1.467139097 0.001102215 +3126 1.467402517 0.000972843 +3128 1.467659659 0.000865976 +3130 1.467905953 0.000787123 +3132 1.468134489 0.00072557 +3134 1.468347231 0.00067862 +3136 1.468545536 0.000643376 +3138 1.46872579 0.000613508 +3140 1.468896068 0.000585754 +3142 1.469053617 0.000561171 +3144 1.469207884 0.000538802 +3146 1.469351559 0.000520081 +3148 1.469489266 0.000505697 +3150 1.46961712 0.000493471 +3152 1.469739323 0.000480268 +3154 1.469857715 0.000470385 +3156 1.469970841 0.00045922 +3158 1.470081254 0.000450945 +3160 1.470188345 0.000450827 +3162 1.470287492 0.000455121 +3164 1.470375616 0.000465884 +3166 1.470447337 0.000478799 +3168 1.470495236 0.000482832 +3170 1.470532879 0.000455626 +3172 1.47059397 0.000403339 +3174 1.470680289 0.000360438 +3176 1.470771001 0.000332521 +3178 1.470858344 0.000313939 +3180 1.47094238 0.000300706 +3182 1.471021271 0.000290666 +3184 1.471096912 0.000282478 +3186 1.471168154 0.000275747 +3188 1.471236186 0.000269274 +3190 1.471301847 0.000262631 +3192 1.471365114 0.000255445 +3194 1.471427348 0.000248378 +3196 1.471488517 0.000241978 +3198 1.47154755 0.000236252 +3200 1.47160533 0.000230923 +3202 1.471660128 0.000226049 +3204 1.47171225 0.000221226 +3206 1.471763155 0.000214716 +3208 1.471813951 0.000206518 +3210 1.471864668 0.000198105 +3212 1.471916616 0.000190353 +3214 1.471967385 0.000183842 +3216 1.472017079 0.000178537 +3218 1.472065889 0.000173733 +3220 1.472113652 0.000169366 +3222 1.472159365 0.0001653 +3224 1.472205007 0.000161253 +3226 1.472250332 0.00015755 +3228 1.472294241 0.000154291 +3230 1.472337337 0.000151403 +3232 1.472379806 0.000148762 +3234 1.472421223 0.000146609 +3236 1.472461738 0.000144929 +3238 1.472500905 0.000143621 +3240 1.472539331 0.000142424 +3242 1.472576666 0.000141225 +3244 1.472612894 0.00013988 +3246 1.472649422 0.00013812 +3248 1.47268468 0.000136558 +3250 1.472718966 0.00013503 +3252 1.472753298 0.000133891 +3254 1.472787238 0.000133096 +3256 1.472819576 0.000132369 +3258 1.472850861 0.000131179 +3260 1.472881925 0.000129611 +3262 1.472913 0.000128051 +3264 1.472943992 0.000126497 +3266 1.4729752 0.000125487 +3268 1.473004566 0.000124918 +3270 1.473033069 0.000124283 +3272 1.473062298 0.000123525 +3274 1.473090298 0.000122442 +3276 1.473117251 0.000121444 +3278 1.473145192 0.00012076 +3280 1.473171918 0.000120133 +3282 1.473199048 0.000119423 +3284 1.473224805 0.000118787 +3286 1.47325068 0.00011805 +3288 1.473275587 0.000117491 +3290 1.473301496 0.000116941 +3292 1.473325233 0.000116412 +3294 1.473350252 0.000116041 +3296 1.47337511 0.000115835 +3298 1.47339906 0.000116086 +3300 1.47342297 0.000116987 +3302 1.473445822 0.000118268 +3304 1.473466581 0.000119505 +3306 1.473487385 0.000120364 +3308 1.473507032 0.000119983 +3310 1.473526836 0.000118961 +3312 1.47354755 0.000117874 +3314 1.473568295 0.000117091 +3316 1.473589032 0.000116576 +3318 1.473608805 0.000116631 +3320 1.473628554 0.000116649 +3322 1.473647349 0.00011664 +3324 1.473665478 0.000116602 +3326 1.47368305 0.000116254 +3328 1.4736996 0.000115188 +3330 1.473717184 0.000113812 +3332 1.473733781 0.000111681 +3334 1.473750687 0.000108818 +3336 1.473768449 0.000105958 +3338 1.473786661 0.000103152 +3340 1.473804046 0.000100395 +3342 1.473822765 9.80E-05 +3344 1.47384041 9.54E-05 +3346 1.473859047 9.25E-05 +3348 1.473878582 9.01E-05 +3350 1.473897523 8.83E-05 +3352 1.473917523 8.72E-05 +3354 1.473936067 8.64E-05 +3356 1.473954889 8.61E-05 +3358 1.47397354 8.62E-05 +3360 1.473992346 8.70E-05 +3362 1.474010557 8.83E-05 +3364 1.47402827 9.00E-05 +3366 1.474045082 9.23E-05 +3368 1.474061418 9.51E-05 +3370 1.474077043 9.79E-05 +3372 1.474090591 0.000100096 +3374 1.47410503 0.000102179 +3376 1.474117827 0.00010375 +3378 1.474130815 0.000105213 +3380 1.474143266 0.000106689 +3382 1.474155712 0.000107854 +3384 1.474167173 0.000108504 +3386 1.474178416 0.000108466 +3388 1.47418915 0.000107522 +3390 1.474199987 0.000105586 +3392 1.474211901 0.000103099 +3394 1.474224434 0.000100324 +3396 1.474236835 9.74E-05 +3398 1.474250335 9.52E-05 +3400 1.474264805 9.35E-05 +3402 1.474278267 9.21E-05 +3404 1.474291704 9.07E-05 +3406 1.474304771 8.91E-05 +3408 1.474318355 8.75E-05 +3410 1.474331936 8.57E-05 +3412 1.474346421 8.44E-05 +3414 1.474360879 8.35E-05 +3416 1.474375326 8.28E-05 +3418 1.474390181 8.26E-05 +3420 1.474405156 8.35E-05 +3422 1.474420443 8.51E-05 +3424 1.474436061 8.77E-05 +3426 1.474449644 9.19E-05 +3428 1.474462948 9.73E-05 +3430 1.474474391 0.000103498 +3432 1.474484169 0.000110175 +3434 1.47449072 0.000116489 +3436 1.474495914 0.000121652 +3438 1.474499038 0.0001252 +3440 1.474499934 0.000126017 +3442 1.474501355 0.000123364 +3444 1.474504588 0.000118359 +3446 1.474508751 0.000111284 +3448 1.474514459 0.000102049 +3450 1.474524843 9.29E-05 +3452 1.474538272 8.57E-05 +3454 1.474551723 8.04E-05 +3456 1.474565172 7.65E-05 +3458 1.474578602 7.35E-05 +3460 1.474591921 7.16E-05 +3462 1.474604503 7.00E-05 +3464 1.474616965 6.87E-05 +3466 1.474628399 6.77E-05 +3468 1.474639874 6.66E-05 +3470 1.474651882 6.58E-05 +3472 1.474662664 6.49E-05 +3474 1.474674097 6.42E-05 +3476 1.474684737 6.34E-05 +3478 1.474696083 6.21E-05 +3480 1.47470752 6.08E-05 +3482 1.474718859 6.00E-05 +3484 1.474731411 5.95E-05 +3486 1.474743217 5.98E-05 +3488 1.474755405 6.07E-05 +3490 1.474765776 6.21E-05 +3492 1.474775177 6.36E-05 +3494 1.474784377 6.40E-05 +3496 1.474793753 6.37E-05 +3498 1.474803528 6.27E-05 +3500 1.474813865 6.17E-05 +3502 1.474825403 6.13E-05 +3504 1.474836865 6.13E-05 +3506 1.47484923 6.25E-05 +3508 1.474860542 6.44E-05 +3510 1.474871181 6.71E-05 +3512 1.474881618 7.04E-05 +3514 1.474891556 7.48E-05 +3516 1.474897792 7.96E-05 +3518 1.474901998 8.35E-05 +3520 1.474905152 8.40E-05 +3522 1.474908586 8.07E-05 +3524 1.474915894 7.56E-05 +3526 1.474925638 7.11E-05 +3528 1.474937218 6.82E-05 +3530 1.474949652 6.64E-05 +3532 1.474962095 6.58E-05 +3534 1.474975481 6.67E-05 +3536 1.47498901 6.95E-05 +3538 1.475002501 7.44E-05 +3540 1.475013344 8.17E-05 +3542 1.47502156 9.03E-05 +3544 1.475025909 9.86E-05 +3546 1.475027988 0.000104547 +3548 1.475029087 0.000107434 +3550 1.475030131 0.000108038 +3552 1.475031521 0.000107167 +3554 1.47503369 0.000105179 +3556 1.475035962 0.000101095 +3558 1.475039944 9.51E-05 +3560 1.475047208 8.82E-05 +3562 1.475057577 8.18E-05 +3564 1.475069218 7.69E-05 +3566 1.475082228 7.39E-05 +3568 1.475095836 7.28E-05 +3570 1.475109436 7.34E-05 +3572 1.475122992 7.57E-05 +3574 1.475135442 7.97E-05 +3576 1.475147886 8.51E-05 +3578 1.475158773 9.29E-05 +3580 1.4751683 0.000102526 +3582 1.475173011 0.000114877 +3584 1.475167301 0.000126191 +3586 1.475160988 0.000124628 +3588 1.475159999 0.000119416 +3590 1.47516345 0.000112007 +3592 1.475169959 0.000105579 +3594 1.475178935 0.000100692 +3596 1.475189495 9.80E-05 +3598 1.47519987 9.79E-05 +3600 1.475208153 9.77E-05 +3602 1.475216397 9.63E-05 +3604 1.475226778 9.48E-05 +3606 1.475237563 9.41E-05 +3608 1.475249058 9.39E-05 +3610 1.475262354 9.47E-05 +3612 1.475276891 9.80E-05 +3614 1.475292415 0.000104631 +3616 1.475305776 0.000115783 +3618 1.475315507 0.000130667 +3620 1.475318072 0.000146477 +3622 1.475313309 0.000158531 +3624 1.475305207 0.000162319 +3626 1.475300997 0.000158126 +3628 1.475304196 0.000150672 +3630 1.475312923 0.00014455 +3632 1.47532683 0.000142051 +3634 1.475342302 0.00014553 +3636 1.475358179 0.000153343 +3638 1.475372708 0.000167576 +3640 1.475383066 0.000187306 +3642 1.47538491 0.000211282 +3644 1.475378084 0.000235521 +3646 1.475361528 0.000255526 +3648 1.475338298 0.000267309 +3650 1.475311272 0.00026762 +3652 1.475288315 0.000257282 +3654 1.475271733 0.000238427 +3656 1.475264007 0.00021591 +3658 1.47526538 0.000194199 +3660 1.475271965 0.000175916 +3662 1.475283325 0.000162335 +3664 1.475295472 0.000152841 +3666 1.47530792 0.000146982 +3668 1.475319403 0.000143998 +3670 1.475329509 0.000143648 +3672 1.475337525 0.000144734 +3674 1.475342646 0.000145901 +3676 1.475344937 0.000145536 +3678 1.475347938 0.000142791 +3680 1.47535101 0.000138713 +3682 1.475355127 0.000133855 +3684 1.47536061 0.000128953 +3686 1.475366775 0.000123725 +3688 1.475374222 0.000118054 +3690 1.475383491 0.000112539 +3692 1.475394668 0.000108763 +3694 1.475406148 0.000106869 +3696 1.475417668 0.000106179 +3698 1.475431036 0.000108026 +3700 1.475443093 0.000113499 +3702 1.475451689 0.000122346 +3704 1.475453966 0.000132017 +3706 1.475452075 0.000138205 +3708 1.475447975 0.000137813 +3710 1.475447048 0.000131957 +3712 1.475451897 0.000124912 +3714 1.475459959 0.000120086 +3716 1.475470951 0.000119369 +3718 1.475480666 0.000123023 +3720 1.475486979 0.000129682 +3722 1.47548796 0.000136686 +3724 1.475484782 0.000140356 +3726 1.475479476 0.000137643 +3728 1.475478633 0.000130059 +3730 1.475481745 0.000121898 +3732 1.475487781 0.000115279 +3734 1.475494036 0.000109786 +3736 1.475501254 0.0001053 +3738 1.475509342 0.000101063 +3740 1.475516832 9.69E-05 +3742 1.475526886 9.32E-05 +3744 1.475537291 9.10E-05 +3746 1.475546782 8.98E-05 +3748 1.475557133 8.93E-05 +3750 1.475566593 8.96E-05 +3752 1.475576695 9.07E-05 +3754 1.475586473 9.23E-05 +3756 1.475595298 9.52E-05 +3758 1.4756036 9.88E-05 +3760 1.475610915 0.000102898 +3762 1.475616097 0.000106542 +3764 1.475620291 0.000108639 +3766 1.475624418 0.000107126 +3768 1.475633066 0.000104745 +3770 1.475644052 0.000104907 +3772 1.475655523 0.000107524 +3774 1.475666948 0.000112566 +3776 1.475678309 0.000120129 +3778 1.475687551 0.000130378 +3780 1.475694636 0.000143388 +3782 1.475695475 0.000157828 +3784 1.475689514 0.000171337 +3786 1.475678359 0.000178286 +3788 1.475665939 0.000174781 +3790 1.47566102 0.000164121 +3792 1.47566355 0.00015261 +3794 1.475671857 0.000144163 +3796 1.475683213 0.000139239 +3798 1.475695293 0.000137793 +3800 1.475707725 0.000140105 +3802 1.4757181 0.000145422 +3804 1.475726484 0.000152835 +3806 1.475731342 0.000161128 +3808 1.47573352 0.000168582 +3810 1.475732924 0.00017333 +3812 1.475732993 0.000175196 +3814 1.475733987 0.000174404 +3816 1.475738176 0.000172977 +3818 1.475745275 0.000172633 +3820 1.475752771 0.000174761 +3822 1.475759674 0.000179016 +3824 1.475764703 0.000183475 +3826 1.475769755 0.00018761 +3828 1.475776986 0.000192418 +3830 1.475783098 0.000199639 +3832 1.475788297 0.000209346 +3834 1.475790958 0.000221078 +3836 1.475788399 0.000233277 +3838 1.475781539 0.000243302 +3840 1.475773258 0.00024822 +3842 1.475766957 0.000249319 +3844 1.475761815 0.000250161 +3846 1.47575639 0.000251131 +3848 1.475748935 0.000250954 +3850 1.475740677 0.000247448 +3852 1.47573419 0.000239298 +3854 1.475732013 0.00022763 +3856 1.475736094 0.000215807 +3858 1.475743401 0.000207047 +3860 1.475754065 0.000202158 +3862 1.475765096 0.000202101 +3864 1.475773442 0.000206089 +3866 1.475777823 0.000212973 +3868 1.475777044 0.00022007 +3870 1.475769788 0.000223161 +3872 1.475761679 0.000217701 +3874 1.475759835 0.00020568 +3876 1.475766159 0.000194071 +3878 1.475776036 0.000186624 +3880 1.475787496 0.000183261 +3882 1.47579899 0.000183371 +3884 1.475808298 0.000186003 +3886 1.475815532 0.000190704 +3888 1.475820446 0.000195753 +3890 1.475823615 0.000199899 +3892 1.475824887 0.000202665 +3894 1.475826912 0.000204321 +3896 1.475827988 0.000204971 +3898 1.475830058 0.000204185 +3900 1.475833336 0.00020288 +3902 1.475837981 0.000202091 +3904 1.475843498 0.000203201 +3906 1.475848785 0.000206778 +3908 1.475851041 0.00021273 +3910 1.475847864 0.000215759 +3912 1.475845039 0.000211571 +3914 1.475847728 0.000205958 +3916 1.47585513 0.000202886 +3918 1.475861612 0.00020386 +3920 1.475866801 0.000208044 +3922 1.475868017 0.000213749 +3924 1.475862852 0.000216258 +3926 1.47585769 0.000210993 +3928 1.475857257 0.000200361 +3930 1.475865029 0.000190404 +3932 1.475876388 0.000185295 +3934 1.475887586 0.000184723 +3936 1.475896004 0.000186124 +3938 1.475903314 0.000187275 +3940 1.475910608 0.000189149 +3942 1.475917896 0.000191266 +3944 1.475924571 0.000194824 +3946 1.475930811 0.000199963 +3948 1.475933986 0.000206118 +3950 1.475932956 0.000211965 +3952 1.475928783 0.000211772 +3954 1.475926843 0.00020721 +3956 1.475929862 0.000200358 +3958 1.475936289 0.000194987 +3960 1.475943518 0.00019141 +3962 1.475951862 0.000188811 +3964 1.475959113 0.000186954 +3966 1.47596855 0.000184972 +3968 1.475977129 0.000183219 +3970 1.47598747 0.000181797 +3972 1.476000044 0.000181759 +3974 1.476013374 0.000184824 +3976 1.476026922 0.000192623 +3978 1.476034056 0.000205577 +3980 1.476028174 0.000216734 +3982 1.476018745 0.000209197 +3984 1.476025637 0.000193026 +3986 1.476043674 0.000183363 +3988 1.476063276 0.000180229 +3990 1.476083041 0.000181566 +3992 1.476102695 0.000186255 +3994 1.476122622 0.000193691 +3996 1.476140785 0.000204149 +3998 1.476157521 0.000217163 +4000 1.476171336 0.000231948 \ No newline at end of file diff --git a/eta_TolueneK.txt b/eta_TolueneK.txt deleted file mode 100644 index 557b71b..0000000 --- a/eta_TolueneK.txt +++ /dev/null @@ -1,1601 +0,0 @@ -800 0.00237097091817457 -802 0.00227949941219620 -804 0.00221816388191892 -806 0.00217471041775780 -808 0.00215481795727275 -810 0.00213388387011066 -812 0.00209363211698535 -814 0.00202082763908315 -816 0.00193585066178408 -818 0.00188250850160370 -820 0.00184538369212481 -822 0.00183536653704965 -824 0.00185974183080381 -826 0.00190647188683237 -828 0.00199326404385590 -830 0.00213499888469032 -832 0.00233225842027966 -834 0.00257593995310952 -836 0.00287502014227382 -838 0.00318754088914534 -840 0.00349170996961850 -842 0.00366108155160527 -844 0.00362683356184450 -846 0.00340059748640139 -848 0.00305608088262669 -850 0.00270129337895778 -852 0.00239675724637807 -854 0.00217864428240924 -856 0.00203021645685105 -858 0.00193686140678899 -860 0.00187749764181973 -862 0.00185772044069943 -864 0.00188910883086452 -866 0.00195093483930895 -868 0.00204692017755064 -870 0.00215522059478817 -872 0.00226016367314688 -874 0.00224604514385606 -876 0.00210230179408609 -878 0.00199743674523776 -880 0.00199218269491360 -882 0.00208480862951801 -884 0.00228270137034088 -886 0.00262030644370857 -888 0.00319352984551477 -890 0.00421972378192706 -892 0.00602385856914103 -894 0.00840405009274333 -896 0.00900675480510885 -898 0.00696613165618276 -900 0.00499554830114596 -902 0.00383849939561442 -904 0.00320523678732641 -906 0.00285555041538049 -908 0.00266476454212409 -910 0.00254627716354120 -912 0.00245341529587653 -914 0.00236459307673934 -916 0.00229282344387905 -918 0.00223035979386559 -920 0.00221227947671869 -922 0.00224238729804433 -924 0.00235007654381494 -926 0.00256726325953723 -928 0.00284644035247116 -930 0.00294228033320561 -932 0.00275916688965430 -934 0.00258731026217053 -936 0.00255719587176405 -938 0.00262153336828821 -940 0.00273896371051358 -942 0.00287538936255749 -944 0.00299732885131251 -946 0.00309698674175826 -948 0.00316605202547143 -950 0.00320470876397792 -952 0.00323491311445059 -954 0.00329692599734166 -956 0.00338582912769461 -958 0.00350331602393855 -960 0.00365994789379712 -962 0.00382797968742639 -964 0.00395048819829240 -966 0.00399909330987952 -968 0.00397747867047571 -970 0.00393338530466517 -972 0.00391527408455760 -974 0.00393711464406835 -976 0.00402058186620085 -978 0.00414801626311813 -980 0.00426028437517640 -982 0.00424343298749414 -984 0.00411994903649494 -986 0.00399867235513141 -988 0.00388651104937391 -990 0.00379950457370988 -992 0.00373977952014182 -994 0.00373881240280082 -996 0.00379956481032446 -998 0.00393643103780800 -1000 0.00418426742600855 -1002 0.00448366832068703 -1004 0.00421395149528264 -1006 0.00400806256602511 -1008 0.00395963930728052 -1010 0.00399586579501438 -1012 0.00412453345420230 -1014 0.00435650139468447 -1016 0.00470823294497344 -1018 0.00525652222711324 -1020 0.00620034607293144 -1022 0.00761074657742514 -1024 0.00904862587038915 -1026 0.0128420613454482 -1028 0.0232054647758307 -1030 0.0401070318402723 -1032 0.0237662509507289 -1034 0.0150900768702586 -1036 0.0136209302389719 -1038 0.0140722804433677 -1040 0.0148520038780156 -1042 0.0150418759020717 -1044 0.0142741299011939 -1046 0.0127983598294137 -1048 0.0111020250322553 -1050 0.00953886802849649 -1052 0.00823573530792714 -1054 0.00722015941851439 -1056 0.00647199198407014 -1058 0.00595450625097980 -1060 0.00562081994003704 -1062 0.00547155564647798 -1064 0.00551163119086301 -1066 0.00577378575211103 -1068 0.00633217061275026 -1070 0.00731526451760166 -1072 0.00888941764012196 -1074 0.0111936669094970 -1076 0.0145627178352916 -1078 0.0198820542781815 -1080 0.0272101442099741 -1082 0.0294763996691438 -1084 0.0207090896497001 -1086 0.0127655286195192 -1088 0.00854004269533275 -1090 0.00635526613490286 -1092 0.00518140755178082 -1094 0.00455405026737381 -1096 0.00426268956025233 -1098 0.00423510235887238 -1100 0.00446505970250814 -1102 0.00496653746864136 -1104 0.00580707926483870 -1106 0.00666740083564581 -1108 0.00624732665593806 -1110 0.00479908163793379 -1112 0.00361121925654796 -1114 0.00287942570706319 -1116 0.00246148742161380 -1118 0.00222778888171568 -1120 0.00209650525411750 -1122 0.00202121838132918 -1124 0.00199323955812561 -1126 0.00200797851417853 -1128 0.00204812470413808 -1130 0.00209417368698948 -1132 0.00209849682757402 -1134 0.00210954008712956 -1136 0.00214927272221614 -1138 0.00221781253558492 -1140 0.00231654284254776 -1142 0.00241700276584513 -1144 0.00252090482583751 -1146 0.00265926205183231 -1148 0.00286652526484237 -1150 0.00313647720191737 -1152 0.00347416081610501 -1154 0.00387661923259805 -1156 0.00410043342018308 -1158 0.00394886198110498 -1160 0.00373148843650175 -1162 0.00350494607394550 -1164 0.00334022215869222 -1166 0.00324053812759405 -1168 0.00323728249115084 -1170 0.00337030363472976 -1172 0.00370331752537631 -1174 0.00446861428672600 -1176 0.00627098368325835 -1178 0.00931078620410600 -1180 0.00795027706068620 -1182 0.00505648215885331 -1184 0.00377716421438011 -1186 0.00319136495849046 -1188 0.00290137589052677 -1190 0.00275791558623964 -1192 0.00269226681474014 -1194 0.00266088014296474 -1196 0.00258817828799466 -1198 0.00241700923017517 -1200 0.00221558969693162 -1202 0.00211217407863773 -1204 0.00220182940076526 -1206 0.00261294695511882 -1208 0.00347974535374746 -1210 0.00437930056728570 -1212 0.00342648851242818 -1214 0.00227260060290268 -1216 0.00178258728885112 -1218 0.00154392622881232 -1220 0.00139698451678244 -1222 0.00129280677379398 -1224 0.00121946854787068 -1226 0.00117184455170345 -1228 0.00113722984861070 -1230 0.00111912311009601 -1232 0.00111390956612134 -1234 0.00112443805885795 -1236 0.00115660063219376 -1238 0.00121045559427169 -1240 0.00129274578774778 -1242 0.00140396276384137 -1244 0.00154410614148823 -1246 0.00169860381220359 -1248 0.00180840115780576 -1250 0.00177688982988028 -1252 0.00157601125295148 -1254 0.00138106340282942 -1256 0.00125620905206826 -1258 0.00118717226425611 -1260 0.00114496451549449 -1262 0.00111429933337465 -1264 0.00109740533980092 -1266 0.00108967549075875 -1268 0.00109315730663637 -1270 0.00110701272913057 -1272 0.00112547293050748 -1274 0.00114417070376777 -1276 0.00115549769406343 -1278 0.00115861723477586 -1280 0.00114576824540165 -1282 0.00112307423917382 -1284 0.00110803299150391 -1286 0.00109790695605719 -1288 0.00109710433202375 -1290 0.00110698710171340 -1292 0.00113245942678089 -1294 0.00117552067320688 -1296 0.00124267198974583 -1298 0.00132277561158489 -1300 0.00139217958266282 -1302 0.00142973694885209 -1304 0.00144188181676038 -1306 0.00147541483276765 -1308 0.00159956692209740 -1310 0.00186843894759088 -1312 0.00216486082449073 -1314 0.00211728875491887 -1316 0.00187507564071290 -1318 0.00171677440706927 -1320 0.00164837511625716 -1322 0.00163899782669962 -1324 0.00166410609076352 -1326 0.00171764577889364 -1328 0.00180479473401823 -1330 0.00194274885535529 -1332 0.00206022538770732 -1334 0.00196217286057273 -1336 0.00188492778401013 -1338 0.00187122231048589 -1340 0.00188921428962955 -1342 0.00193700700412885 -1344 0.00200313353323991 -1346 0.00208778115174581 -1348 0.00218066174704292 -1350 0.00226588109762249 -1352 0.00236276913468593 -1354 0.00248915903884931 -1356 0.00265547420500685 -1358 0.00284820286383517 -1360 0.00303211548157874 -1362 0.00319538643027851 -1364 0.00338011260813816 -1366 0.00363996415682390 -1368 0.00400265764738686 -1370 0.00448976968523854 -1372 0.00525773678870123 -1374 0.00662029687278425 -1376 0.00908376119233617 -1378 0.0123031513241818 -1380 0.0121671979448086 -1382 0.00940007546463800 -1384 0.00754318150864360 -1386 0.00640356392721685 -1388 0.00563257119321882 -1390 0.00511010869784208 -1392 0.00475789415695825 -1394 0.00452833517370964 -1396 0.00440186171426137 -1398 0.00433687786700866 -1400 0.00432317844214779 -1402 0.00436175400856741 -1404 0.00444654158141412 -1406 0.00458045165701961 -1408 0.00472070193080689 -1410 0.00484730108752061 -1412 0.00499169569971829 -1414 0.00517526500052341 -1416 0.00540856165680758 -1418 0.00569301961826355 -1420 0.00603609386579061 -1422 0.00639815529754280 -1424 0.00676704333943306 -1426 0.00709702523848474 -1428 0.00735286473751553 -1430 0.00758946104003622 -1432 0.00786781701959305 -1434 0.00830202970708910 -1436 0.00898232020613486 -1438 0.0100197835148382 -1440 0.0115095063570045 -1442 0.0133985990853930 -1444 0.0153768866835411 -1446 0.0171765347348967 -1448 0.0189361099169456 -1450 0.0208245294344141 -1452 0.0228039247538198 -1454 0.0246810508004892 -1456 0.0262618411626106 -1458 0.0273608063623162 -1460 0.0277930934742346 -1462 0.0274706237226478 -1464 0.0264211185824187 -1466 0.0247980788620200 -1468 0.0228296555480849 -1470 0.0207834609064780 -1472 0.0188724652439656 -1474 0.0171801988754876 -1476 0.0157920753997752 -1478 0.0147283011159520 -1480 0.0140030494767984 -1482 0.0137569248084170 -1484 0.0141879797029108 -1486 0.0159226244331294 -1488 0.0201940578220826 -1490 0.0260836787125339 -1492 0.0401202763896059 -1494 0.0761786772950870 -1496 0.108223079178941 -1498 0.0527249260725011 -1500 0.0271635520581988 -1502 0.0173322191403291 -1504 0.0124889207648925 -1506 0.00992131298532918 -1508 0.00839752655521901 -1510 0.00745176347821015 -1512 0.00688020881374870 -1514 0.00648533490268327 -1516 0.00628100243994201 -1518 0.00629379543847072 -1520 0.00670033315002658 -1522 0.00786453088070098 -1524 0.00861000109877936 -1526 0.00697026673858113 -1528 0.00565227380276001 -1530 0.00510003019871344 -1532 0.00487330093915990 -1534 0.00477643425469498 -1536 0.00467177280329912 -1538 0.00449022432901730 -1540 0.00423934685882746 -1542 0.00393426018189818 -1544 0.00365660104528498 -1546 0.00348923385240243 -1548 0.00342710802865492 -1550 0.00346898664460405 -1552 0.00338295466527580 -1554 0.00321378452613121 -1556 0.00313430635529189 -1558 0.00316907431392649 -1560 0.00330481737182376 -1562 0.00356172011440931 -1564 0.00388898354936485 -1566 0.00429638887941885 -1568 0.00472113284868973 -1570 0.00504929184964361 -1572 0.00519286093716334 -1574 0.00509202242388202 -1576 0.00481769783190026 -1578 0.00455543799934706 -1580 0.00435935962171553 -1582 0.00433990247775519 -1584 0.00460726311748136 -1586 0.00492003737038605 -1588 0.00490704034351103 -1590 0.00492753522146188 -1592 0.00518588888004375 -1594 0.00592543183304241 -1596 0.00720757954725413 -1598 0.00912890526935344 -1600 0.0130293680056744 -1602 0.0206809953186127 -1604 0.0299953585748135 -1606 0.0248157340286292 -1608 0.0127358449020555 -1610 0.00746783575970784 -1612 0.00537209761858949 -1614 0.00445129559785390 -1616 0.00405329276394375 -1618 0.00399146289131384 -1620 0.00409659649670941 -1622 0.00425086095548363 -1624 0.00425306230534309 -1626 0.00388013491422351 -1628 0.00322765310314340 -1630 0.00259805094537761 -1632 0.00208657181154715 -1634 0.00169843933990688 -1636 0.00141785441008406 -1638 0.00123234974672297 -1640 0.00109764310439106 -1642 0.000997096490971439 -1644 0.000923943814992787 -1646 0.000867694719207358 -1648 0.000857989573211860 -1650 0.000876925837508371 -1652 0.000900483600662835 -1654 0.000924599031590994 -1656 0.000943402878947833 -1658 0.000957189946759812 -1660 0.000919301596934912 -1662 0.000829980699381760 -1664 0.000741920416434289 -1666 0.000684454640853614 -1668 0.000660487010052916 -1670 0.000677329699540855 -1672 0.000733663772686657 -1674 0.000829672252398670 -1676 0.000923202402787059 -1678 0.000900896424649981 -1680 0.000787132461270056 -1682 0.000676995955481515 -1684 0.000611701232515841 -1686 0.000595044263899243 -1688 0.000601913444772076 -1690 0.000631185451917075 -1692 0.000675093910401457 -1694 0.000731422393886708 -1696 0.000808376337564176 -1698 0.000794279618925047 -1700 0.000709354504802398 -1702 0.000657251178127169 -1704 0.000631084077034609 -1706 0.000620630016846374 -1708 0.000614804872029308 -1710 0.000610379344278778 -1712 0.000608365704329393 -1714 0.000610177708447017 -1716 0.000628060629349526 -1718 0.000671390695691186 -1720 0.000748670745348075 -1722 0.000874314265691752 -1724 0.00104123844277088 -1726 0.00123749183518020 -1728 0.00147184752955714 -1730 0.00173223404858593 -1732 0.00197582318555127 -1734 0.00215543372945357 -1736 0.00220452603076912 -1738 0.00209119301342784 -1740 0.00185700091397871 -1742 0.00156445999707629 -1744 0.00127824303920924 -1746 0.00103830550711541 -1748 0.000858082809524967 -1750 0.000736720622233361 -1752 0.000665836151632355 -1754 0.000633014507978860 -1756 0.000636204186868655 -1758 0.000664560791933513 -1760 0.000700854142871225 -1762 0.000738249770728404 -1764 0.000779473476320026 -1766 0.000831332837575542 -1768 0.000887483745995595 -1770 0.000943100942235622 -1772 0.00100855983483948 -1774 0.00108815587341361 -1776 0.00117336763806935 -1778 0.00122720647155439 -1780 0.00120867298099444 -1782 0.00117346527655232 -1784 0.00119371865588136 -1786 0.00128533671400934 -1788 0.00142590894789679 -1790 0.00158054902116715 -1792 0.00179850758319075 -1794 0.00213331852757031 -1796 0.00258371206804431 -1798 0.00310651819625664 -1800 0.00358456135015573 -1802 0.00384535056234718 -1804 0.00377208677963125 -1806 0.00340950704775298 -1808 0.00292589878928829 -1810 0.00246230467854199 -1812 0.00209503276430901 -1814 0.00185262669472132 -1816 0.00171702079169156 -1818 0.00163886439352206 -1820 0.00157730777183400 -1822 0.00149679229624579 -1824 0.00138863730310920 -1826 0.00127743508882463 -1828 0.00118456389012839 -1830 0.00112905353317808 -1832 0.00108606377735617 -1834 0.00103086061641581 -1836 0.000984959950309749 -1838 0.000979289058512249 -1840 0.00102288594610930 -1842 0.00112067935890798 -1844 0.00128394592127716 -1846 0.00152723861251123 -1848 0.00188826636609761 -1850 0.00239227576491655 -1852 0.00300971905084921 -1854 0.00364059420885185 -1856 0.00414527688649222 -1858 0.00428418417776257 -1860 0.00397341781363892 -1862 0.00343437915842565 -1864 0.00294698351848267 -1866 0.00265685216170442 -1868 0.00257554798807387 -1870 0.00262362192114651 -1872 0.00267320615475132 -1874 0.00259670566832300 -1876 0.00235341832549094 -1878 0.00201352392982882 -1880 0.00167162491751218 -1882 0.00138756730843950 -1884 0.00117032979189392 -1886 0.00101120581308014 -1888 0.000892343360827370 -1890 0.000799797724248844 -1892 0.000722584304592367 -1894 0.000668205830350704 -1896 0.000645563701038960 -1898 0.000645767881929762 -1900 0.000633984361915526 -1902 0.000588098076669510 -1904 0.000535948959936282 -1906 0.000500979831672727 -1908 0.000480503614669823 -1910 0.000475812984522745 -1912 0.000486823903968232 -1914 0.000515195500000000 -1916 0.000562568109473544 -1918 0.000630427523781356 -1920 0.000723610116430462 -1922 0.000847642176098185 -1924 0.000992789644339751 -1926 0.00114429259972093 -1928 0.00131728542788928 -1930 0.00155893716312052 -1932 0.00190373075161683 -1934 0.00237556565013185 -1936 0.00298040121387223 -1938 0.00364293200808332 -1940 0.00416589638649938 -1942 0.00433944387091247 -1944 0.00420413532397440 -1946 0.00380161374653215 -1948 0.00327719918178656 -1950 0.00282576366330091 -1952 0.00253348765310892 -1954 0.00239437526824859 -1956 0.00234603768444204 -1958 0.00232574864667046 -1960 0.00220039532483667 -1962 0.00199445232375287 -1964 0.00170495488495039 -1966 0.00137875775323702 -1968 0.00109690552229723 -1970 0.000878128994624433 -1972 0.000721601368959039 -1974 0.000617419916987627 -1976 0.000562113218832075 -1978 0.000551026292591773 -1980 0.000575711660935202 -1982 0.000615370850112472 -1984 0.000626638864213787 -1986 0.000619344762051612 -1988 0.000644972987040071 -1990 0.000691941782910493 -1992 0.000694254646432683 -1994 0.000622443290799324 -1996 0.000495200120138662 -1998 0.000402620427801543 -2000 0.000357520428000267 -2002 0.000340715817783006 -2004 0.000340725563484929 -2006 0.000349587604938024 -2008 0.000357889528657337 -2010 0.000352782837535485 -2012 0.000327904929253038 -2014 0.000298699882098499 -2016 0.000271842376811093 -2018 0.000242333037716520 -2020 0.000218337240170542 -2022 0.000199194821720737 -2024 0.000183911806628813 -2026 0.000171888258235563 -2028 0.000164785282634461 -2030 0.000164391739593814 -2032 0.000169011600820695 -2034 0.000154127618321273 -2036 0.000133850562902313 -2038 0.000121768011512588 -2040 0.000114542173977814 -2042 0.000109960714942027 -2044 0.000107324747708015 -2046 0.000105319938271901 -2048 0.000104400109927128 -2050 0.000104560803595480 -2052 0.000105682984195988 -2054 0.000107138188290709 -2056 0.000109850938702712 -2058 0.000113964387835913 -2060 0.000119159665067584 -2062 0.000125394011284327 -2064 0.000135383120416356 -2066 0.000150829077064515 -2068 0.000163896208951784 -2070 0.000158538657020860 -2072 0.000143857048326539 -2074 0.000133838990991728 -2076 0.000126082674541763 -2078 0.000119111322229434 -2080 0.000113978504701401 -2082 0.000110907574969952 -2084 0.000108574694668308 -2086 0.000105750311657561 -2088 0.000102757884920459 -2090 0.000100315348970678 -2092 9.88998809699028e-05 -2094 9.84636051990861e-05 -2096 9.86736776470892e-05 -2098 9.86832304001427e-05 -2100 9.94847029581411e-05 -2102 0.000102501492433386 -2104 0.000108578252528750 -2106 0.000117598982731806 -2108 0.000128810423312497 -2110 0.000138078130156183 -2112 0.000139894738408702 -2114 0.000140372347283306 -2116 0.000147183990385426 -2118 0.000142580842940779 -2120 0.000126124302551768 -2122 0.000119111147897455 -2124 0.000117761941379516 -2126 0.000110386213471180 -2128 0.000100586367430428 -2130 9.65127771567695e-05 -2132 9.71593180254151e-05 -2134 0.000100588542105452 -2136 0.000104481772978239 -2138 0.000107041125533866 -2140 0.000108872498221666 -2142 0.000111489568147590 -2144 0.000115451529322482 -2146 0.000120558240114413 -2148 0.000126537781071288 -2150 0.000134733619506300 -2152 0.000148643632029954 -2154 0.000172040859828778 -2156 0.000210048660817435 -2158 0.000268125741557685 -2160 0.000351069215958102 -2162 0.000450344598032358 -2164 0.000489938528699291 -2166 0.000409492796412179 -2168 0.000304387639702614 -2170 0.000235891130206754 -2172 0.000200519075056806 -2174 0.000185710828669175 -2176 0.000182424899321747 -2178 0.000187448554282292 -2180 0.000203021437757415 -2182 0.000231533383222207 -2184 0.000266979354976650 -2186 0.000274670338797065 -2188 0.000249531305296574 -2190 0.000224075465024111 -2192 0.000200276630934979 -2194 0.000177273244376758 -2196 0.000160285923199765 -2198 0.000150581068702164 -2200 0.000148630566016007 -2202 0.000159418644068291 -2204 0.000190928483551684 -2206 0.000246685640401459 -2208 0.000270254541506430 -2210 0.000222823187679136 -2212 0.000183299674920404 -2214 0.000159208446689860 -2216 0.000141367831176120 -2218 0.000133886240444937 -2220 0.000133377867922854 -2222 0.000136687110101880 -2224 0.000141595068371183 -2226 0.000145519316291541 -2228 0.000148458736825531 -2230 0.000153316938474443 -2232 0.000163253960273079 -2234 0.000178923069609914 -2236 0.000194257120755014 -2238 0.000196450490452201 -2240 0.000188281502894665 -2242 0.000182547056123856 -2244 0.000184193400303698 -2246 0.000192794200162931 -2248 0.000207468879582850 -2250 0.000228635659533982 -2252 0.000256821954754517 -2254 0.000293238050530334 -2256 0.000339843587945316 -2258 0.000394697192716897 -2260 0.000433841600455809 -2262 0.000418808222045475 -2264 0.000365652480977041 -2266 0.000317992842743265 -2268 0.000289251978678528 -2270 0.000276323460348606 -2272 0.000276007776761593 -2274 0.000285194711508216 -2276 0.000305840459677383 -2278 0.000341614672459952 -2280 0.000378323694871339 -2282 0.000375183465200990 -2284 0.000372499291886178 -2286 0.000379130457959152 -2288 0.000369071052928138 -2290 0.000344203099796142 -2292 0.000313724278864159 -2294 0.000283180068926335 -2296 0.000260398235921227 -2298 0.000248364444837745 -2300 0.000246962256014277 -2302 0.000257337196851115 -2304 0.000282117167464228 -2306 0.000327011660272884 -2308 0.000402901410624785 -2310 0.000515678907419335 -2312 0.000613221545587734 -2314 0.000587317319167494 -2316 0.000479703817387008 -2318 0.000387543339108333 -2320 0.000331935579008350 -2322 0.000305882244139694 -2324 0.000301743073919341 -2326 0.000318021837096887 -2328 0.000360763254301904 -2330 0.000442864766710211 -2332 0.000580146273004247 -2334 0.000746878008138738 -2336 0.000778905767997363 -2338 0.000655878707879373 -2340 0.000549860316308082 -2342 0.000474310426764780 -2344 0.000414796574428013 -2346 0.000384139069758195 -2348 0.000382158356339707 -2350 0.000402158338733409 -2352 0.000435516153586227 -2354 0.000472182760873504 -2356 0.000515961034751272 -2358 0.000592576004516974 -2360 0.000693206523120231 -2362 0.000643638218785556 -2364 0.000478341631402279 -2366 0.000369914098808752 -2368 0.000314093467617302 -2370 0.000287309303030045 -2372 0.000274524402561852 -2374 0.000270061869985669 -2376 0.000271829601590763 -2378 0.000279194809335497 -2380 0.000294905061876556 -2382 0.000319347534507768 -2384 0.000350241467027989 -2386 0.000391786089197638 -2388 0.000432288381112108 -2390 0.000431894838874137 -2392 0.000400306861211915 -2394 0.000373780803138032 -2396 0.000355410966982535 -2398 0.000347151739593354 -2400 0.000350924151462325 -2402 0.000365706536144189 -2404 0.000389705426960732 -2406 0.000421334803876133 -2408 0.000459934423654906 -2410 0.000500616815279102 -2412 0.000525702627325844 -2414 0.000513223543953278 -2416 0.000478247500654749 -2418 0.000439595749420076 -2420 0.000399407179067621 -2422 0.000365631853681067 -2424 0.000342099304419797 -2426 0.000327643185447820 -2428 0.000319852482413628 -2430 0.000318090248146717 -2432 0.000318226888962093 -2434 0.000307017564256603 -2436 0.000284561022911212 -2438 0.000265983112770141 -2440 0.000252937611403322 -2442 0.000242679401171322 -2444 0.000236093051616947 -2446 0.000233130690914760 -2448 0.000233167378896135 -2450 0.000235415965609999 -2452 0.000239364304311204 -2454 0.000244209499641596 -2456 0.000248579466181052 -2458 0.000251144773278908 -2460 0.000252431049719579 -2462 0.000253691712617762 -2464 0.000255788005476147 -2466 0.000256434321853842 -2468 0.000251072591655402 -2470 0.000241597521259849 -2472 0.000234162117014666 -2474 0.000229676856991507 -2476 0.000227592143774873 -2478 0.000226834091088810 -2480 0.000227168703547583 -2482 0.000228588584217583 -2484 0.000231746296813716 -2486 0.000236823965966075 -2488 0.000241600139160114 -2490 0.000244394482975018 -2492 0.000244248137929474 -2494 0.000245127828260994 -2496 0.000251434891521320 -2498 0.000247993851620619 -2500 0.000232735996433491 -2502 0.000222497793867323 -2504 0.000221589422451279 -2506 0.000232579945681551 -2508 0.000250427153657126 -2510 0.000252498000507853 -2512 0.000232189718802120 -2514 0.000211050185590214 -2516 0.000198391157226399 -2518 0.000193635707688150 -2520 0.000193341820452081 -2522 0.000193371593068733 -2524 0.000189643081211288 -2526 0.000181794690676754 -2528 0.000178838464388285 -2530 0.000183501803348288 -2532 0.000194837096053966 -2534 0.000211327514566071 -2536 0.000231393834808824 -2538 0.000255837394665623 -2540 0.000275709996672117 -2542 0.000266055047783776 -2544 0.000243859757637041 -2546 0.000235285437161138 -2548 0.000236304976186297 -2550 0.000232544359689715 -2552 0.000218806075082454 -2554 0.000204743746363893 -2556 0.000196655427865349 -2558 0.000191976123078746 -2560 0.000186392842736032 -2562 0.000182465243677096 -2564 0.000182341770175991 -2566 0.000186622668096877 -2568 0.000194771585308041 -2570 0.000207509200230819 -2572 0.000227536779149540 -2574 0.000256126025913237 -2576 0.000293783533966409 -2578 0.000344606705405512 -2580 0.000421000900491490 -2582 0.000539940417278290 -2584 0.000691325137774485 -2586 0.000768064347900480 -2588 0.000684349300000000 -2590 0.000536495643153772 -2592 0.000418107936641488 -2594 0.000348162932430616 -2596 0.000316562063243598 -2598 0.000311605992448936 -2600 0.000329718943031756 -2602 0.000370011429187919 -2604 0.000412184734144213 -2606 0.000402481978671523 -2608 0.000368470211663778 -2610 0.000353398410510846 -2612 0.000328281593188018 -2614 0.000295400882956194 -2616 0.000275902521470556 -2618 0.000268299167514448 -2620 0.000267511791747167 -2622 0.000270974116559811 -2624 0.000277238419508473 -2626 0.000286763887252883 -2628 0.000300107477286003 -2630 0.000316524811935304 -2632 0.000327263381122722 -2634 0.000305877054698251 -2636 0.000269148133708810 -2638 0.000248172907618610 -2640 0.000239823700606054 -2642 0.000238746030638882 -2644 0.000239868631298371 -2646 0.000237697572301885 -2648 0.000231658620506580 -2650 0.000224559727594560 -2652 0.000220154792342943 -2654 0.000220025182909045 -2656 0.000220821585838385 -2658 0.000219097069889182 -2660 0.000213668868513552 -2662 0.000206551642880241 -2664 0.000200132874030954 -2666 0.000198263371264169 -2668 0.000204157476079366 -2670 0.000219581959345431 -2672 0.000228529275997830 -2674 0.000212671171569940 -2676 0.000198554340066309 -2678 0.000193733620852842 -2680 0.000194427317307389 -2682 0.000197546011671515 -2684 0.000200581527813713 -2686 0.000203985348880727 -2688 0.000208935024070450 -2690 0.000213885837983080 -2692 0.000215780646355564 -2694 0.000215167439140776 -2696 0.000214895725221701 -2698 0.000217360387387823 -2700 0.000222623944199778 -2702 0.000229950531867105 -2704 0.000237779651458241 -2706 0.000247270953949545 -2708 0.000260083526905394 -2710 0.000275286056335416 -2712 0.000293138008774478 -2714 0.000315098638979930 -2716 0.000342140022611386 -2718 0.000376355762584957 -2720 0.000422618703820090 -2722 0.000488803228667163 -2724 0.000585387059813060 -2726 0.000728318801443707 -2728 0.000938827018235910 -2730 0.00123037571269695 -2732 0.00155229568740433 -2734 0.00172266995984292 -2736 0.00158429227183195 -2738 0.00126235409603059 -2740 0.000954219558161654 -2742 0.000733284051680574 -2744 0.000590574186925838 -2746 0.000500913503228797 -2748 0.000444283569806984 -2750 0.000408552058896459 -2752 0.000386442879562956 -2754 0.000373264157615818 -2756 0.000366670327661857 -2758 0.000363876514149830 -2760 0.000361532536949891 -2762 0.000363675314741141 -2764 0.000366718711717702 -2766 0.000373487709343178 -2768 0.000385907143020104 -2770 0.000398462101615587 -2772 0.000413801469177668 -2774 0.000425659990486031 -2776 0.000436402382617843 -2778 0.000446662734946199 -2780 0.000455121187378285 -2782 0.000464083631949392 -2784 0.000471837814603525 -2786 0.000485996560282024 -2788 0.000502172804216709 -2790 0.000522830212064553 -2792 0.000548289451554969 -2794 0.000579634288120943 -2796 0.000611379237870225 -2798 0.000641158616950349 -2800 0.000672247209660977 -2802 0.000711615716417748 -2804 0.000756204442404881 -2806 0.000806513382136127 -2808 0.000854383801707436 -2810 0.000899046135928726 -2812 0.000920533253907859 -2814 0.000922946174823163 -2816 0.000938823165339874 -2818 0.000975854382639431 -2820 0.00103794809306155 -2822 0.00111441105526966 -2824 0.00117124310275486 -2826 0.00120584112843460 -2828 0.00126141309789025 -2830 0.00134778284367920 -2832 0.00146199663837007 -2834 0.00159718851386329 -2836 0.00175330338362696 -2838 0.00193523559724759 -2840 0.00214829304268432 -2842 0.00239693861672905 -2844 0.00270947510257679 -2846 0.00308962037090872 -2848 0.00355940585209848 -2850 0.00412210422108316 -2852 0.00476891854151234 -2854 0.00547214050611261 -2856 0.00617409172881556 -2858 0.00678722786702444 -2860 0.00723807939551757 -2862 0.00752048939258356 -2864 0.00769405118384194 -2866 0.00780672387589873 -2868 0.00789211778455793 -2870 0.00795935754077555 -2872 0.00799733164350610 -2874 0.00795934759033912 -2876 0.00778684233057949 -2878 0.00748513477927108 -2880 0.00712782450019760 -2882 0.00674716793892496 -2884 0.00636559086703165 -2886 0.00600252759803496 -2888 0.00568003469443299 -2890 0.00541869257628554 -2892 0.00523149924308805 -2894 0.00513859281992941 -2896 0.00514912231818864 -2898 0.00528298553786387 -2900 0.00554846488279469 -2902 0.00596670745150011 -2904 0.00656025912947429 -2906 0.00737309118502326 -2908 0.00844343143196328 -2910 0.00980783562233305 -2912 0.0114361820721680 -2914 0.0132043723140582 -2916 0.0148639399258050 -2918 0.0160322637171387 -2920 0.0163848402191419 -2922 0.0159315596024990 -2924 0.0149712224125917 -2926 0.0138179195741240 -2928 0.0126830001717222 -2930 0.0117051760061400 -2932 0.0109454119425227 -2934 0.0104094926683649 -2936 0.0100777464854532 -2938 0.00991576239015874 -2940 0.00989092758914217 -2942 0.00995253861794336 -2944 0.0100558436016283 -2946 0.0101466649820268 -2948 0.0101700911447294 -2950 0.0100970420129300 -2952 0.00995445488065370 -2954 0.00977184847019253 -2956 0.00956031409076577 -2958 0.00931672833064324 -2960 0.00900841342025127 -2962 0.00860452512496009 -2964 0.00819173199579369 -2966 0.00793188379052879 -2968 0.00787856977180025 -2970 0.00795406658370171 -2972 0.00807021356855313 -2974 0.00817433984043233 -2976 0.00825003493744345 -2978 0.00828855603001654 -2980 0.00828386290179407 -2982 0.00816950979044141 -2984 0.00795147116279175 -2986 0.00771875813248752 -2988 0.00752177579743462 -2990 0.00739482968641806 -2992 0.00735495102785436 -2994 0.00742400805444368 -2996 0.00762947734762659 -2998 0.00800350176450487 -3000 0.00849881078288103 -3002 0.00896624168638865 -3004 0.00925040248900867 -3006 0.00945455630611128 -3008 0.00976581762927042 -3010 0.0103150719126273 -3012 0.0112091641279662 -3014 0.0125665741882334 -3016 0.0144920310150755 -3018 0.0171523311364697 -3020 0.0206588071576588 -3022 0.0247927573582982 -3024 0.0285338257471566 -3026 0.0305737428191527 -3028 0.0304197730378849 -3030 0.0285285708945381 -3032 0.0254626182993726 -3034 0.0218417847555673 -3036 0.0183214780469989 -3038 0.0154367262434714 -3040 0.0134174271105468 -3042 0.0121814306436623 -3044 0.0114802419869786 -3046 0.0111082334096508 -3048 0.0110364952795097 -3050 0.0112341213861221 -3052 0.0116521403194674 -3054 0.0121679353995795 -3056 0.0126492093791370 -3058 0.0130640240273400 -3060 0.0134217837485980 -3062 0.0136027351521215 -3064 0.0133566760196114 -3066 0.0124957830807641 -3068 0.0111185801076637 -3070 0.00962312187980008 -3072 0.00840019013916095 -3074 0.00762785975903174 -3076 0.00731431659052294 -3078 0.00742769361429674 -3080 0.00800169947155848 -3082 0.00909924810606661 -3084 0.0105612984915747 -3086 0.0115953458981882 -3088 0.0108915516715014 -3090 0.00855348266587572 -3092 0.00625766310903960 -3094 0.00474250996240750 -3096 0.00389487972553113 -3098 0.00350242093033435 -3100 0.00342566123955596 -3102 0.00354245491578370 -3104 0.00366329979669444 -3106 0.00351255659174282 -3108 0.00307160622386024 -3110 0.00262319086310484 -3112 0.00230238895472291 -3114 0.00208330628877116 -3116 0.00190296000440166 -3118 0.00170124594674715 -3120 0.00147221774746264 -3122 0.00126680203340060 -3124 0.00110221512874358 -3126 0.000972843085744223 -3128 0.000865976217229730 -3130 0.000787123046176519 -3132 0.000725569824317256 -3134 0.000678619961272403 -3136 0.000643376054198741 -3138 0.000613508276940799 -3140 0.000585754400051242 -3142 0.000561171104171409 -3144 0.000538801514536514 -3146 0.000520080512301793 -3148 0.000505696831504068 -3150 0.000493470880103411 -3152 0.000480268222246598 -3154 0.000470385004364871 -3156 0.000459220112914975 -3158 0.000450945450269378 -3160 0.000450827328828143 -3162 0.000455120896574839 -3164 0.000465883832863404 -3166 0.000478798660924222 -3168 0.000482832083650923 -3170 0.000455625596338195 -3172 0.000403338720059331 -3174 0.000360438306588196 -3176 0.000332520864586029 -3178 0.000313938694862586 -3180 0.000300705768353348 -3182 0.000290665831960273 -3184 0.000282478444260369 -3186 0.000275747274780963 -3188 0.000269274452306063 -3190 0.000262630704721266 -3192 0.000255445037852355 -3194 0.000248377973867383 -3196 0.000241977580841794 -3198 0.000236251689540068 -3200 0.000230923454004864 -3202 0.000226049100105626 -3204 0.000221226160126354 -3206 0.000214716060376866 -3208 0.000206517982920749 -3210 0.000198104526951019 -3212 0.000190353242003341 -3214 0.000183841618071712 -3216 0.000178536526886377 -3218 0.000173732996508941 -3220 0.000169365792718528 -3222 0.000165299675350027 -3224 0.000161252739783070 -3226 0.000157550287906591 -3228 0.000154290860671044 -3230 0.000151403187559336 -3232 0.000148762116611554 -3234 0.000146608972658800 -3236 0.000144929084687115 -3238 0.000143621190469325 -3240 0.000142423755040669 -3242 0.000141225309365069 -3244 0.000139879705280103 -3246 0.000138120388481842 -3248 0.000136557609027687 -3250 0.000135029965649156 -3252 0.000133891483928728 -3254 0.000133096425324259 -3256 0.000132368577771128 -3258 0.000131178881840028 -3260 0.000129611032335659 -3262 0.000128050800000000 -3264 0.000126496752229370 -3266 0.000125487476864466 -3268 0.000124918363511663 -3270 0.000124282902673504 -3272 0.000123524889665480 -3274 0.000122442491776109 -3276 0.000121443655497364 -3278 0.000120760252331750 -3280 0.000120133235127335 -3282 0.000119422774440518 -3284 0.000118787091342885 -3286 0.000118050006014353 -3288 0.000117490615311207 -3290 0.000116940876538515 -3292 0.000116411722780357 -3294 0.000116040811167173 -3296 0.000115834700717885 -3298 0.000116085966839459 -3300 0.000116986523436758 -3302 0.000118267730379294 -3304 0.000119505403103670 -3306 0.000120364280297837 -3308 0.000119982615737227 -3310 0.000118961448074642 -3312 0.000117873723711904 -3314 0.000117091085003690 -3316 0.000116576391297391 -3318 0.000116630812029799 -3320 0.000116648622872189 -3322 0.000116640410140475 -3324 0.000116601640984688 -3326 0.000116254038453171 -3328 0.000115188264691018 -3330 0.000113811841076524 -3332 0.000111681446514179 -3334 0.000108818040972509 -3336 0.000105958252604406 -3338 0.000103151741537451 -3340 0.000100395217441575 -3342 9.80332064093372e-05 -3344 9.53544349575209e-05 -3346 9.25223256784850e-05 -3348 9.00829101787277e-05 -3350 8.83163531062304e-05 -3352 8.72118771260860e-05 -3354 8.64440098119140e-05 -3356 8.60520504254794e-05 -3358 8.61965597139509e-05 -3360 8.70019144324470e-05 -3362 8.83318478317726e-05 -3364 9.00079714359512e-05 -3366 9.23139048671722e-05 -3368 9.50882502511675e-05 -3370 9.78832163580005e-05 -3372 0.000100096171211192 -3374 0.000102179086616863 -3376 0.000103749608742208 -3378 0.000105213237160669 -3380 0.000106688938713341 -3382 0.000107853667399164 -3384 0.000108503663896066 -3386 0.000108465998629706 -3388 0.000107522134166390 -3390 0.000105586354148376 -3392 0.000103099282581304 -3394 0.000100324257650923 -3396 9.74485799284953e-05 -3398 9.51596059704078e-05 -3400 9.35013107298140e-05 -3402 9.21170196430098e-05 -3404 9.07360614712649e-05 -3406 8.91138931604199e-05 -3408 8.74505590276362e-05 -3410 8.56664975562433e-05 -3412 8.43848055968202e-05 -3414 8.35095737363273e-05 -3416 8.28173663218536e-05 -3418 8.25803390851867e-05 -3420 8.34887031217918e-05 -3422 8.50941717249168e-05 -3424 8.76826565386191e-05 -3426 9.18893425240818e-05 -3428 9.72727573628125e-05 -3430 0.000103498414055259 -3432 0.000110175431772886 -3434 0.000116489353052258 -3436 0.000121652113320222 -3438 0.000125199891677689 -3440 0.000126017012084730 -3442 0.000123363542579961 -3444 0.000118359425974797 -3446 0.000111284305442118 -3448 0.000102049297013716 -3450 9.29060570294263e-05 -3452 8.56830126047782e-05 -3454 8.03943044406067e-05 -3456 7.64946805035534e-05 -3458 7.35384095568400e-05 -3460 7.15607792666279e-05 -3462 7.00113147312602e-05 -3464 6.86840886320734e-05 -3466 6.76516046709459e-05 -3468 6.66317002099573e-05 -3470 6.58163245627029e-05 -3472 6.48526803819241e-05 -3474 6.41769150098627e-05 -3476 6.33519637219242e-05 -3478 6.21036964756407e-05 -3480 6.07594134549892e-05 -3482 5.99888706228529e-05 -3484 5.95355056229478e-05 -3486 5.98196476615315e-05 -3488 6.07067305157839e-05 -3490 6.20707024404776e-05 -3492 6.35630004076309e-05 -3494 6.39802692410745e-05 -3496 6.36894878745265e-05 -3498 6.27365377476382e-05 -3500 6.17431130904710e-05 -3502 6.13279727787810e-05 -3504 6.13193515749704e-05 -3506 6.24903413403870e-05 -3508 6.43864144265415e-05 -3510 6.71410924962580e-05 -3512 7.03539058487688e-05 -3514 7.47946182109209e-05 -3516 7.95754496113107e-05 -3518 8.34700851824913e-05 -3520 8.39873348467991e-05 -3522 8.07272560865977e-05 -3524 7.56312308938946e-05 -3526 7.10894728276635e-05 -3528 6.81632208726418e-05 -3530 6.64216930115337e-05 -3532 6.58132280866232e-05 -3534 6.67321753128692e-05 -3536 6.94647085013537e-05 -3538 7.44308734240544e-05 -3540 8.16543395123198e-05 -3542 9.03200858171377e-05 -3544 9.85535954298993e-05 -3546 0.000104547035052111 -3548 0.000107433770750519 -3550 0.000108038450708995 -3552 0.000107166592996916 -3554 0.000105178798896553 -3556 0.000101095184756009 -3558 9.50814999627662e-05 -3560 8.82058228394490e-05 -3562 8.18208514354733e-05 -3564 7.68850700845907e-05 -3566 7.38744666163043e-05 -3568 7.27642291486909e-05 -3570 7.33994731408140e-05 -3572 7.56627166220080e-05 -3574 7.96660140607364e-05 -3576 8.51090055206606e-05 -3578 9.29167699145132e-05 -3580 0.000102526366929820 -3582 0.000114877275226176 -3584 0.000126190559302250 -3586 0.000124628073841470 -3588 0.000119415520864134 -3590 0.000112006712936662 -3592 0.000105579072932928 -3594 0.000100691596209911 -3596 9.80454508807073e-05 -3598 9.79289585249404e-05 -3600 9.76517090509766e-05 -3602 9.63252158538093e-05 -3604 9.47873503300014e-05 -3606 9.40807594813255e-05 -3608 9.38724750866359e-05 -3610 9.46504942395723e-05 -3612 9.80150733458878e-05 -3614 0.000104630751802908 -3616 0.000115783489148453 -3618 0.000130667214647273 -3620 0.000146477404898454 -3622 0.000158530547818508 -3624 0.000162318596543099 -3626 0.000158125871191841 -3628 0.000150672245587412 -3630 0.000144549679683140 -3632 0.000142051097385185 -3634 0.000145529942933542 -3636 0.000153343488815115 -3638 0.000167576397035396 -3640 0.000187305749491179 -3642 0.000211282337261951 -3644 0.000235521019158824 -3646 0.000255526042383438 -3648 0.000267309387292886 -3650 0.000267620489558132 -3652 0.000257281965913234 -3654 0.000238427431722088 -3656 0.000215910141107563 -3658 0.000194198641163347 -3660 0.000175915805990763 -3662 0.000162335012119966 -3664 0.000152841199834750 -3666 0.000146981907091703 -3668 0.000143997827610619 -3670 0.000143648436802218 -3672 0.000144734329787788 -3674 0.000145900823579283 -3676 0.000145536357339105 -3678 0.000142791335633658 -3680 0.000138712508096908 -3682 0.000133854756804407 -3684 0.000128953007630511 -3686 0.000123724720918296 -3688 0.000118053544364748 -3690 0.000112538647366327 -3692 0.000108762709162428 -3694 0.000106869096858975 -3696 0.000106178550226360 -3698 0.000108026299705946 -3700 0.000113499289845608 -3702 0.000122346067036449 -3704 0.000132017367154307 -3706 0.000138204981263169 -3708 0.000137812952692201 -3710 0.000131957371338105 -3712 0.000124911657013813 -3714 0.000120086480186131 -3716 0.000119368867384451 -3718 0.000123023160227338 -3720 0.000129681526292498 -3722 0.000136685573712829 -3724 0.000140355687154432 -3726 0.000137643004943763 -3728 0.000130059156127694 -3730 0.000121898190215580 -3732 0.000115279209639364 -3734 0.000109785664308487 -3736 0.000105299764060944 -3738 0.000101063203615323 -3740 9.68651180755000e-05 -3742 9.31808749176699e-05 -3744 9.10149507453584e-05 -3746 8.98056206735940e-05 -3748 8.93161375554986e-05 -3750 8.95680290795053e-05 -3752 9.07085327291721e-05 -3754 9.23144122730348e-05 -3756 9.51698234276085e-05 -3758 9.88200437936328e-05 -3760 0.000102897737658181 -3762 0.000106541912714358 -3764 0.000108638955977754 -3766 0.000107125969211894 -3768 0.000104745321090008 -3770 0.000104907149891996 -3772 0.000107524035997495 -3774 0.000112565658169961 -3776 0.000120128967951347 -3778 0.000130377699611365 -3780 0.000143388258757916 -3782 0.000157827987118552 -3784 0.000171336843948261 -3786 0.000178285748324712 -3788 0.000174781489954516 -3790 0.000164121439128089 -3792 0.000152610210570708 -3794 0.000144162759638053 -3796 0.000139239462639203 -3798 0.000137792736182703 -3800 0.000140104567703810 -3802 0.000145422058851258 -3804 0.000152835113748305 -3806 0.000161127793420174 -3808 0.000168581867788859 -3810 0.000173330279437380 -3812 0.000175195783104517 -3814 0.000174404180004515 -3816 0.000172977411115116 -3818 0.000172632535041757 -3820 0.000174761333878933 -3822 0.000179015946250825 -3824 0.000183474569007118 -3826 0.000187609784690581 -3828 0.000192418303544244 -3830 0.000199638672160316 -3832 0.000209346193913544 -3834 0.000221078085152779 -3836 0.000233276912915708 -3838 0.000243302212259793 -3840 0.000248219562860653 -3842 0.000249318750764567 -3844 0.000250161224209589 -3846 0.000251130509086889 -3848 0.000250954031996911 -3850 0.000247448125111366 -3852 0.000239298068537633 -3854 0.000227630000846504 -3856 0.000215807191993378 -3858 0.000207046517196079 -3860 0.000202157638401237 -3862 0.000202101096220524 -3864 0.000206089427126992 -3866 0.000212972794266054 -3868 0.000220069608188463 -3870 0.000223160954785535 -3872 0.000217701230702324 -3874 0.000205680240569784 -3876 0.000194071196201460 -3878 0.000186624022776833 -3880 0.000183260750499541 -3882 0.000183370917787493 -3884 0.000186002682616268 -3886 0.000190704000843751 -3888 0.000195753159488382 -3890 0.000199899173040718 -3892 0.000202664798143917 -3894 0.000204320562044854 -3896 0.000204971280265517 -3898 0.000204184602522533 -3900 0.000202879694728580 -3902 0.000202091110448804 -3904 0.000203200507821011 -3906 0.000206777694070363 -3908 0.000212730193424292 -3910 0.000215758904170297 -3912 0.000211571330269805 -3914 0.000205958146733392 -3916 0.000202885902366098 -3918 0.000203859899346076 -3920 0.000208043821414469 -3922 0.000213749060271441 -3924 0.000216258022232613 -3926 0.000210993095532934 -3928 0.000200360509814737 -3930 0.000190403984953153 -3932 0.000185294952858894 -3934 0.000184723195717293 -3936 0.000186124269760876 -3938 0.000187274520079713 -3940 0.000189148765118607 -3942 0.000191266181204903 -3944 0.000194823747520104 -3946 0.000199962536960736 -3948 0.000206117700447747 -3950 0.000211964821297933 -3952 0.000211771907916455 -3954 0.000207210064931517 -3956 0.000200358454677226 -3958 0.000194986979879340 -3960 0.000191410166101308 -3962 0.000188811490516811 -3964 0.000186954388139908 -3966 0.000184972375095875 -3968 0.000183218705269115 -3970 0.000181796902747989 -3972 0.000181759132648531 -3974 0.000184824282283672 -3976 0.000192623374739583 -3978 0.000205576802325497 -3980 0.000216734030830589 -3982 0.000209196916619900 -3984 0.000193026471982283 -3986 0.000183362654697217 -3988 0.000180228706844783 -3990 0.000181565573496817 -3992 0.000186254988451223 -3994 0.000193691373041908 -3996 0.000204148918879724 -3998 0.000217163156382698 -4000 0.000231947733021415 \ No newline at end of file diff --git a/eta_TolueneN.txt b/eta_TolueneN.txt deleted file mode 100644 index b7a73f7..0000000 --- a/eta_TolueneN.txt +++ /dev/null @@ -1,1601 +0,0 @@ -800 1.44120102496924 -802 1.44244952355793 -804 1.44362241452370 -806 1.44473157548162 -808 1.44576931343185 -810 1.44673515341541 -812 1.44763153740528 -814 1.44849997645288 -816 1.44937159368323 -818 1.45024511061741 -820 1.45109838059394 -822 1.45193180052550 -824 1.45274307737647 -826 1.45353862658166 -828 1.45431614422343 -830 1.45505783090997 -832 1.45575257351567 -834 1.45637393495922 -836 1.45689903981153 -838 1.45730768949019 -840 1.45754105585989 -842 1.45762277914234 -844 1.45763704972226 -846 1.45770974157519 -848 1.45792998369439 -850 1.45831194599516 -852 1.45879214084464 -854 1.45933254646700 -856 1.45988983429307 -858 1.46043988459777 -860 1.46098292821135 -862 1.46151723624776 -864 1.46203872496248 -866 1.46253192223325 -868 1.46297856786196 -870 1.46337643775072 -872 1.46369146339390 -874 1.46394643585616 -876 1.46431343981134 -878 1.46483594897202 -880 1.46543855156632 -882 1.46608462990801 -884 1.46677023178158 -886 1.46750898169590 -888 1.46831763414834 -890 1.46912802427779 -892 1.46954514029358 -894 1.46839331789610 -896 1.46522362501208 -898 1.46324102369024 -900 1.46324805165743 -902 1.46389477313103 -904 1.46460285834673 -906 1.46524189063531 -908 1.46578615865865 -910 1.46624870624222 -912 1.46665117759441 -914 1.46703266934571 -916 1.46740765502925 -918 1.46779668973951 -920 1.46820189802559 -922 1.46861141696830 -924 1.46901759517687 -926 1.46935992609941 -928 1.46951316452951 -930 1.46945198189589 -932 1.46950773718789 -934 1.46980252488385 -936 1.47016397014931 -938 1.47050527825284 -940 1.47079802225791 -942 1.47102956241248 -944 1.47121559715866 -946 1.47137193902005 -948 1.47152008803324 -950 1.47167672882319 -952 1.47187041329055 -954 1.47208448275609 -956 1.47229737949647 -958 1.47250268786501 -960 1.47267011513556 -962 1.47277605897765 -964 1.47281096169045 -966 1.47283377833869 -968 1.47288521062562 -970 1.47300680592029 -972 1.47318336590741 -974 1.47338081764773 -976 1.47357969584368 -978 1.47371821017195 -980 1.47375527316737 -982 1.47374243519460 -984 1.47381322933363 -986 1.47398487555170 -988 1.47420629302573 -990 1.47448130861459 -992 1.47481507770761 -994 1.47518229617302 -996 1.47557023171639 -998 1.47596326572828 -1000 1.47630080652934 -1002 1.47636823234471 -1004 1.47636996678396 -1006 1.47689524896944 -1008 1.47750032220134 -1010 1.47819158796836 -1012 1.47897505869564 -1014 1.47986167058547 -1016 1.48089513800264 -1018 1.48214271193312 -1020 1.48362438976875 -1022 1.48502767979268 -1024 1.48723564000764 -1026 1.49092289691198 -1028 1.49396375951509 -1030 1.47873935405011 -1032 1.46178488502145 -1034 1.46614728364263 -1036 1.46944972756204 -1038 1.47076139801307 -1040 1.47051860247504 -1042 1.46925108082617 -1044 1.46777888639623 -1046 1.46677062217283 -1048 1.46644104430282 -1050 1.46666085838594 -1052 1.46724995592262 -1054 1.46804818971542 -1056 1.46897681608261 -1058 1.46995585496974 -1060 1.47098590895262 -1062 1.47206714530921 -1064 1.47321734998274 -1066 1.47445175619764 -1068 1.47579194531028 -1070 1.47721681438477 -1072 1.47863578920406 -1074 1.47989036409651 -1076 1.48086017571181 -1078 1.48069474784801 -1080 1.47616731467815 -1082 1.46390771869497 -1084 1.45570223896581 -1086 1.45597971475891 -1088 1.45836941934247 -1090 1.46066235559752 -1092 1.46255873201846 -1094 1.46411051824312 -1096 1.46540793776881 -1098 1.46651204425965 -1100 1.46743001960627 -1102 1.46810891059625 -1104 1.46835826348699 -1106 1.46762316195694 -1108 1.46618573784309 -1110 1.46572358542781 -1112 1.46614920302751 -1114 1.46684472613418 -1116 1.46754366818093 -1118 1.46816766240122 -1120 1.46871860517754 -1122 1.46920770699094 -1124 1.46965073082635 -1126 1.47005259957817 -1128 1.47040212564529 -1130 1.47068773768668 -1132 1.47096001810126 -1134 1.47125261448772 -1136 1.47154891832636 -1138 1.47183699189280 -1140 1.47209800955853 -1142 1.47233456778191 -1144 1.47257573473017 -1146 1.47283356711807 -1148 1.47307259446091 -1150 1.47326381831914 -1152 1.47336996150258 -1154 1.47330710459724 -1156 1.47293509477181 -1158 1.47266594765858 -1160 1.47259707273045 -1162 1.47267982619196 -1164 1.47288581951866 -1166 1.47317564562733 -1168 1.47355761342796 -1170 1.47402209612147 -1172 1.47459197223784 -1174 1.47529073492465 -1176 1.47579201984062 -1178 1.47389452829121 -1180 1.46944888964386 -1182 1.46919538008765 -1184 1.46993706618235 -1186 1.47058584953654 -1188 1.47109418040909 -1190 1.47148385016616 -1192 1.47177356227783 -1194 1.47196611004565 -1196 1.47207728619391 -1198 1.47220096862104 -1200 1.47245042725556 -1202 1.47283662225685 -1204 1.47330431122777 -1206 1.47375342391676 -1208 1.47385318037376 -1210 1.47280027515132 -1212 1.47140252001622 -1214 1.47159489093342 -1216 1.47205516262945 -1218 1.47243159969193 -1220 1.47273916940180 -1222 1.47301272972689 -1224 1.47326393439881 -1226 1.47349889542765 -1228 1.47371659199003 -1230 1.47393059180901 -1232 1.47413378656172 -1234 1.47433469964923 -1236 1.47453039235071 -1238 1.47471647903353 -1240 1.47488491964895 -1242 1.47502851521336 -1244 1.47512495593972 -1246 1.47514408931247 -1248 1.47505892212860 -1250 1.47489972136187 -1252 1.47484106680061 -1254 1.47493923662727 -1256 1.47509846252746 -1258 1.47526567770392 -1260 1.47542057167793 -1262 1.47557439533574 -1264 1.47572116951863 -1266 1.47586745130108 -1268 1.47601147334394 -1270 1.47614701936603 -1272 1.47627015399601 -1274 1.47638091039797 -1276 1.47648361938200 -1278 1.47658183373250 -1280 1.47668313548634 -1282 1.47679959880658 -1284 1.47693261142928 -1286 1.47707297484201 -1288 1.47722283448259 -1290 1.47738070554226 -1292 1.47754337420682 -1294 1.47770716341215 -1296 1.47786028165421 -1298 1.47798887584323 -1300 1.47808934206014 -1302 1.47818243145329 -1304 1.47830827158180 -1306 1.47849364056186 -1308 1.47871221118251 -1310 1.47885808674696 -1312 1.47873010242650 -1314 1.47845803582890 -1316 1.47844930632483 -1318 1.47861179184706 -1320 1.47881460317012 -1322 1.47902291732804 -1324 1.47922066571969 -1326 1.47941412833592 -1328 1.47959210849367 -1330 1.47973167816960 -1332 1.47972691925884 -1334 1.47975105896865 -1336 1.47993512250321 -1338 1.48014837613309 -1340 1.48037360725078 -1342 1.48060038757184 -1344 1.48082753333001 -1346 1.48104968129957 -1348 1.48126553234897 -1350 1.48148716441519 -1352 1.48173647624861 -1354 1.48200446828695 -1356 1.48227599517218 -1358 1.48252791950314 -1360 1.48276324869435 -1362 1.48303458306896 -1364 1.48338223264961 -1366 1.48379902481358 -1368 1.48427223592360 -1370 1.48482960284728 -1372 1.48552801978829 -1374 1.48627546417750 -1376 1.48651700069497 -1378 1.48432599213190 -1380 1.47977968972337 -1382 1.47800355097223 -1384 1.47805316502072 -1386 1.47842143243600 -1388 1.47890024839336 -1390 1.47940651645865 -1392 1.47991712903019 -1394 1.48041754934745 -1396 1.48089750917415 -1398 1.48135158724828 -1400 1.48179771126525 -1402 1.48224069922095 -1404 1.48266579602562 -1406 1.48305944158359 -1408 1.48342298716122 -1410 1.48379030750588 -1412 1.48419035949659 -1414 1.48461342812701 -1416 1.48505164072948 -1418 1.48548005566484 -1420 1.48588588173361 -1422 1.48626036521862 -1424 1.48659663343317 -1426 1.48690837523274 -1428 1.48726752634633 -1430 1.48775649947673 -1432 1.48841619746365 -1434 1.48924758721438 -1436 1.49022965011215 -1438 1.49126109208233 -1440 1.49220157896289 -1442 1.49274786168208 -1444 1.49275436842747 -1446 1.49244040803637 -1448 1.49203506779732 -1450 1.49142867984501 -1452 1.49040469923150 -1454 1.48888698396754 -1456 1.48687784303199 -1458 1.48442850436533 -1460 1.48174723159373 -1462 1.47906693249971 -1464 1.47667955286596 -1466 1.47482397028080 -1468 1.47364425598396 -1470 1.47319928261846 -1472 1.47339047699181 -1474 1.47411629804730 -1476 1.47533374680842 -1478 1.47696195971213 -1480 1.47908527215456 -1482 1.48180866451580 -1484 1.48531763958917 -1486 1.48994928684771 -1488 1.49499065429219 -1490 1.50119515596543 -1492 1.50990378628749 -1494 1.51196694565470 -1496 1.44560795826024 -1498 1.41456003179507 -1500 1.42568725767340 -1502 1.43509242814603 -1504 1.44179871660811 -1506 1.44669596130319 -1508 1.45033176716821 -1510 1.45318682655572 -1512 1.45545228048253 -1514 1.45731921509841 -1516 1.45894932377219 -1518 1.46041227592838 -1520 1.46176173499470 -1522 1.46244384736929 -1524 1.46122289585454 -1526 1.46043285810887 -1528 1.46128161485975 -1530 1.46226970833946 -1532 1.46306701307330 -1534 1.46366399954379 -1536 1.46409417910494 -1538 1.46444109535269 -1540 1.46477704752644 -1542 1.46519165698743 -1544 1.46568852566980 -1546 1.46623889292729 -1548 1.46677632998672 -1550 1.46719167293357 -1552 1.46747772804745 -1554 1.46791932189599 -1556 1.46844756268659 -1558 1.46898255634672 -1560 1.46952197034328 -1562 1.46999610489784 -1564 1.47038792635287 -1566 1.47066419723057 -1568 1.47075696992025 -1570 1.47067580679212 -1572 1.47047224204500 -1574 1.47030976437525 -1576 1.47033092176687 -1578 1.47057489703138 -1580 1.47099907306615 -1582 1.47158364170880 -1584 1.47213789972489 -1586 1.47240454856960 -1588 1.47273455527947 -1590 1.47343724065447 -1592 1.47446091811145 -1594 1.47574194447918 -1596 1.47705173230297 -1598 1.47867335885708 -1600 1.48062028756105 -1602 1.48036168324124 -1604 1.47134299168096 -1606 1.45508276794757 -1608 1.45359592019623 -1610 1.45693626090464 -1612 1.45964926448336 -1614 1.46156535264851 -1616 1.46294485069237 -1618 1.46393384687173 -1620 1.46454159062356 -1622 1.46478536173497 -1624 1.46467572345167 -1626 1.46443675069875 -1628 1.46442873304410 -1630 1.46468245393626 -1632 1.46507304958839 -1634 1.46551002264583 -1636 1.46597619450157 -1638 1.46639465048447 -1640 1.46677714745798 -1642 1.46713350654907 -1644 1.46746066478520 -1646 1.46777688897226 -1648 1.46807230212257 -1650 1.46832313178042 -1652 1.46853535477890 -1654 1.46871126235072 -1656 1.46886441952877 -1658 1.46897717842913 -1660 1.46906019325977 -1662 1.46917336129198 -1664 1.46933992968848 -1666 1.46953218537231 -1668 1.46973458666196 -1670 1.46993137012353 -1672 1.47010972990258 -1674 1.47023592719105 -1676 1.47026189453436 -1678 1.47023042790416 -1680 1.47026824213020 -1682 1.47039195163007 -1684 1.47055816296083 -1686 1.47072223030395 -1688 1.47088122473311 -1690 1.47102029360098 -1692 1.47114084717626 -1694 1.47123960018069 -1696 1.47128779153643 -1698 1.47126399416326 -1700 1.47132896383171 -1702 1.47143681802407 -1704 1.47155945773850 -1706 1.47167556592223 -1708 1.47178940246904 -1710 1.47190604771198 -1712 1.47202944260493 -1714 1.47216568678700 -1716 1.47231539851653 -1718 1.47248386890388 -1720 1.47265447525274 -1722 1.47281731074269 -1724 1.47295042900518 -1726 1.47304600716400 -1728 1.47309375883840 -1730 1.47305939547434 -1732 1.47291741773166 -1734 1.47267688996611 -1736 1.47235533806185 -1738 1.47204881790723 -1740 1.47183343980199 -1742 1.47174243401936 -1744 1.47176880507034 -1746 1.47188162854264 -1748 1.47204632190602 -1750 1.47223241396135 -1752 1.47242316015794 -1754 1.47260867420886 -1756 1.47278327809895 -1758 1.47293258838400 -1760 1.47306085751883 -1762 1.47317848011178 -1764 1.47329045336641 -1766 1.47339550159425 -1768 1.47349145470639 -1770 1.47357817480071 -1772 1.47366712599018 -1774 1.47373929846121 -1776 1.47378551120112 -1778 1.47379002011073 -1780 1.47381389620918 -1782 1.47392354891587 -1784 1.47409170003533 -1786 1.47427198188798 -1788 1.47442615650942 -1790 1.47457291909648 -1792 1.47474878427437 -1794 1.47489348470272 -1796 1.47493489892040 -1798 1.47478110512949 -1800 1.47437081445076 -1802 1.47373622085690 -1804 1.47304588258769 -1806 1.47251222749590 -1808 1.47223472657190 -1810 1.47217821063195 -1812 1.47227236503443 -1814 1.47243859996067 -1816 1.47259748640805 -1818 1.47271718154483 -1820 1.47279535803734 -1822 1.47284920630461 -1824 1.47291235631300 -1826 1.47301397376823 -1828 1.47314852957960 -1830 1.47329330162724 -1832 1.47342543709755 -1834 1.47357056562475 -1836 1.47375873628681 -1838 1.47398158101288 -1840 1.47422445263378 -1842 1.47448077748417 -1844 1.47474586805163 -1846 1.47500613122839 -1848 1.47524723874056 -1850 1.47539669943437 -1852 1.47535125830335 -1854 1.47504217493076 -1856 1.47442394463698 -1858 1.47358493716912 -1860 1.47284787021825 -1862 1.47246109965773 -1864 1.47241132718491 -1866 1.47253616431924 -1868 1.47266502935955 -1870 1.47267966566327 -1872 1.47252923128383 -1874 1.47227196419049 -1876 1.47203509622402 -1878 1.47192107290153 -1880 1.47194298711947 -1882 1.47205363793314 -1884 1.47220708298649 -1886 1.47237095289447 -1888 1.47253062677600 -1890 1.47268167466003 -1892 1.47283038859118 -1894 1.47298500841240 -1896 1.47313109785186 -1898 1.47324769232051 -1900 1.47333129201763 -1902 1.47341557098201 -1904 1.47353087942641 -1906 1.47366534069078 -1908 1.47380841038952 -1910 1.47395828541387 -1912 1.47411340271346 -1914 1.47427400000000 -1916 1.47443781042483 -1918 1.47460593444462 -1920 1.47477582054714 -1922 1.47493879861924 -1924 1.47508438695513 -1926 1.47522698209875 -1928 1.47539264822422 -1930 1.47558260671450 -1932 1.47576219402042 -1934 1.47587640732885 -1936 1.47583908582835 -1938 1.47553060901904 -1940 1.47489150443496 -1942 1.47409542930774 -1944 1.47334201979217 -1946 1.47275002485068 -1948 1.47244925775411 -1950 1.47239944627947 -1952 1.47247579265655 -1954 1.47255459735783 -1956 1.47256197135638 -1958 1.47246521668706 -1960 1.47228135320174 -1962 1.47212551111344 -1964 1.47202075140180 -1966 1.47202761573580 -1968 1.47213420575515 -1970 1.47229043240161 -1972 1.47246807810995 -1974 1.47265001716927 -1976 1.47282643638217 -1978 1.47298226071844 -1980 1.47310651432274 -1982 1.47317949653548 -1984 1.47321671851061 -1986 1.47327006170979 -1988 1.47332686296001 -1990 1.47332929557274 -1992 1.47327822607353 -1994 1.47322150680404 -1996 1.47323618581223 -1998 1.47331824302286 -2000 1.47341135456857 -2002 1.47349412728021 -2004 1.47356154386820 -2006 1.47361224775319 -2008 1.47364186456648 -2010 1.47365636042820 -2012 1.47367336928224 -2014 1.47370233665225 -2016 1.47373443692998 -2018 1.47377205797454 -2020 1.47381648358614 -2022 1.47386111301432 -2024 1.47390577969427 -2026 1.47395028817579 -2028 1.47399564538301 -2030 1.47403660265942 -2032 1.47406519767252 -2034 1.47408330994744 -2036 1.47412047010970 -2038 1.47416098226622 -2040 1.47420115643528 -2042 1.47423947043298 -2044 1.47427612941305 -2046 1.47431218419212 -2048 1.47434648116260 -2050 1.47438071427926 -2052 1.47441278409228 -2054 1.47444520616084 -2056 1.47447627049456 -2058 1.47450675882064 -2060 1.47453588733404 -2062 1.47456386702353 -2064 1.47459073458299 -2066 1.47461205370700 -2068 1.47461817299827 -2070 1.47461840283149 -2072 1.47463277175523 -2074 1.47465427880758 -2076 1.47467709152152 -2078 1.47470098997954 -2080 1.47472590140090 -2082 1.47475065118331 -2084 1.47477468067538 -2086 1.47479776494193 -2088 1.47482142195457 -2090 1.47484633615274 -2092 1.47487121877337 -2094 1.47489609572630 -2096 1.47491999718268 -2098 1.47494434691905 -2100 1.47496980619050 -2102 1.47499564254391 -2104 1.47502159030193 -2106 1.47504417582923 -2108 1.47506264533273 -2110 1.47507395400220 -2112 1.47508393678745 -2114 1.47510043049552 -2116 1.47511198378437 -2118 1.47511214568773 -2120 1.47512762848859 -2122 1.47515211305019 -2124 1.47517182375646 -2126 1.47518774789092 -2128 1.47521310826668 -2130 1.47524116489652 -2132 1.47527005212030 -2134 1.47529590535418 -2136 1.47531935031383 -2138 1.47534209120029 -2140 1.47536554624085 -2142 1.47539141048574 -2144 1.47541735186985 -2146 1.47544449187503 -2148 1.47547342544397 -2150 1.47550619668115 -2152 1.47554178363426 -2154 1.47558203516447 -2156 1.47562160093130 -2158 1.47565253763469 -2160 1.47566151568534 -2162 1.47561225894049 -2164 1.47548068559088 -2166 1.47537296738995 -2168 1.47536211403117 -2170 1.47539890926361 -2172 1.47544656614673 -2174 1.47549197749543 -2176 1.47553203213436 -2178 1.47556864358705 -2180 1.47560215753198 -2182 1.47562464470162 -2184 1.47562085582639 -2186 1.47558980476200 -2188 1.47557480988891 -2190 1.47558033450347 -2192 1.47559232749770 -2194 1.47561457143455 -2196 1.47564434139990 -2198 1.47567857523082 -2200 1.47571617803152 -2202 1.47575726786490 -2204 1.47579337721307 -2206 1.47579746772491 -2208 1.47574189594736 -2210 1.47571194854898 -2212 1.47572956986763 -2214 1.47575472007504 -2216 1.47578621163266 -2218 1.47581942101129 -2220 1.47585088742314 -2222 1.47587897173469 -2224 1.47590298856875 -2226 1.47592470046514 -2228 1.47594779372938 -2230 1.47597265137572 -2232 1.47599748726300 -2234 1.47601807246604 -2236 1.47602689076481 -2238 1.47603005518190 -2240 1.47604281703214 -2242 1.47606726159445 -2244 1.47609784881235 -2246 1.47612902016881 -2248 1.47615949406397 -2250 1.47618852095385 -2252 1.47621446243625 -2254 1.47623489680521 -2256 1.47624408046323 -2258 1.47623018458297 -2260 1.47617742404058 -2262 1.47611228816094 -2264 1.47608500995198 -2266 1.47609867784140 -2268 1.47612909924113 -2270 1.47616476482454 -2272 1.47619947439469 -2274 1.47623253066542 -2276 1.47626319551276 -2278 1.47628200368923 -2280 1.47626680426481 -2282 1.47624376410414 -2284 1.47624714378783 -2286 1.47623939342228 -2288 1.47622263640102 -2290 1.47621701248520 -2292 1.47622414847935 -2294 1.47624639786310 -2296 1.47628230617739 -2298 1.47632637399547 -2300 1.47637356620751 -2302 1.47642523943489 -2304 1.47647814675017 -2306 1.47652996718143 -2308 1.47657059295077 -2310 1.47656605147736 -2312 1.47646451238365 -2314 1.47632139830172 -2316 1.47626434895975 -2318 1.47628666976549 -2320 1.47634178441866 -2322 1.47640626197946 -2324 1.47647367980355 -2326 1.47654420112269 -2328 1.47661693748934 -2330 1.47668220577778 -2332 1.47670897421522 -2334 1.47661953024202 -2336 1.47640699456743 -2338 1.47628918090598 -2340 1.47627922381635 -2342 1.47629610568572 -2344 1.47633775742674 -2346 1.47639668853055 -2348 1.47645464076621 -2350 1.47650252320800 -2352 1.47653396769864 -2354 1.47655188224605 -2356 1.47656625779288 -2358 1.47656342537266 -2360 1.47646841808416 -2362 1.47627988649258 -2364 1.47623361007945 -2366 1.47628349602868 -2368 1.47634714131595 -2370 1.47640579435613 -2372 1.47645673781608 -2374 1.47650329311272 -2376 1.47654473856361 -2378 1.47658519751564 -2380 1.47662360662062 -2382 1.47665509133976 -2384 1.47667939867421 -2386 1.47668999377568 -2388 1.47666832266751 -2390 1.47662551968266 -2392 1.47661227607686 -2394 1.47662326945870 -2396 1.47664538468599 -2398 1.47667621017793 -2400 1.47670840326370 -2402 1.47673732384369 -2404 1.47676080113293 -2406 1.47677566835384 -2408 1.47677747426079 -2410 1.47675773033081 -2412 1.47671176533526 -2414 1.47665898774225 -2416 1.47662888566870 -2418 1.47661609885311 -2420 1.47661804906686 -2422 1.47663361079607 -2424 1.47665615258179 -2426 1.47667989702189 -2428 1.47670167875450 -2430 1.47671889251986 -2432 1.47672660033007 -2434 1.47672581905542 -2436 1.47673588691547 -2438 1.47675625346807 -2440 1.47677811479011 -2442 1.47680201299431 -2444 1.47682690323960 -2446 1.47685134280847 -2448 1.47687468838441 -2450 1.47689577948214 -2452 1.47691461221252 -2454 1.47693121483650 -2456 1.47694483659804 -2458 1.47695706614166 -2460 1.47696841245298 -2462 1.47698092980728 -2464 1.47699165258073 -2466 1.47699892231642 -2468 1.47700518850467 -2470 1.47701681917772 -2472 1.47703371133993 -2474 1.47705172804537 -2476 1.47706963205611 -2478 1.47708839046513 -2480 1.47710595182822 -2482 1.47712353018048 -2484 1.47714045399508 -2486 1.47715526898974 -2488 1.47716785931325 -2490 1.47717746351979 -2492 1.47718774105152 -2494 1.47720108087222 -2496 1.47721116876733 -2498 1.47720908793559 -2500 1.47721975153658 -2502 1.47724153102797 -2504 1.47726842063502 -2506 1.47729164115863 -2508 1.47729793164711 -2510 1.47728751673010 -2512 1.47728595976167 -2514 1.47730346177822 -2516 1.47732866245654 -2518 1.47735480680865 -2520 1.47737778321487 -2522 1.47739640465051 -2524 1.47741388745850 -2526 1.47743674344455 -2528 1.47746686662636 -2530 1.47749859543051 -2532 1.47752798101785 -2534 1.47755196992726 -2536 1.47757059463727 -2538 1.47758008928483 -2540 1.47756988987874 -2542 1.47755427512999 -2544 1.47756361259663 -2546 1.47758639316885 -2548 1.47760210701986 -2550 1.47761136589934 -2552 1.47762359682751 -2554 1.47764677677048 -2556 1.47767474710701 -2558 1.47770246497527 -2560 1.47773042785198 -2562 1.47776361629940 -2564 1.47779998470837 -2566 1.47783821733131 -2568 1.47787806111451 -2570 1.47792064098960 -2572 1.47796488547863 -2574 1.47800956216730 -2576 1.47805314833494 -2578 1.47809883475004 -2580 1.47814186001493 -2582 1.47815997256423 -2584 1.47809360441189 -2586 1.47790866325303 -2588 1.47773400000000 -2590 1.47767480433235 -2592 1.47770364229106 -2594 1.47776662663767 -2596 1.47783459041379 -2598 1.47789713249225 -2600 1.47795076443856 -2602 1.47798212010995 -2604 1.47796839500240 -2606 1.47793022585363 -2608 1.47793384355028 -2610 1.47794564701586 -2612 1.47795047312967 -2614 1.47797539539217 -2616 1.47801274460181 -2618 1.47805108460942 -2620 1.47808604011951 -2622 1.47811663248782 -2624 1.47814577420760 -2626 1.47817100891022 -2628 1.47819185746701 -2630 1.47820200756835 -2632 1.47819509341812 -2634 1.47818069648523 -2636 1.47819937787229 -2638 1.47823535219485 -2640 1.47827081637876 -2642 1.47830404351228 -2644 1.47832995386373 -2646 1.47835243329009 -2648 1.47837673632241 -2650 1.47840422324866 -2652 1.47843503880664 -2654 1.47846525754672 -2656 1.47849229804531 -2658 1.47851619218461 -2660 1.47854228554823 -2662 1.47857183053155 -2664 1.47860675830984 -2666 1.47864502580642 -2668 1.47868442524625 -2670 1.47871645234617 -2672 1.47872844710197 -2674 1.47874644966096 -2676 1.47878367512841 -2678 1.47882577091271 -2680 1.47886734102623 -2682 1.47890576030499 -2684 1.47894410487476 -2686 1.47898246676081 -2688 1.47902078634990 -2690 1.47905697663379 -2692 1.47909348635787 -2694 1.47913253241860 -2696 1.47917713682535 -2698 1.47922494363690 -2700 1.47927370219512 -2702 1.47932350132184 -2704 1.47937477829841 -2706 1.47942977955203 -2708 1.47948662996503 -2710 1.47954572465315 -2712 1.47960899951982 -2714 1.47967582145469 -2716 1.47974783424700 -2718 1.47982686383801 -2720 1.47991434869689 -2722 1.48001161889876 -2724 1.48011529035864 -2726 1.48021743640732 -2728 1.48029271013490 -2730 1.48028469924544 -2732 1.48009333694647 -2734 1.47968604519118 -2736 1.47926069770098 -2738 1.47904382199068 -2740 1.47903137276969 -2742 1.47912234371550 -2744 1.47924475242006 -2746 1.47936896123536 -2748 1.47948547683776 -2750 1.47959346670195 -2752 1.47969391424782 -2754 1.47978696270901 -2756 1.47987478298896 -2758 1.47995758449142 -2760 1.48003727324589 -2762 1.48011924219933 -2764 1.48019913384442 -2766 1.48027922637338 -2768 1.48035769798330 -2770 1.48043385800477 -2772 1.48050725415469 -2774 1.48057567058368 -2776 1.48065105935983 -2778 1.48072266299449 -2780 1.48079977415031 -2782 1.48088053164822 -2784 1.48096687278145 -2786 1.48105512159158 -2788 1.48114937559786 -2790 1.48124466747644 -2792 1.48134118881539 -2794 1.48144014454067 -2796 1.48153308521599 -2798 1.48162875830237 -2800 1.48173023207917 -2802 1.48183567152155 -2804 1.48193764434860 -2806 1.48203772197889 -2808 1.48213332822876 -2810 1.48221893030834 -2812 1.48230128068059 -2814 1.48241543210576 -2816 1.48256188329700 -2818 1.48272146386266 -2820 1.48288593713105 -2822 1.48303146156846 -2824 1.48316535466125 -2826 1.48333287967432 -2828 1.48353886468435 -2830 1.48376233940652 -2832 1.48399372362724 -2834 1.48422859660869 -2836 1.48446914811588 -2838 1.48472335986644 -2840 1.48498891752954 -2842 1.48526978967144 -2844 1.48556244410920 -2846 1.48585030113417 -2848 1.48611635747129 -2850 1.48631703683473 -2852 1.48642616794096 -2854 1.48638931900690 -2856 1.48617288132870 -2858 1.48578055258264 -2860 1.48528254616381 -2862 1.48477473720320 -2864 1.48431306898547 -2866 1.48390294869478 -2868 1.48352758708888 -2870 1.48315923324289 -2872 1.48276317318322 -2874 1.48233036174381 -2876 1.48190033197863 -2878 1.48156989857095 -2880 1.48135829837939 -2882 1.48127046426508 -2884 1.48129224687463 -2886 1.48142276034719 -2888 1.48166152381514 -2890 1.48199469355260 -2892 1.48241286263108 -2894 1.48290615618025 -2896 1.48346174779728 -2898 1.48406068695481 -2900 1.48469749104873 -2902 1.48534901849277 -2904 1.48600451268347 -2906 1.48663330502903 -2908 1.48716049340272 -2910 1.48749427432860 -2912 1.48745634999468 -2914 1.48687918789111 -2916 1.48564647709805 -2918 1.48378138421067 -2920 1.48160842259702 -2922 1.47963902212310 -2924 1.47817563267450 -2926 1.47725366173650 -2928 1.47680009878321 -2930 1.47670600337876 -2932 1.47683592850229 -2934 1.47707848906770 -2936 1.47736368012666 -2938 1.47761998820843 -2940 1.47780991969196 -2942 1.47790616610153 -2944 1.47789352215007 -2946 1.47776642994662 -2948 1.47755303644224 -2950 1.47732098571495 -2952 1.47710982305520 -2954 1.47692656410946 -2956 1.47677865708199 -2958 1.47664389769752 -2960 1.47653950030308 -2962 1.47652380859929 -2964 1.47671143784641 -2966 1.47706590558488 -2968 1.47742684312635 -2970 1.47770009243870 -2972 1.47786247321149 -2974 1.47794741384886 -2976 1.47797899370123 -2978 1.47798223648454 -2980 1.47795004028588 -2982 1.47790147416153 -2984 1.47795735389707 -2986 1.47814496927765 -2988 1.47844692443850 -2990 1.47884918651108 -2992 1.47932344250011 -2994 1.47986306802417 -2996 1.48043188046815 -2998 1.48097537656156 -3000 1.48138517100778 -3002 1.48162356419426 -3004 1.48185212024737 -3006 1.48228440440630 -3008 1.48297178567222 -3010 1.48385673952528 -3012 1.48487993544870 -3014 1.48595665242293 -3016 1.48695938009756 -3018 1.48767468298278 -3020 1.48765524108674 -3022 1.48618132554454 -3024 1.48268461964750 -3026 1.47762082421352 -3028 1.47232727506644 -3030 1.46776463943145 -3032 1.46440878935946 -3034 1.46247197560802 -3036 1.46196769309556 -3038 1.46253947223186 -3040 1.46367382189299 -3042 1.46491417717244 -3044 1.46601563099238 -3046 1.46697686500990 -3048 1.46781464802766 -3050 1.46847402904648 -3052 1.46887853308036 -3054 1.46895675121188 -3056 1.46875323941201 -3058 1.46834302704055 -3060 1.46771282666113 -3062 1.46675300487368 -3064 1.46553703632205 -3066 1.46435734374414 -3068 1.46364333274111 -3070 1.46361967631567 -3072 1.46416270683630 -3074 1.46500589551713 -3076 1.46593266001109 -3078 1.46681497080407 -3080 1.46754108115619 -3082 1.46785690887919 -3084 1.46726760945338 -3086 1.46533247163430 -3088 1.46268292062625 -3090 1.46120303549580 -3092 1.46134478479294 -3094 1.46221369798373 -3096 1.46321247938499 -3098 1.46411661764251 -3100 1.46482369285261 -3102 1.46525636685728 -3104 1.46533581524600 -3106 1.46519098442260 -3108 1.46516907412280 -3110 1.46538060689336 -3112 1.46568276755924 -3114 1.46596931336371 -3116 1.46619739482536 -3118 1.46639101964608 -3120 1.46661054944789 -3122 1.46687049156442 -3124 1.46713909721892 -3126 1.46740251735782 -3128 1.46765965900548 -3130 1.46790595336806 -3132 1.46813448944673 -3134 1.46834723054744 -3136 1.46854553575727 -3138 1.46872578997706 -3140 1.46889606787041 -3142 1.46905361684206 -3144 1.46920788445114 -3146 1.46935155893370 -3148 1.46948926642375 -3150 1.46961711994727 -3152 1.46973932284344 -3154 1.46985771524525 -3156 1.46997084147302 -3158 1.47008125375275 -3160 1.47018834504960 -3162 1.47028749194193 -3164 1.47037561555632 -3166 1.47044733671974 -3168 1.47049523638823 -3170 1.47053287904761 -3172 1.47059397007388 -3174 1.47068028883230 -3176 1.47077100092966 -3178 1.47085834352883 -3180 1.47094237966502 -3182 1.47102127140257 -3184 1.47109691171596 -3186 1.47116815404231 -3188 1.47123618567128 -3190 1.47130184743484 -3192 1.47136511381017 -3194 1.47142734846007 -3196 1.47148851688128 -3198 1.47154755038698 -3200 1.47160533014890 -3202 1.47166012795457 -3204 1.47171224992608 -3206 1.47176315489772 -3208 1.47181395071669 -3210 1.47186466789480 -3212 1.47191661577937 -3214 1.47196738520913 -3216 1.47201707857991 -3218 1.47206588870145 -3220 1.47211365240659 -3222 1.47215936522226 -3224 1.47220500735251 -3226 1.47225033231421 -3228 1.47229424065224 -3230 1.47233733691715 -3232 1.47237980638024 -3234 1.47242122252104 -3236 1.47246173766460 -3238 1.47250090500984 -3240 1.47253933121953 -3242 1.47257666559418 -3244 1.47261289353408 -3246 1.47264942225475 -3248 1.47268468000033 -3250 1.47271896562139 -3252 1.47275329822459 -3254 1.47278723826016 -3256 1.47281957643892 -3258 1.47285086138010 -3260 1.47288192451579 -3262 1.47291300000000 -3264 1.47294399234620 -3266 1.47297519999867 -3268 1.47300456597122 -3270 1.47303306949960 -3272 1.47306229798834 -3274 1.47309029819990 -3276 1.47311725100397 -3278 1.47314519229524 -3280 1.47317191831342 -3282 1.47319904835607 -3284 1.47322480511295 -3286 1.47325068033533 -3288 1.47327558727819 -3290 1.47330149637565 -3292 1.47332523279087 -3294 1.47335025198767 -3296 1.47337510971327 -3298 1.47339905996618 -3300 1.47342296954304 -3302 1.47344582202335 -3304 1.47346658074592 -3306 1.47348738493031 -3308 1.47350703202034 -3310 1.47352683574489 -3312 1.47354755048152 -3314 1.47356829450234 -3316 1.47358903215508 -3318 1.47360880465673 -3320 1.47362855417648 -3322 1.47364734936801 -3324 1.47366547803442 -3326 1.47368305009043 -3328 1.47369959979993 -3330 1.47371718446385 -3332 1.47373378124277 -3334 1.47375068696817 -3336 1.47376844875514 -3338 1.47378666053286 -3340 1.47380404591194 -3342 1.47382276516742 -3344 1.47384040963255 -3346 1.47385904663877 -3348 1.47387858239480 -3350 1.47389752320424 -3352 1.47391752328576 -3354 1.47393606713734 -3356 1.47395488874822 -3358 1.47397353990369 -3360 1.47399234620080 -3362 1.47401055721405 -3364 1.47402826981442 -3366 1.47404508175359 -3368 1.47406141829832 -3370 1.47407704342040 -3372 1.47409059132764 -3374 1.47410503032631 -3376 1.47411782704824 -3378 1.47413081528590 -3380 1.47414326557675 -3382 1.47415571156753 -3384 1.47416717298263 -3386 1.47417841575972 -3388 1.47418915024028 -3390 1.47419998707473 -3392 1.47421190062571 -3394 1.47422443429139 -3396 1.47423683452363 -3398 1.47425033505022 -3400 1.47426480528893 -3402 1.47427826680738 -3404 1.47429170418534 -3406 1.47430477066294 -3408 1.47431835512023 -3410 1.47433193595530 -3412 1.47434642118416 -3414 1.47436087920127 -3416 1.47437532634686 -3418 1.47439018109776 -3420 1.47440515622779 -3422 1.47442044328205 -3424 1.47443606103306 -3426 1.47444964436527 -3428 1.47446294847254 -3430 1.47447439134230 -3432 1.47448416869267 -3434 1.47449072019392 -3436 1.47449591374259 -3438 1.47449903792179 -3440 1.47449993449953 -3442 1.47450135456237 -3444 1.47450458795612 -3446 1.47450875108451 -3448 1.47451445884208 -3450 1.47452484258401 -3452 1.47453827241797 -3454 1.47455172262247 -3456 1.47456517206426 -3458 1.47457860151852 -3460 1.47459192059468 -3462 1.47460450298261 -3464 1.47461696547474 -3466 1.47462839859281 -3468 1.47463987388367 -3470 1.47465188200346 -3472 1.47466266389847 -3474 1.47467409691578 -3476 1.47468473670609 -3478 1.47469608306209 -3480 1.47470752002888 -3482 1.47471885889080 -3484 1.47473141107054 -3486 1.47474321664113 -3488 1.47475540477105 -3490 1.47476577603289 -3492 1.47477517654069 -3494 1.47478437686762 -3496 1.47479375265910 -3498 1.47480352784050 -3500 1.47481386454326 -3502 1.47482540254891 -3504 1.47483686546170 -3506 1.47484922964243 -3508 1.47486054239155 -3510 1.47487118057395 -3512 1.47488161773392 -3514 1.47489155648764 -3516 1.47489779215940 -3518 1.47490199751604 -3520 1.47490515212000 -3522 1.47490858576642 -3524 1.47491589352572 -3526 1.47492563809847 -3528 1.47493721829251 -3530 1.47494965183138 -3532 1.47496209482301 -3534 1.47497548127118 -3536 1.47498901026331 -3538 1.47500250064110 -3540 1.47501334375007 -3542 1.47502155988466 -3544 1.47502590855583 -3546 1.47502798788122 -3548 1.47502908741446 -3550 1.47503013111600 -3552 1.47503152066431 -3554 1.47503369017078 -3556 1.47503596161309 -3558 1.47503994401260 -3560 1.47504720780187 -3562 1.47505757685400 -3564 1.47506921753979 -3566 1.47508222835820 -3568 1.47509583612677 -3570 1.47510943592653 -3572 1.47512299244722 -3574 1.47513544229862 -3576 1.47514788646150 -3578 1.47515877336465 -3580 1.47516830010454 -3582 1.47517301097796 -3584 1.47516730096467 -3586 1.47516098788624 -3588 1.47515999912529 -3590 1.47516344979552 -3592 1.47516995891151 -3594 1.47517893497533 -3596 1.47518949533554 -3598 1.47519986950803 -3600 1.47520815315630 -3602 1.47521639684906 -3604 1.47522677803691 -3606 1.47523756307109 -3608 1.47524905817071 -3610 1.47526235394740 -3612 1.47527689090454 -3614 1.47529241512157 -3616 1.47530577596310 -3618 1.47531550675526 -3620 1.47531807217956 -3622 1.47531330897623 -3624 1.47530520668685 -3626 1.47530099713781 -3628 1.47530419555884 -3630 1.47531292297539 -3632 1.47532682994681 -3634 1.47534230166646 -3636 1.47535817866622 -3638 1.47537270802382 -3640 1.47538306617453 -3642 1.47538491013479 -3644 1.47537808441815 -3646 1.47536152773521 -3648 1.47533829820411 -3650 1.47531127187157 -3652 1.47528831452931 -3654 1.47527173292062 -3656 1.47526400688559 -3658 1.47526538002071 -3660 1.47527196497124 -3662 1.47528332467912 -3664 1.47529547167214 -3666 1.47530792033597 -3668 1.47531940264238 -3670 1.47532950934428 -3672 1.47533752543273 -3674 1.47534264633859 -3676 1.47534493660391 -3678 1.47534793834948 -3680 1.47535101048592 -3682 1.47535512741537 -3684 1.47536061029192 -3686 1.47536677517540 -3688 1.47537422152313 -3690 1.47538349069671 -3692 1.47539466802181 -3694 1.47540614815786 -3696 1.47541766757740 -3698 1.47543103564364 -3700 1.47544309274752 -3702 1.47545168948545 -3704 1.47545396563826 -3706 1.47545207507319 -3708 1.47544797484465 -3710 1.47544704753668 -3712 1.47545189667326 -3714 1.47545995926878 -3716 1.47547095072698 -3718 1.47548066602429 -3720 1.47548697893292 -3722 1.47548796009613 -3724 1.47548478177503 -3726 1.47547947641639 -3728 1.47547863259801 -3730 1.47548174475524 -3732 1.47548778078125 -3734 1.47549403635331 -3736 1.47550125363908 -3738 1.47550934180435 -3740 1.47551683167599 -3742 1.47552688594006 -3744 1.47553729090548 -3746 1.47554678198008 -3748 1.47555713325216 -3750 1.47556659302775 -3752 1.47557669459374 -3754 1.47558647315562 -3756 1.47559529768016 -3758 1.47560360009648 -3760 1.47561091508282 -3762 1.47561609735508 -3764 1.47562029070796 -3766 1.47562441780911 -3768 1.47563306550754 -3770 1.47564405166112 -3772 1.47565552291783 -3774 1.47566694809298 -3776 1.47567830857219 -3778 1.47568755133462 -3780 1.47569463620025 -3782 1.47569547492168 -3784 1.47568951387041 -3786 1.47567835935080 -3788 1.47566593929693 -3790 1.47566101977927 -3792 1.47566354952827 -3794 1.47567185732029 -3796 1.47568321348889 -3798 1.47569529254648 -3800 1.47570772530959 -3802 1.47571809962768 -3804 1.47572648401529 -3806 1.47573134192597 -3808 1.47573352027040 -3810 1.47573292361008 -3812 1.47573299326894 -3814 1.47573398673360 -3816 1.47573817632205 -3818 1.47574527524272 -3820 1.47575277086820 -3822 1.47575967350287 -3824 1.47576470303911 -3826 1.47576975528735 -3828 1.47577698612879 -3830 1.47578309783396 -3832 1.47578829704916 -3834 1.47579095824278 -3836 1.47578839924332 -3838 1.47578153880935 -3840 1.47577325828602 -3842 1.47576695658169 -3844 1.47576181472562 -3846 1.47575638975092 -3848 1.47574893511221 -3850 1.47574067656252 -3852 1.47573418960490 -3854 1.47573201348304 -3856 1.47573609448654 -3858 1.47574340076582 -3860 1.47575406506568 -3862 1.47576509594980 -3864 1.47577344240290 -3866 1.47577782298125 -3868 1.47577704417063 -3870 1.47576978782061 -3872 1.47576167888626 -3874 1.47575983530599 -3876 1.47576615931522 -3878 1.47577603616264 -3880 1.47578749602566 -3882 1.47579899049744 -3884 1.47580829754193 -3886 1.47581553191111 -3888 1.47582044576450 -3890 1.47582361486597 -3892 1.47582488670530 -3894 1.47582691190401 -3896 1.47582798767520 -3898 1.47583005776107 -3900 1.47583333559154 -3902 1.47583798052018 -3904 1.47584349792097 -3906 1.47584878503057 -3908 1.47585104104660 -3910 1.47584786442429 -3912 1.47584503864650 -3914 1.47584772763597 -3916 1.47585513011730 -3918 1.47586161194681 -3920 1.47586680114244 -3922 1.47586801742881 -3924 1.47586285228063 -3926 1.47585768990955 -3928 1.47585725672200 -3930 1.47586502926929 -3932 1.47587638834149 -3934 1.47588758559686 -3936 1.47589600406114 -3938 1.47590331354213 -3940 1.47591060804636 -3942 1.47591789591720 -3944 1.47592457142526 -3946 1.47593081059303 -3948 1.47593398581283 -3950 1.47593295565452 -3952 1.47592878275285 -3954 1.47592684349640 -3956 1.47592986168501 -3958 1.47593628896516 -3960 1.47594351825970 -3962 1.47595186222678 -3964 1.47595911320580 -3966 1.47596854991323 -3968 1.47597712871599 -3970 1.47598746992252 -3972 1.47600004422535 -3974 1.47601337421929 -3976 1.47602692154134 -3978 1.47603405627977 -3980 1.47602817354059 -3982 1.47601874488156 -3984 1.47602563707167 -3986 1.47604367443527 -3988 1.47606327560645 -3990 1.47608304122308 -3992 1.47610269526207 -3994 1.47612262206064 -3996 1.47614078459134 -3998 1.47615752083133 -4000 1.47617133599432 \ No newline at end of file diff --git a/globals.h b/globals.h index 8b742d2..7fc8500 100644 --- a/globals.h +++ b/globals.h @@ -1,118 +1,122 @@ -#ifndef GLOBALS_H -#define GLOBALS_H - -#include -#include -#include -#include "PerformanceData.h" -#include -using namespace std; - -typedef float rtsFloat; - -struct SpecPair{ - double nu; - double A; -}; - -struct Material{ - vector nu; - vector > eta; - string name; -}; - -enum SpecType {AbsorbanceSpecType, IntensitySpecType}; -enum OpticsType {TransmissionOpticsType, ReflectionOpticsType}; - -extern PerformanceData PD; - - -extern vector > RefSpectrum; -extern int currentSpec; -extern vector SimSpectrum; - -//IO Functions -vector LoadSpectrum(string filename); -vector SetReferenceSpectrum(char* text); -void SaveState(); -void LoadState(); -void SetDefaults(); -void SaveSimulation(string fileName); -void SaveK(string fileName); -void SaveN(string fileName); -void LoadMaterial(string fileNameK, string fileNameN, string materialName); -void LoadMaterial(string fileNameK, string materialName); - -//Display Functions -void FitDisplay(); - -//Update Functions -void UpdateDisplay(); -void SimulateSpectrum(); -void cudaKramersKronig(double* cpuN, double* cpuK, int nVals, double nuStart, double nuEnd, double nOffset); -void cudaComputeSpectrum(double* cpuI, double* cpuB, double* alpha, - int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples); - -//Window Parameters -extern double nuMin; -extern double nuMax; -extern double aMin; -extern double aMax; -extern double dNu; -extern bool dispRefSpec; -extern bool dispSimSpec; -extern bool dispSimK; -extern bool dispMatK; -extern bool dispSimN; -extern bool dispMatN; -extern SpecType dispSimType; -extern bool dispNormalize; -extern double dispNormFactor; - - -extern double dispScaleK; -extern double dispScaleN; - -//material parameters -extern double radius; -extern double baseIR; -extern double cA; -extern vector EtaK; -extern vector EtaN; -extern bool applyMaterial; -extern vector MaterialList; -extern int currentMaterial; -void ChangeAbsorbance(); -void SetMaterial(); - -//source parameters -extern vector SourceSpectrum; -extern vector SourceResampled; -void ResampleSource(); //resample a source profile to match the sample points of the current material -extern bool useSourceSpectrum; - -//optical parameters -extern double cNAi; -extern double cNAo; -extern double oNAi; -extern double oNAo; -extern OpticsType opticsMode; -extern bool pointDetector; -extern int objectiveSamples; - -//fitting parameters -extern double minMSE; -extern int maxFitIter; -void EstimateMaterial(); -extern double scaleI0; -extern double refSlope; - - -//distortion maps -double ComputeDistortion(); -void DistortionMap(float* distortionMap, int nSteps); - - - - -#endif +#ifndef GLOBALS_H +#define GLOBALS_H + +#include +#include +#include +#include "PerformanceData.h" +#include +using namespace std; + +typedef float rtsFloat; + +struct SpecPair { + double nu; + double A; +}; + +struct Material { + vector nu; + vector > eta; + bool validN; + bool validK; + string name; +}; + +enum SpecType {AbsorbanceSpecType, IntensitySpecType}; +enum OpticsType {TransmissionOpticsType, ReflectionOpticsType}; + +extern PerformanceData PD; + + +extern vector > RefSpectrum; +extern int currentSpec; +extern vector SimSpectrum; + +//IO Functions +vector LoadSpectrum(string filename); +vector SetReferenceSpectrum(char* text); +void SaveState(); +void LoadState(); +void SetDefaults(); +void SaveSimulation(string fileName); +//void SaveK(string fileName); +void SaveMaterial(string fileName); +//void LoadMaterial(string fileNameK, string fileNameN, string materialName); +void LoadMaterial(string fileName, string materialName); + +//Display Functions +void FitDisplay(); + +//Update Functions +void UpdateDisplay(); +void SimulateSpectrum(); +void cudaKramersKronig(double* cpuN, double* cpuK, int nVals, double nuStart, double nuEnd, double nOffset); +void cudaComputeSpectrum(double* cpuI, double* cpuB, double* alpha, + int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples); + +//Window Parameters +extern double nuMin; //wavenumbers +extern double nuMax; +extern double aMin; //absorbance +extern double aMax; +extern double dNu; +extern double nMag; //largest magnitude for n +extern double kMax; //highest extinction coefficient +extern bool dispRefSpec; +extern bool dispSimSpec; +extern bool dispSimK; +extern bool dispMatK; +extern bool dispSimN; +extern bool dispMatN; +extern SpecType dispSimType; +extern bool dispNormalize; +extern double dispNormFactor; + + +extern double dispScaleK; +extern double dispScaleN; + +//material parameters +extern double radius; +extern double baseIR; +extern double cA; +extern vector EtaK; +extern vector EtaN; +extern bool applyMaterial; +extern vector MaterialList; +extern int currentMaterial; +void ChangeAbsorbance(); +void SetMaterial(); + +//source parameters +extern vector SourceSpectrum; +extern vector SourceResampled; +void ResampleSource(); //resample a source profile to match the sample points of the current material +extern bool useSourceSpectrum; + +//optical parameters +extern double cNAi; +extern double cNAo; +extern double oNAi; +extern double oNAo; +extern OpticsType opticsMode; +extern bool pointDetector; +extern int objectiveSamples; + +//fitting parameters +extern double minMSE; +extern int maxFitIter; +void EstimateMaterial(); +extern double scaleI0; +extern double refSlope; + + +//distortion maps +double ComputeDistortion(); +void DistortionMap(float* distortionMap, int nSteps); + + + + +#endif diff --git a/interactivemie.cpp b/interactivemie.cpp index a76543f..cf6e56f 100644 --- a/interactivemie.cpp +++ b/interactivemie.cpp @@ -1,22 +1,22 @@ -#include "interactivemie.h" -#include +#include "interactivemie.h" +#include qtDistortionDialog* distortionDialog; - -InteractiveMie::InteractiveMie(QWidget *parent, Qt::WFlags flags) - : QMainWindow(parent, flags) -{ - ui.setupUi(this); -} - -InteractiveMie::~InteractiveMie() -{ - updating = false; + +InteractiveMie::InteractiveMie(QWidget *parent, Qt::WFlags flags) + : QMainWindow(parent, flags) +{ + ui.setupUi(this); +} + +InteractiveMie::~InteractiveMie() +{ + updating = false; } void InteractiveMie::closeEvent(QCloseEvent *event) { - cout<<"Exiting"< -#include -#include -#include -#include "ui_interactivemie.h" -#include "qtDistortionDialog.h" -#include "globals.h" - -extern qtDistortionDialog* distortionDialog; - -class InteractiveMie : public QMainWindow -{ - Q_OBJECT - -public: - InteractiveMie(QWidget *parent = 0, Qt::WFlags flags = 0); - ~InteractiveMie(); - void closeEvent(QCloseEvent *event); - bool updating; - - void refreshUI() - { - updating = true; - - ui.spinNuMin->setValue(nuMin); - ui.spinNuMax->setValue(nuMax); - ui.spinAMin->setValue(aMin); - ui.spinAMax->setValue(aMax); - ui.spinRadius->setValue(radius); - ui.spinBaseIR->setValue(baseIR); - ui.spinScaleK->setValue(cA); - ui.spinObjNAi->setValue(oNAi); - ui.spinObjNAo->setValue(oNAo); - ui.spinCondNAi->setValue(cNAi); - ui.spinCondNAo->setValue(cNAo); - ui.spinError->setValue(minMSE); - ui.spinMaxIter->setValue(maxFitIter); - ui.spinI0Scale->setValue(scaleI0); - - //display spectra values - ui.chkDisplaySimSpec->setChecked(dispSimSpec); - ui.chkDisplayRefSpec->setChecked(dispRefSpec); - ui.chkDisplaySimK->setChecked(dispSimK); - ui.chkDisplayMatK->setChecked(dispMatK); - ui.chkDisplaySimN->setChecked(dispSimN); - ui.chkDisplayMatN->setChecked(dispMatN); - ui.spinDispScaleK->setValue(dispScaleK); - ui.spinDispScaleN->setValue(dispScaleN); - - //material selection combo box - ui.cmbMaterial->clear(); - for(unsigned int i=0; iaddItem(MaterialList[i].name.c_str(), i); - ui.cmbMaterial->setCurrentIndex(currentMaterial); - - updating = false; - } - - void dragEnterEvent(QDragEnterEvent *event) - { - cout<<"This is a test."<mimeData()->formats(); - if (event->mimeData()->hasFormat("application/x-qt-windows-mime;value=\"FileName\"") || - event->mimeData()->hasFormat("text/plain")) - { - event->acceptProposedAction(); - - } - } - - void dropEvent(QDropEvent *event) - { - //cout<<"Challenge Accepted."<mimeData()->text().toAscii().data())); - UpdateDisplay(); - } - -private: - Ui::InteractiveMieClass ui; - -public slots: - //display parameters - void on_spinNuMin_valueChanged(int i){ - nuMin = (float)i; - UpdateDisplay(); - } - void on_spinNuMax_valueChanged(int i){ - nuMax = (float)i; - UpdateDisplay(); - } - void on_spinAMin_valueChanged(double d){ - aMin = d; - UpdateDisplay(); - } - void on_spinAMax_valueChanged(double d){ - aMax = d; - UpdateDisplay(); - } - void on_chkDisplaySimSpec_clicked(bool b){ - dispSimSpec = b; - UpdateDisplay(); - } - void on_chkDisplayRefSpec_clicked(bool b){ - dispRefSpec = b; - UpdateDisplay(); - } - void on_chkDisplaySimK_clicked(bool b){ - dispSimK = b; - UpdateDisplay(); - } - void on_chkDisplayMatK_clicked(bool b){ - dispMatK = b; - UpdateDisplay(); - } - void on_chkDisplaySimN_clicked(bool b){ - dispSimN = b; - UpdateDisplay(); - } - void on_chkDisplayMatN_clicked(bool b){ - dispMatN = b; - UpdateDisplay(); - } - void on_spinDispScaleK_valueChanged(double d){ - dispScaleK = d; - UpdateDisplay(); - } - void on_spinDispScaleN_valueChanged(double d){ - dispScaleN = d; - UpdateDisplay(); - } - void on_radDisplayAbsorbance_clicked(bool b){ - dispSimType = AbsorbanceSpecType; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_radDisplayIntensity_toggled(bool b){ - dispSimType = IntensitySpecType; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_chkNormalize_clicked(bool b){ - dispNormalize = b; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinNormFactor_valueChanged(double d){ - dispNormFactor = d; - SimulateSpectrum(); - UpdateDisplay(); - } - - //material parameters - void on_spinRadius_valueChanged(double d){ - radius = d; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinBaseIR_valueChanged(double d){ - baseIR = d; - ChangeAbsorbance(); - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinScaleK_valueChanged(double d){ - cA = d; - ChangeAbsorbance(); - SimulateSpectrum(); - UpdateDisplay(); - } - void on_chkApplyMaterial_clicked(bool b){ - applyMaterial = b; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_cmbMaterial_currentIndexChanged(int i){ - if(updating) return; - - currentMaterial = i; - SetMaterial(); - SimulateSpectrum(); - UpdateDisplay(); - refreshUI(); - } - - //optical parameters - void on_spinCondNAi_valueChanged(double d){ - cNAi = d; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinCondNAo_valueChanged(double d){ - cNAo = d; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinObjNAi_valueChanged(double d){ - oNAi = d; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinObjNAo_valueChanged(double d){ - oNAo = d; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_radTransmissionOptics_clicked(bool d){ - ui.spinCondNAi->setEnabled(true); - ui.spinCondNAo->setEnabled(true); - opticsMode = TransmissionOpticsType; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_radReflectionOptics_clicked(bool d){ - ui.spinCondNAi->setEnabled(false); - ui.spinCondNAo->setEnabled(false); - ui.radDisplayAbsorbance->setEnabled(false); - ui.radDisplayIntensity->setChecked(true); - opticsMode = ReflectionOpticsType; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_chkPointDetector_clicked(bool b){ - if(b) - { - pointDetector = true; - ui.spinObjectiveSamples->setEnabled(false); - } - else - { - pointDetector = false; - ui.spinObjectiveSamples->setEnabled(true); - } - - SimulateSpectrum(); - UpdateDisplay(); - } - - void on_spinObjectiveSamples_valueChanged(int i){ - objectiveSamples = i; - SimulateSpectrum(); - UpdateDisplay(); - } - - //Fitting - void on_spinMaxIter_valueChanged(int i){ - maxFitIter = i; - } - void on_spinError_valueChanged(double d){ - minMSE = d; - } - void on_spinI0Scale_valueChanged(double d){ - scaleI0 = d; - SimulateSpectrum(); - UpdateDisplay(); - } - void on_spinRefSlope_valueChanged(double d){ - refSlope = d; - UpdateDisplay(); - } - - //display settings - - //Buttons - void on_btnFit_clicked(){ - FitDisplay(); - refreshUI(); - } - void on_btnSave_clicked(){ - SaveState(); - } - void on_btnReset_clicked(){ - SetDefaults(); - SimulateSpectrum(); - UpdateDisplay(); - refreshUI(); - } - void on_btnResetK_clicked(){ - ChangeAbsorbance(); - SimulateSpectrum(); - UpdateDisplay(); - } - void on_btnEstimateK_clicked(){ - EstimateMaterial(); - SimulateSpectrum(); - UpdateDisplay(); - } - void on_btnDistortion_clicked(){ - //ComputeDistortion(); - //DistortionMap(); - cout<<"Distortion"<show(); - } - void on_btnTimings_clicked(){ - PD.PrintResults(cout); - } - - //menu items - void on_mnuLoadReference_triggered(){ - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Reference Spectrum")); - - if(fileName != QString::null){ - RefSpectrum.clear(); - RefSpectrum.push_back(LoadSpectrum(fileName.toAscii().data())); - } - UpdateDisplay(); - } - - void on_mnuLoadMaterial_triggered(){ - - //first load the imaginary part - QString kFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (k) Spectrum")); - - //exit if no file was selected - if(kFileName == QString::null) - return; - - QString nFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (n) Spectrum")); - - //request the material name - QString matName = QInputDialog::getText(this, tr("Material Name"), tr("Enter material name:")); - - //if a real part was given, load both - if(nFileName != QString::null) - LoadMaterial(kFileName.toAscii().data(), nFileName.toAscii().data(), matName.toAscii().data()); - else - LoadMaterial(kFileName.toAscii().data(), matName.toAscii().data()); - - //add the new material to the combo box - refreshUI(); - } - void on_mnuLoadSource_triggered(){ - cout<<"Load source."< +#include +#include +#include +#include "ui_interactivemie.h" +#include "qtDistortionDialog.h" +#include "globals.h" + +extern qtDistortionDialog* distortionDialog; + +class InteractiveMie : public QMainWindow +{ +Q_OBJECT + +public: +InteractiveMie(QWidget *parent = 0, Qt::WFlags flags = 0); +~InteractiveMie(); +void closeEvent(QCloseEvent *event); +bool updating; + +void refreshUI() +{ + updating = true; + + ui.spinNuMin->setValue(nuMin); + ui.spinNuMax->setValue(nuMax); + ui.spinAMin->setValue(aMin); + ui.spinAMax->setValue(aMax); + ui.spinRadius->setValue(radius); + ui.spinBaseIR->setValue(baseIR); + ui.spinScaleK->setValue(cA); + ui.spinObjNAi->setValue(oNAi); + ui.spinObjNAo->setValue(oNAo); + ui.spinCondNAi->setValue(cNAi); + ui.spinCondNAo->setValue(cNAo); + ui.spinError->setValue(minMSE); + ui.spinMaxIter->setValue(maxFitIter); + ui.spinI0Scale->setValue(scaleI0); + + //display spectra values + ui.chkDisplaySimSpec->setChecked(dispSimSpec); + ui.chkDisplayRefSpec->setChecked(dispRefSpec); + ui.chkDisplaySimK->setChecked(dispSimK); + ui.chkDisplayMatK->setChecked(dispMatK); + ui.chkDisplaySimN->setChecked(dispSimN); + ui.chkDisplayMatN->setChecked(dispMatN); + ui.spinDispScaleK->setValue(kMax); + ui.spinDispScaleN->setValue(nMag); + + //material selection combo box + ui.cmbMaterial->clear(); + for(unsigned int i=0; iaddItem(MaterialList[i].name.c_str(), i); + ui.cmbMaterial->setCurrentIndex(currentMaterial); + + updating = false; +} + +void dragEnterEvent(QDragEnterEvent *event) +{ + cout<<"This is a test."<mimeData()->formats(); + if (event->mimeData()->hasFormat("application/x-qt-windows-mime;value=\"FileName\"") || + event->mimeData()->hasFormat("text/plain")) + { + event->acceptProposedAction(); + + } +} + +void dropEvent(QDropEvent *event) +{ + //cout<<"Challenge Accepted."<mimeData()->text().toAscii().data())); + UpdateDisplay(); +} + +private: +Ui::InteractiveMieClass ui; + +public slots: +//display parameters +void on_spinNuMin_valueChanged(int i) { + if(updating) return; + nuMin = (float)i; + UpdateDisplay(); +} +void on_spinNuMax_valueChanged(int i) { + if(updating) return; + nuMax = (float)i; + UpdateDisplay(); +} +void on_spinAMin_valueChanged(double d) { + if(updating) return; + aMin = d; + UpdateDisplay(); +} +void on_spinAMax_valueChanged(double d) { + if(updating) return; + aMax = d; + UpdateDisplay(); +} +void on_chkDisplaySimSpec_clicked(bool b) { + if(updating) return; + dispSimSpec = b; + UpdateDisplay(); +} +void on_chkDisplayRefSpec_clicked(bool b) { + if(updating) return; + dispRefSpec = b; + UpdateDisplay(); +} +void on_chkDisplaySimK_clicked(bool b) { + if(updating) return; + dispSimK = b; + UpdateDisplay(); +} +void on_chkDisplayMatK_clicked(bool b) { + if(updating) return; + dispMatK = b; + UpdateDisplay(); +} +void on_chkDisplaySimN_clicked(bool b) { + if(updating) return; + dispSimN = b; + UpdateDisplay(); +} +void on_chkDisplayMatN_clicked(bool b) { + if(updating) return; + dispMatN = b; + UpdateDisplay(); +} +void on_spinDispScaleK_valueChanged(double d) { + if(updating) return; + kMax = d; + UpdateDisplay(); +} +void on_spinDispScaleN_valueChanged(double d) { + if(updating) return; + nMag = d; + UpdateDisplay(); +} +void on_radDisplayAbsorbance_clicked(bool b) { + if(updating) return; + dispSimType = AbsorbanceSpecType; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_radDisplayIntensity_toggled(bool b) { + if(updating) return; + dispSimType = IntensitySpecType; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_chkNormalize_clicked(bool b) { + if(updating) return; + dispNormalize = b; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_spinNormFactor_valueChanged(double d) { + if(updating) return; + dispNormFactor = d; + SimulateSpectrum(); + UpdateDisplay(); +} + +//material parameters +void on_spinRadius_valueChanged(double d) { + if(updating) return; + radius = d; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_chkAdjustIR_clicked(bool b) { + if(updating) return; + //allow the user to change the mean n and k values + ui.spinBaseIR->setEnabled(b); + ui.spinScaleK->setEnabled(b); + +} +void on_spinBaseIR_valueChanged(double d) { + if(updating) return; + baseIR = d; + ChangeAbsorbance(); + SimulateSpectrum(); + UpdateDisplay(); +} +void on_spinScaleK_valueChanged(double d) { + if(updating) return; + cA = d; + ChangeAbsorbance(); + SimulateSpectrum(); + UpdateDisplay(); +} +void on_chkApplyMaterial_clicked(bool b) { + if(updating) return; + applyMaterial = b; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_cmbMaterial_currentIndexChanged(int i) { + if(updating) return; + + currentMaterial = i; + SetMaterial(); + SimulateSpectrum(); + UpdateDisplay(); + refreshUI(); +} + +//optical parameters +void on_spinCondNAi_valueChanged(double d) { + cNAi = d; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_spinCondNAo_valueChanged(double d) { + cNAo = d; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_spinObjNAi_valueChanged(double d) { + oNAi = d; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_spinObjNAo_valueChanged(double d) { + oNAo = d; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_radTransmissionOptics_clicked(bool d) { + ui.spinCondNAi->setEnabled(true); + ui.spinCondNAo->setEnabled(true); + opticsMode = TransmissionOpticsType; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_radReflectionOptics_clicked(bool d) { + ui.spinCondNAi->setEnabled(false); + ui.spinCondNAo->setEnabled(false); + ui.radDisplayAbsorbance->setEnabled(false); + ui.radDisplayIntensity->setChecked(true); + opticsMode = ReflectionOpticsType; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_chkPointDetector_clicked(bool b) { + if(b) + { + pointDetector = true; + ui.spinObjectiveSamples->setEnabled(false); + } + else + { + pointDetector = false; + ui.spinObjectiveSamples->setEnabled(true); + } + + SimulateSpectrum(); + UpdateDisplay(); +} + +void on_spinObjectiveSamples_valueChanged(int i) { + objectiveSamples = i; + SimulateSpectrum(); + UpdateDisplay(); +} + +//Fitting +void on_spinMaxIter_valueChanged(int i) { + maxFitIter = i; +} +void on_spinError_valueChanged(double d) { + minMSE = d; +} +void on_spinI0Scale_valueChanged(double d) { + scaleI0 = d; + SimulateSpectrum(); + UpdateDisplay(); +} +void on_spinRefSlope_valueChanged(double d) { + refSlope = d; + UpdateDisplay(); +} + +//display settings + +//Buttons +void on_btnFit_clicked() { + FitDisplay(); + refreshUI(); +} +void on_btnSave_clicked() { + SaveState(); +} +void on_btnReset_clicked() { + SetDefaults(); + SimulateSpectrum(); + UpdateDisplay(); + refreshUI(); +} +void on_btnResetK_clicked() { + ChangeAbsorbance(); + SimulateSpectrum(); + UpdateDisplay(); +} +void on_btnEstimateK_clicked() { + EstimateMaterial(); + SimulateSpectrum(); + UpdateDisplay(); +} +void on_btnDistortion_clicked() { + //ComputeDistortion(); + //DistortionMap(); + cout<<"Distortion"<show(); +} +void on_btnTimings_clicked() { + PD.PrintResults(cout); +} + +//menu items +void on_mnuLoadReference_triggered() { + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Reference Spectrum")); + + if(fileName != QString::null) { + RefSpectrum.clear(); + RefSpectrum.push_back(LoadSpectrum(fileName.toAscii().data())); + } + UpdateDisplay(); +} + +void on_mnuLoadMaterial_triggered() { + + //first load the imaginary part + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Material Spectrum")); + + //exit if no file was selected + /*if(kFileName == QString::null) + return; + + QString nFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (n) Spectrum"));*/ + + //request the material name + QString matName = QInputDialog::getText(this, tr("Material Name"), tr("Enter material name:")); + + //if a real part was given, load both + /*if(nFileName != QString::null) + LoadMaterial(kFileName.toAscii().data(), nFileName.toAscii().data(), matName.toAscii().data()); + else + LoadMaterial(kFileName.toAscii().data(), matName.toAscii().data());*/ + LoadMaterial(fileName.toAscii().data(), matName.toAscii().data()); + + //add the new material to the combo box + refreshUI(); +} +void on_mnuLoadSource_triggered() { + cout<<"Load source."<20 170 151 - 161 + 191 Material + + false + 80 @@ -39,13 +42,16 @@ - 0.100000000000000 + 0.010000000000000 1.000000000000000 + + false + 80 @@ -67,14 +73,17 @@ - 30 + 20 50 46 - 13 + 21 - base IR + mean n + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -99,34 +108,40 @@ - 30 + 20 20 46 - 13 + 21 radius + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - 30 + 20 80 46 - 13 + 21 - scale K + scale k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 20 - 110 + 130 121 17 @@ -142,12 +157,28 @@ 20 - 140 + 160 111 22 + + + + 20 + 110 + 101 + 17 + + + + Adjust IR + + + false + + @@ -644,7 +675,7 @@ - 0.100000000000000 + 0.010000000000000 @@ -657,7 +688,7 @@ - 0.100000000000000 + 0.010000000000000 @@ -791,7 +822,7 @@ 20 - 340 + 370 201 111 @@ -860,7 +891,7 @@ - Estimate K + Estimate k @@ -873,7 +904,7 @@ - Reset K + Reset k @@ -913,8 +944,7 @@ Save - - + @@ -954,9 +984,9 @@ k - + - n + Material diff --git a/kPMMA.txt b/kPMMA.txt index 02c8156..a41ae37 100644 --- a/kPMMA.txt +++ b/kPMMA.txt @@ -1,3 +1,4 @@ +nu k 600 0.0241342 602 0.027446631 604 0.02823961 diff --git a/kPTFE.txt b/kPTFE.txt new file mode 100644 index 0000000..ebba27e --- /dev/null +++ b/kPTFE.txt @@ -0,0 +1,768 @@ +nu k +898.665771 0.119797 +902.522705 0.113611 +906.379639 0.106711 +910.236572 0.099793 +914.093506 0.099635 +917.950439 0.101204 +921.807373 0.104875 +925.664307 0.107064 +929.52124 0.103106 +933.378174 0.102888 +937.235107 0.105524 +941.092041 0.112168 +944.948975 0.118147 +948.805908 0.123335 +952.662842 0.125731 +956.519775 0.123265 +960.376709 0.123469 +964.233643 0.121685 +968.090576 0.12018 +971.94751 0.118345 +975.804443 0.115624 +979.661377 0.115624 +983.518311 0.115935 +987.375244 0.117921 +991.232178 0.12058 +995.089111 0.126018 +998.946045 0.135758 +1002.802979 0.149488 +1006.659912 0.166032 +1010.516846 0.184224 +1014.373779 0.199554 +1018.230713 0.205409 +1022.087646 0.208976 +1025.94458 0.209979 +1029.801514 0.204706 +1033.658447 0.195665 +1037.515381 0.185283 +1041.372314 0.177356 +1045.229248 0.171783 +1049.086182 0.168174 +1052.943115 0.165209 +1056.800049 0.164215 +1060.656982 0.164634 +1064.513916 0.167807 +1068.37085 0.175054 +1072.227783 0.183043 +1076.084717 0.192604 +1079.94165 0.201534 +1083.798584 0.209008 +1087.655518 0.216408 +1091.512451 0.224841 +1095.369385 0.230546 +1099.226318 0.228466 +1103.083252 0.221409 +1106.940186 0.212899 +1110.797119 0.205085 +1114.654053 0.195571 +1118.510986 0.189145 +1122.36792 0.190001 +1126.224854 0.195114 +1130.081787 0.206932 +1133.938721 0.231471 +1137.795654 0.277626 +1141.652588 0.362189 +1145.509521 0.508769 +1149.366455 0.675979 +1153.223389 0.742934 +1157.080322 0.713568 +1160.937256 0.634251 +1164.794189 0.538205 +1168.651123 0.451822 +1172.508057 0.371445 +1176.36499 0.304973 +1180.221924 0.272547 +1184.078857 0.278284 +1187.935791 0.311813 +1191.792725 0.370434 +1195.649658 0.456571 +1199.506592 0.571005 +1203.363525 0.690027 +1207.220459 0.768029 +1211.077393 0.801994 +1214.934326 0.81201 +1218.79126 0.815038 +1222.648193 0.807314 +1226.505249 0.790257 +1230.362061 0.760849 +1234.219116 0.717067 +1238.07605 0.664946 +1241.932861 0.597291 +1245.789917 0.520156 +1249.646851 0.441294 +1253.503784 0.37302 +1257.360718 0.314789 +1261.217651 0.254094 +1265.074585 0.189348 +1268.931519 0.136625 +1272.788452 0.107828 +1276.645386 0.096242 +1280.502319 0.091956 +1284.359253 0.090309 +1288.216187 0.090969 +1292.07312 0.090918 +1295.930054 0.090126 +1299.786987 0.088419 +1303.643921 0.081592 +1307.500854 0.073385 +1311.357788 0.066815 +1315.214722 0.063703 +1319.071655 0.062516 +1322.928589 0.061202 +1326.785522 0.061311 +1330.642456 0.061893 +1334.49939 0.063851 +1338.356323 0.066716 +1342.213257 0.068291 +1346.07019 0.068949 +1349.927124 0.071117 +1353.784058 0.074663 +1357.640991 0.077776 +1361.497925 0.080936 +1365.354858 0.080985 +1369.211792 0.079623 +1373.068726 0.079098 +1376.925659 0.07642 +1380.782593 0.073569 +1384.639526 0.07403 +1388.49646 0.074968 +1392.353394 0.075173 +1396.210327 0.077807 +1400.067261 0.079196 +1403.924194 0.080566 +1407.781128 0.083056 +1411.638062 0.084542 +1415.494995 0.089578 +1419.351929 0.093261 +1423.208862 0.091348 +1427.065796 0.09023 +1430.922729 0.091503 +1434.779663 0.094947 +1438.636597 0.09386 +1442.49353 0.090456 +1446.350464 0.0896 +1450.207397 0.087377 +1454.064331 0.088299 +1457.921265 0.090942 +1461.778198 0.0866 +1465.635132 0.085919 +1469.492065 0.089903 +1473.348999 0.094438 +1477.205933 0.094567 +1481.062866 0.092036 +1484.9198 0.096689 +1488.776733 0.100191 +1492.633667 0.099245 +1496.490601 0.097936 +1500.347534 0.094544 +1504.204468 0.100589 +1508.061401 0.105907 +1511.918335 0.09782 +1515.775269 0.095739 +1519.632202 0.100649 +1523.489136 0.098981 +1527.346069 0.094213 +1531.203003 0.092945 +1535.059937 0.095972 +1538.91687 0.10604 +1542.773804 0.106572 +1546.630737 0.098688 +1550.487671 0.096871 +1554.344604 0.104288 +1558.201538 0.114593 +1562.058472 0.106013 +1565.915405 0.100332 +1569.772339 0.101925 +1573.629272 0.102216 +1577.486206 0.102323 +1581.34314 0.099031 +1585.200073 0.098575 +1589.057007 0.099345 +1592.91394 0.098173 +1596.770874 0.099296 +1600.627808 0.098506 +1604.484741 0.099291 +1608.341675 0.099866 +1612.198608 0.10207 +1616.055542 0.108292 +1619.912476 0.108942 +1623.769409 0.111048 +1627.626343 0.10924 +1631.483276 0.109778 +1635.34021 0.114933 +1639.197144 0.108015 +1643.054077 0.103923 +1646.911011 0.106034 +1650.767944 0.112606 +1654.624878 0.112221 +1658.481812 0.104846 +1662.338745 0.105472 +1666.195679 0.106895 +1670.052612 0.109738 +1673.909546 0.111448 +1677.766479 0.109629 +1681.623413 0.11616 +1685.480347 0.117894 +1689.33728 0.111271 +1693.194214 0.112307 +1697.051147 0.121065 +1700.908081 0.121781 +1704.765015 0.11577 +1708.621948 0.1102 +1712.478882 0.110347 +1716.335815 0.117381 +1720.192749 0.113735 +1724.049683 0.108096 +1727.906738 0.109655 +1731.76355 0.115723 +1735.620605 0.11899 +1739.477539 0.117061 +1743.334473 0.117513 +1747.191406 0.119943 +1751.04834 0.120675 +1754.905273 0.117093 +1758.762207 0.116268 +1762.619141 0.116788 +1766.476074 0.116819 +1770.333008 0.122916 +1774.189941 0.121082 +1778.046875 0.117999 +1781.903809 0.118654 +1785.760742 0.117828 +1789.617676 0.120904 +1793.474609 0.12157 +1797.331543 0.120378 +1801.188477 0.119121 +1805.04541 0.118429 +1808.902344 0.120929 +1812.759277 0.121934 +1816.616211 0.121768 +1820.473145 0.122502 +1824.330078 0.125022 +1828.187012 0.126044 +1832.043945 0.124735 +1835.900879 0.122494 +1839.757812 0.121608 +1843.614746 0.12354 +1847.47168 0.122387 +1851.328613 0.120089 +1855.185547 0.119761 +1859.04248 0.119944 +1862.899414 0.121586 +1866.756348 0.12588 +1870.613281 0.126864 +1874.470215 0.125077 +1878.327148 0.126259 +1882.184082 0.126898 +1886.041016 0.12878 +1889.897949 0.130889 +1893.754883 0.130154 +1897.611816 0.128743 +1901.46875 0.12709 +1905.325684 0.126148 +1909.182617 0.12448 +1913.039551 0.124467 +1916.896484 0.126429 +1920.753418 0.126745 +1924.610352 0.125931 +1928.467285 0.126244 +1932.324219 0.128196 +1936.181152 0.129263 +1940.038086 0.130692 +1943.89502 0.132099 +1947.751953 0.132385 +1951.608887 0.132089 +1955.46582 0.13207 +1959.322754 0.132502 +1963.179688 0.133091 +1967.036621 0.134334 +1970.893555 0.133633 +1974.750488 0.132941 +1978.607422 0.132207 +1982.464355 0.130382 +1986.321289 0.130208 +1990.178223 0.130239 +1994.035156 0.130694 +1997.89209 0.130857 +2001.749023 0.131523 +2005.605957 0.132631 +2009.462891 0.13381 +2013.319824 0.135877 +2017.176758 0.137253 +2021.033691 0.137779 +2024.890625 0.137152 +2028.747559 0.136642 +2032.604492 0.136288 +2036.461426 0.136501 +2040.318359 0.136449 +2044.175293 0.13475 +2048.032227 0.134343 +2051.88916 0.134235 +2055.746094 0.134563 +2059.603027 0.134534 +2063.459961 0.135336 +2067.316895 0.137324 +2071.173828 0.138357 +2075.030762 0.140503 +2078.887695 0.141893 +2082.744629 0.142863 +2086.601562 0.144135 +2090.458496 0.144251 +2094.31543 0.144278 +2098.172363 0.144239 +2102.029297 0.144004 +2105.88623 0.143478 +2109.743164 0.143511 +2113.600098 0.143151 +2117.457031 0.143559 +2121.313965 0.144096 +2125.170898 0.144133 +2129.027832 0.145068 +2132.884766 0.144984 +2136.741699 0.144745 +2140.598633 0.145628 +2144.455566 0.147823 +2148.3125 0.150011 +2152.169434 0.151872 +2156.026367 0.153301 +2159.883301 0.153103 +2163.740234 0.154012 +2167.597168 0.155013 +2171.454102 0.155685 +2175.311035 0.155886 +2179.167969 0.155053 +2183.024902 0.154117 +2186.881836 0.153234 +2190.73877 0.153008 +2194.595703 0.152778 +2198.452637 0.152969 +2202.30957 0.153286 +2206.166504 0.154937 +2210.023438 0.157569 +2213.880371 0.159214 +2217.737305 0.161321 +2221.594238 0.163009 +2225.451172 0.165156 +2229.308105 0.166447 +2233.165039 0.16597 +2237.021973 0.165728 +2240.878906 0.16592 +2244.73584 0.165315 +2248.592773 0.163689 +2252.449707 0.163399 +2256.306641 0.163338 +2260.163574 0.163126 +2264.020508 0.16376 +2267.877441 0.165369 +2271.734375 0.166799 +2275.591309 0.167143 +2279.448242 0.168417 +2283.305176 0.169971 +2287.162109 0.172706 +2291.019043 0.174338 +2294.875977 0.17392 +2298.73291 0.172741 +2302.589844 0.170809 +2306.446777 0.169791 +2310.303711 0.167444 +2314.160645 0.167382 +2318.017578 0.169346 +2321.874512 0.1687 +2325.731445 0.169079 +2329.588379 0.171429 +2333.445312 0.172005 +2337.302246 0.17173 +2341.15918 0.177313 +2345.016113 0.172166 +2348.873047 0.164887 +2352.72998 0.170921 +2356.586914 0.179951 +2360.443848 0.187692 +2364.300781 0.193336 +2368.157715 0.196336 +2372.014648 0.19635 +2375.871582 0.190763 +2379.728516 0.186245 +2383.585449 0.182521 +2387.442383 0.180239 +2391.299316 0.178919 +2395.15625 0.178212 +2399.013184 0.178546 +2402.870117 0.178607 +2406.727051 0.178765 +2410.583984 0.180182 +2414.440918 0.182686 +2418.297852 0.184782 +2422.154785 0.186519 +2426.011719 0.187862 +2429.868652 0.188519 +2433.725586 0.188641 +2437.58252 0.188783 +2441.439453 0.188943 +2445.296387 0.188549 +2449.15332 0.188368 +2453.010254 0.187423 +2456.867432 0.186584 +2460.724121 0.186132 +2464.581299 0.185374 +2468.437988 0.185088 +2472.294922 0.18578 +2476.1521 0.186438 +2480.008789 0.186875 +2483.865967 0.188714 +2487.7229 0.189906 +2491.579834 0.190912 +2495.436768 0.192349 +2499.293701 0.193208 +2503.150635 0.194736 +2507.007568 0.195032 +2510.864502 0.194682 +2514.721436 0.194575 +2518.578369 0.194022 +2522.435303 0.192652 +2526.292236 0.190689 +2530.14917 0.188958 +2534.006104 0.188007 +2537.863037 0.188064 +2541.719971 0.188482 +2545.576904 0.190521 +2549.433838 0.192907 +2553.290771 0.194646 +2557.147705 0.195373 +2561.004639 0.19598 +2564.861572 0.198918 +2568.718506 0.200591 +2572.575439 0.200731 +2576.432373 0.199931 +2580.289307 0.199108 +2584.14624 0.199044 +2588.003174 0.198248 +2591.860107 0.198056 +2595.717041 0.197357 +2599.573975 0.196511 +2603.430908 0.195941 +2607.287842 0.196022 +2611.144775 0.196668 +2615.001709 0.197505 +2618.858643 0.199575 +2622.715576 0.200912 +2626.57251 0.203322 +2630.429443 0.205753 +2634.286377 0.206707 +2638.143311 0.207317 +2642.000244 0.20686 +2645.857178 0.206699 +2649.714111 0.207118 +2653.571045 0.207081 +2657.427979 0.204599 +2661.284912 0.202973 +2665.141846 0.203807 +2668.998779 0.20409 +2672.855713 0.204505 +2676.712646 0.204402 +2680.56958 0.205393 +2684.426514 0.207695 +2688.283447 0.210657 +2692.140381 0.21329 +2695.997314 0.213214 +2699.854248 0.213629 +2703.711182 0.215489 +2707.568115 0.217552 +2711.425049 0.219984 +2715.281982 0.220446 +2719.138916 0.21845 +2722.99585 0.217402 +2726.852783 0.217728 +2730.709717 0.217692 +2734.56665 0.217954 +2738.423584 0.219007 +2742.280518 0.219831 +2746.137451 0.219937 +2749.994385 0.221145 +2753.851318 0.223599 +2757.708252 0.226448 +2761.565186 0.228654 +2765.422119 0.230751 +2769.279053 0.23316 +2773.135986 0.233946 +2776.99292 0.235595 +2780.849854 0.237077 +2784.706787 0.237037 +2788.563721 0.237783 +2792.420654 0.238303 +2796.277588 0.23844 +2800.134521 0.237748 +2803.991455 0.23761 +2807.848389 0.239399 +2811.705322 0.242356 +2815.562256 0.245029 +2819.419189 0.247127 +2823.276123 0.249953 +2827.133057 0.252941 +2830.98999 0.255616 +2834.846924 0.256416 +2838.703857 0.257745 +2842.560791 0.261174 +2846.417725 0.263504 +2850.274658 0.265136 +2854.131592 0.266484 +2857.988525 0.267884 +2861.845459 0.268755 +2865.702393 0.269319 +2869.559326 0.270306 +2873.41626 0.270931 +2877.273193 0.27218 +2881.130127 0.274424 +2884.987061 0.277215 +2888.843994 0.279752 +2892.700928 0.28225 +2896.557861 0.285606 +2900.414795 0.289405 +2904.271729 0.29194 +2908.128662 0.293517 +2911.985596 0.295321 +2915.842529 0.297343 +2919.699463 0.30078 +2923.556396 0.303916 +2927.41333 0.304841 +2931.270264 0.304886 +2935.127197 0.307534 +2938.984131 0.310065 +2942.841064 0.309946 +2946.697998 0.312969 +2950.554932 0.319969 +2954.411865 0.330884 +2958.268799 0.341583 +2962.125732 0.345956 +2965.982666 0.343104 +2969.8396 0.335753 +2973.696533 0.330953 +2977.553467 0.327567 +2981.4104 0.32633 +2985.267334 0.327893 +2989.124268 0.328081 +2992.981201 0.327513 +2996.838135 0.32761 +3000.695068 0.329393 +3004.552002 0.330277 +3008.408936 0.330659 +3012.265869 0.331638 +3016.122803 0.333973 +3019.979736 0.337387 +3023.83667 0.339392 +3027.693604 0.343113 +3031.550537 0.346716 +3035.407471 0.348999 +3039.264404 0.349565 +3043.121338 0.350472 +3046.978271 0.354745 +3050.835205 0.356839 +3054.692139 0.35844 +3058.549072 0.360373 +3062.406006 0.359955 +3066.262939 0.358908 +3070.119873 0.358617 +3073.976807 0.359479 +3077.83374 0.360783 +3081.690674 0.362895 +3085.547607 0.365378 +3089.404541 0.368972 +3093.261475 0.372506 +3097.118408 0.376024 +3100.975342 0.379468 +3104.832275 0.381968 +3108.689209 0.385588 +3112.546143 0.386591 +3116.403076 0.385214 +3120.26001 0.386689 +3124.116943 0.390244 +3127.973877 0.392708 +3131.830811 0.394077 +3135.687744 0.393566 +3139.544678 0.391412 +3143.401611 0.393047 +3147.258545 0.396304 +3151.115479 0.398407 +3154.972412 0.400344 +3158.829346 0.402014 +3162.686279 0.404263 +3166.543213 0.406683 +3170.400146 0.40869 +3174.25708 0.411274 +3178.114014 0.415657 +3181.970947 0.419736 +3185.827881 0.42175 +3189.684814 0.419426 +3193.541748 0.419143 +3197.398682 0.424583 +3201.255615 0.426743 +3205.112549 0.428647 +3208.969482 0.429678 +3212.826416 0.429757 +3216.68335 0.433223 +3220.540283 0.436215 +3224.397217 0.439306 +3228.25415 0.441374 +3232.111084 0.44311 +3235.968018 0.445396 +3239.824951 0.448125 +3243.681885 0.451367 +3247.538818 0.454258 +3251.395752 0.456481 +3255.252686 0.456045 +3259.109619 0.457979 +3262.966553 0.460119 +3266.823486 0.459373 +3270.68042 0.4599 +3274.537354 0.461298 +3278.394287 0.463606 +3282.251221 0.467458 +3286.108154 0.471413 +3289.965088 0.472572 +3293.822021 0.473989 +3297.678955 0.476511 +3301.535889 0.478557 +3305.392822 0.483234 +3309.249756 0.489315 +3313.106689 0.4922 +3316.963623 0.492279 +3320.820557 0.494391 +3324.67749 0.497505 +3328.534424 0.501519 +3332.391357 0.503834 +3336.248291 0.503075 +3340.105225 0.50296 +3343.962158 0.502158 +3347.819092 0.502881 +3351.676025 0.504862 +3355.532959 0.509708 +3359.389893 0.516957 +3363.246826 0.52107 +3367.10376 0.521195 +3370.960693 0.522663 +3374.817627 0.527924 +3378.674561 0.529786 +3382.531494 0.532712 +3386.388428 0.53422 +3390.245361 0.53586 +3394.102295 0.541357 +3397.959229 0.539042 +3401.816162 0.538392 +3405.673096 0.542694 +3409.530029 0.546009 +3413.386963 0.547949 +3417.243896 0.551694 +3421.10083 0.557508 +3424.957764 0.558706 +3428.814697 0.559973 +3432.671631 0.560578 +3436.528564 0.562476 +3440.385498 0.566948 +3444.242432 0.571401 +3448.099609 0.572987 +3451.956299 0.573218 +3455.813232 0.577121 +3459.67041 0.577896 +3463.5271 0.579122 +3467.384277 0.578371 +3471.241211 0.579208 +3475.098145 0.582138 +3478.955078 0.58127 +3482.812012 0.586469 +3486.668945 0.589135 +3490.525879 0.591052 +3494.382812 0.593125 +3498.239746 0.59621 +3502.09668 0.603276 +3505.953613 0.606524 +3509.810547 0.607297 +3513.66748 0.601191 +3517.524414 0.603099 +3521.381348 0.615545 +3525.238281 0.624269 +3529.095215 0.622593 +3532.952148 0.614592 +3536.809082 0.609326 +3540.666016 0.609761 +3544.522949 0.6258 +3548.379883 0.629168 +3552.236816 0.623019 +3556.09375 0.618341 +3559.950684 0.619473 +3563.807617 0.663041 +3567.664551 0.680265 +3571.521484 0.653292 +3575.378418 0.637676 +3579.235352 0.627736 +3583.092285 0.647582 +3586.949219 0.679846 +3590.806152 0.673906 +3594.663086 0.666062 +3598.52002 0.659118 +3602.376953 0.642123 +3606.233887 0.662345 +3610.09082 0.686657 +3613.947754 0.699009 +3617.804688 0.708261 +3621.661621 0.677506 +3625.518555 0.718444 +3629.375488 0.775054 +3633.232422 0.721214 +3637.089355 0.668287 +3640.946289 0.635247 +3644.803223 0.693072 +3648.660156 0.801296 +3652.51709 0.782912 +3656.374023 0.733296 +3660.230957 0.668873 +3664.087891 0.63726 +3667.944824 0.688064 +3671.801758 0.787399 +3675.658691 0.837877 +3679.515625 0.748979 +3683.372559 0.700056 +3687.229492 0.776031 +3691.086426 0.78917 +3694.943359 0.730333 +3698.800293 0.715288 +3702.657227 0.705007 +3706.51416 0.722261 +3710.371094 0.787614 +3714.228027 0.76146 +3718.084961 0.711827 +3721.941895 0.71987 +3725.798828 0.698932 +3729.655762 0.71304 +3733.512695 0.784518 +3737.369629 0.77511 +3741.226562 0.775089 +3745.083496 0.865942 +3748.94043 0.962277 +3752.797363 0.942017 +3756.654297 0.869403 +3760.51123 0.822932 +3764.368164 0.805583 +3768.225098 0.818461 +3772.082031 0.794773 +3775.938965 0.773548 +3779.795898 0.787632 +3783.652832 0.773566 +3787.509766 0.742363 +3791.366699 0.706796 +3795.223633 0.713586 +3799.080566 0.779534 +3802.9375 0.843259 +3806.794434 0.824484 +3810.651367 0.753229 +3814.508301 0.766034 +3818.365234 0.846253 +3822.222168 0.86147 +3826.079102 0.80157 +3829.936035 0.755 +3833.792969 0.791943 +3837.649902 0.869714 +3841.506836 0.868459 +3845.36377 0.758025 +3849.220703 0.758536 +3853.077637 0.911496 \ No newline at end of file diff --git a/kPolyethylene.txt b/kPolyethylene.txt new file mode 100644 index 0000000..91a6297 --- /dev/null +++ b/kPolyethylene.txt @@ -0,0 +1,768 @@ +nu k +898.665771 0.042801 +902.522705 0.038246 +906.379639 0.040294 +910.236572 0.039488 +914.093506 0.037618 +917.950439 0.03536 +921.807373 0.03278 +925.664307 0.03156 +929.52124 0.028804 +933.378174 0.032099 +937.235107 0.031952 +941.092041 0.033633 +944.948975 0.036991 +948.805908 0.040887 +952.662842 0.044517 +956.519775 0.043966 +960.376709 0.044863 +964.233643 0.044314 +968.090576 0.045241 +971.94751 0.043188 +975.804443 0.039329 +979.661377 0.034324 +983.518311 0.027772 +987.375244 0.024005 +991.232178 0.018819 +995.089111 0.017644 +998.946045 0.01743 +1002.802979 0.01892 +1006.659912 0.022698 +1010.516846 0.025522 +1014.373779 0.027914 +1018.230713 0.028447 +1022.087646 0.030539 +1025.94458 0.030134 +1029.801514 0.030709 +1033.658447 0.030649 +1037.515381 0.027764 +1041.372314 0.024089 +1045.229248 0.017639 +1049.086182 0.013155 +1052.943115 0.007972 +1056.800049 0.004678 +1060.656982 0.002414 +1064.513916 0.000656 +1068.37085 0.000452 +1072.227783 0.000186 +1076.084717 0.00315 +1079.94165 0.005205 +1083.798584 0.009191 +1087.655518 0.012551 +1091.512451 0.013487 +1095.369385 0.01366 +1099.226318 0.012324 +1103.083252 0.011624 +1106.940186 0.009228 +1110.797119 0.007841 +1114.654053 0.005534 +1118.510986 0.003409 +1122.36792 0.001855 +1126.224854 0 +1130.081787 0.000719 +1133.938721 0.001989 +1137.795654 0.005403 +1141.652588 0.008195 +1145.509521 0.012699 +1149.366455 0.01768 +1153.223389 0.021147 +1157.080322 0.025829 +1160.937256 0.029061 +1164.794189 0.032397 +1168.651123 0.034385 +1172.508057 0.036836 +1176.36499 0.03735 +1180.221924 0.035023 +1184.078857 0.033782 +1187.935791 0.032161 +1191.792725 0.032158 +1195.649658 0.031863 +1199.506592 0.033038 +1203.363525 0.035069 +1207.220459 0.037485 +1211.077393 0.041366 +1214.934326 0.045119 +1218.79126 0.04902 +1222.648193 0.050622 +1226.505249 0.053244 +1230.362061 0.054526 +1234.219116 0.054043 +1238.07605 0.053686 +1241.932861 0.051393 +1245.789917 0.049385 +1249.646851 0.045921 +1253.503784 0.043153 +1257.360718 0.041048 +1261.217651 0.039754 +1265.074585 0.038579 +1268.931519 0.037209 +1272.788452 0.037321 +1276.645386 0.036889 +1280.502319 0.038267 +1284.359253 0.039353 +1288.216187 0.040998 +1292.07312 0.042425 +1295.930054 0.04231 +1299.786987 0.042156 +1303.643921 0.04027 +1307.500854 0.038994 +1311.357788 0.035638 +1315.214722 0.031839 +1319.071655 0.027074 +1322.928589 0.022097 +1326.785522 0.019314 +1330.642456 0.016466 +1334.49939 0.01724 +1338.356323 0.019304 +1342.213257 0.020191 +1346.07019 0.020463 +1349.927124 0.022886 +1353.784058 0.024824 +1357.640991 0.026467 +1361.497925 0.032192 +1365.354858 0.03319 +1369.211792 0.032069 +1373.068726 0.029896 +1376.925659 0.025182 +1380.782593 0.020386 +1384.639526 0.01788 +1388.49646 0.017692 +1392.353394 0.01595 +1396.210327 0.018172 +1400.067261 0.017101 +1403.924194 0.01655 +1407.781128 0.018251 +1411.638062 0.019087 +1415.494995 0.025939 +1419.351929 0.030871 +1423.208862 0.033849 +1427.065796 0.035628 +1430.922729 0.0422 +1434.779663 0.051804 +1438.636597 0.054932 +1442.49353 0.058626 +1446.350464 0.063101 +1450.207397 0.074238 +1454.064331 0.099416 +1457.921265 0.209105 +1461.778198 0.321291 +1465.635132 0.28369 +1469.492065 0.267381 +1473.348999 0.253731 +1477.205933 0.128331 +1481.062866 0.06213 +1484.9198 0.05394 +1488.776733 0.057298 +1492.633667 0.056345 +1496.490601 0.05445 +1500.347534 0.054085 +1504.204468 0.058144 +1508.061401 0.064828 +1511.918335 0.055856 +1515.775269 0.052929 +1519.632202 0.059563 +1523.489136 0.05584 +1527.346069 0.048296 +1531.203003 0.043625 +1535.059937 0.046385 +1538.91687 0.056596 +1542.773804 0.054466 +1546.630737 0.043963 +1550.487671 0.041193 +1554.344604 0.048176 +1558.201538 0.058085 +1562.058472 0.049177 +1565.915405 0.041398 +1569.772339 0.042723 +1573.629272 0.042759 +1577.486206 0.040069 +1581.34314 0.034118 +1585.200073 0.031186 +1589.057007 0.031601 +1592.91394 0.030593 +1596.770874 0.030831 +1600.627808 0.028967 +1604.484741 0.02833 +1608.341675 0.028289 +1612.198608 0.028776 +1616.055542 0.033643 +1619.912476 0.034205 +1623.769409 0.035702 +1627.626343 0.033927 +1631.483276 0.034108 +1635.34021 0.042011 +1639.197144 0.038127 +1643.054077 0.036647 +1646.911011 0.04247 +1650.767944 0.048308 +1654.624878 0.045178 +1658.481812 0.034997 +1662.338745 0.034021 +1666.195679 0.036197 +1670.052612 0.038175 +1673.909546 0.039106 +1677.766479 0.037529 +1681.623413 0.045005 +1685.480347 0.05006 +1689.33728 0.044082 +1693.194214 0.045592 +1697.051147 0.057514 +1700.908081 0.061893 +1704.765015 0.056482 +1708.621948 0.051541 +1712.478882 0.053415 +1716.335815 0.061049 +1720.192749 0.056453 +1724.049683 0.049607 +1727.906738 0.05118 +1731.76355 0.05872 +1735.620605 0.061749 +1739.477539 0.058433 +1743.334473 0.058925 +1747.191406 0.06168 +1751.04834 0.061892 +1754.905273 0.058246 +1758.762207 0.058189 +1762.619141 0.059579 +1766.476074 0.060041 +1770.333008 0.066851 +1774.189941 0.066629 +1778.046875 0.063365 +1781.903809 0.063274 +1785.760742 0.061577 +1789.617676 0.063319 +1793.474609 0.063621 +1797.331543 0.061639 +1801.188477 0.060149 +1805.04541 0.057813 +1808.902344 0.056311 +1812.759277 0.054928 +1816.616211 0.053613 +1820.473145 0.053938 +1824.330078 0.057278 +1828.187012 0.060054 +1832.043945 0.058871 +1835.900879 0.056005 +1839.757812 0.056531 +1843.614746 0.059206 +1847.47168 0.057401 +1851.328613 0.054448 +1855.185547 0.053538 +1859.04248 0.051986 +1862.899414 0.050818 +1866.756348 0.053157 +1870.613281 0.051802 +1874.470215 0.04774 +1878.327148 0.047584 +1882.184082 0.047928 +1886.041016 0.05107 +1889.897949 0.055251 +1893.754883 0.056678 +1897.611816 0.056701 +1901.46875 0.056308 +1905.325684 0.057764 +1909.182617 0.058333 +1913.039551 0.058837 +1916.896484 0.061175 +1920.753418 0.061958 +1924.610352 0.06037 +1928.467285 0.058767 +1932.324219 0.058077 +1936.181152 0.05759 +1940.038086 0.058999 +1943.89502 0.060248 +1947.751953 0.060227 +1951.608887 0.06155 +1955.46582 0.064083 +1959.322754 0.066146 +1963.179688 0.068457 +1967.036621 0.070872 +1970.893555 0.07175 +1974.750488 0.073 +1978.607422 0.074496 +1982.464355 0.076088 +1986.321289 0.077477 +1990.178223 0.077673 +1994.035156 0.078181 +1997.89209 0.077858 +2001.749023 0.077439 +2005.605957 0.077198 +2009.462891 0.078891 +2013.319824 0.082924 +2017.176758 0.085872 +2021.033691 0.087082 +2024.890625 0.087384 +2028.747559 0.08829 +2032.604492 0.08848 +2036.461426 0.088407 +2040.318359 0.089069 +2044.175293 0.089026 +2048.032227 0.088623 +2051.88916 0.087477 +2055.746094 0.08616 +2059.603027 0.083997 +2063.459961 0.081664 +2067.316895 0.079261 +2071.173828 0.077244 +2075.030762 0.076483 +2078.887695 0.075797 +2082.744629 0.075846 +2086.601562 0.075997 +2090.458496 0.076488 +2094.31543 0.076722 +2098.172363 0.077003 +2102.029297 0.077852 +2105.88623 0.077923 +2109.743164 0.078499 +2113.600098 0.0785 +2117.457031 0.078399 +2121.313965 0.077331 +2125.170898 0.075105 +2129.027832 0.073147 +2132.884766 0.070562 +2136.741699 0.068282 +2140.598633 0.067026 +2144.455566 0.066793 +2148.3125 0.06594 +2152.169434 0.065716 +2156.026367 0.067029 +2159.883301 0.069187 +2163.740234 0.072229 +2167.597168 0.073334 +2171.454102 0.07447 +2175.311035 0.076316 +2179.167969 0.077651 +2183.024902 0.077775 +2186.881836 0.076711 +2190.73877 0.07568 +2194.595703 0.074338 +2198.452637 0.073547 +2202.30957 0.072207 +2206.166504 0.070938 +2210.023438 0.071166 +2213.880371 0.072989 +2217.737305 0.075587 +2221.594238 0.077353 +2225.451172 0.079876 +2229.308105 0.082352 +2233.165039 0.086501 +2237.021973 0.091213 +2240.878906 0.093793 +2244.73584 0.096032 +2248.592773 0.096721 +2252.449707 0.096175 +2256.306641 0.096046 +2260.163574 0.095994 +2264.020508 0.095129 +2267.877441 0.094074 +2271.734375 0.093223 +2275.591309 0.092793 +2279.448242 0.09338 +2283.305176 0.094035 +2287.162109 0.096031 +2291.019043 0.098612 +2294.875977 0.101782 +2298.73291 0.104571 +2302.589844 0.106189 +2306.446777 0.108411 +2310.303711 0.111481 +2314.160645 0.115452 +2318.017578 0.1163 +2321.874512 0.116496 +2325.731445 0.117256 +2329.588379 0.117223 +2333.445312 0.118796 +2337.302246 0.118167 +2341.15918 0.120538 +2345.016113 0.115249 +2348.873047 0.105582 +2352.72998 0.106231 +2356.586914 0.117235 +2360.443848 0.125922 +2364.300781 0.125306 +2368.157715 0.127072 +2372.014648 0.127012 +2375.871582 0.116702 +2379.728516 0.10674 +2383.585449 0.101542 +2387.442383 0.098892 +2391.299316 0.096576 +2395.15625 0.094014 +2399.013184 0.091325 +2402.870117 0.088611 +2406.727051 0.085887 +2410.583984 0.084275 +2414.440918 0.083137 +2418.297852 0.082863 +2422.154785 0.083674 +2426.011719 0.083869 +2429.868652 0.084283 +2433.725586 0.085037 +2437.58252 0.086494 +2441.439453 0.087925 +2445.296387 0.08872 +2449.15332 0.088704 +2453.010254 0.088184 +2456.867432 0.088997 +2460.724121 0.088295 +2464.581299 0.086279 +2468.437988 0.084932 +2472.294922 0.083665 +2476.1521 0.0818 +2480.008789 0.080394 +2483.865967 0.080496 +2487.7229 0.080721 +2491.579834 0.082332 +2495.436768 0.084785 +2499.293701 0.087751 +2503.150635 0.090758 +2507.007568 0.092693 +2510.864502 0.095352 +2514.721436 0.098152 +2518.578369 0.100501 +2522.435303 0.101241 +2526.292236 0.100269 +2530.14917 0.097869 +2534.006104 0.095432 +2537.863037 0.093501 +2541.719971 0.092148 +2545.576904 0.093745 +2549.433838 0.095068 +2553.290771 0.095236 +2557.147705 0.095116 +2561.004639 0.095723 +2564.861572 0.098358 +2568.718506 0.100349 +2572.575439 0.102338 +2576.432373 0.104696 +2580.289307 0.107025 +2584.14624 0.108889 +2588.003174 0.110354 +2591.860107 0.110847 +2595.717041 0.110923 +2599.573975 0.110253 +2603.430908 0.10792 +2607.287842 0.108422 +2611.144775 0.110512 +2615.001709 0.112134 +2618.858643 0.111506 +2622.715576 0.111099 +2626.57251 0.11527 +2630.429443 0.118538 +2634.286377 0.121323 +2638.143311 0.122503 +2642.000244 0.121947 +2645.857178 0.122436 +2649.714111 0.122898 +2653.571045 0.123706 +2657.427979 0.12365 +2661.284912 0.123909 +2665.141846 0.12298 +2668.998779 0.121291 +2672.855713 0.118508 +2676.712646 0.113969 +2680.56958 0.112845 +2684.426514 0.11388 +2688.283447 0.115424 +2692.140381 0.115946 +2695.997314 0.116087 +2699.854248 0.11892 +2703.711182 0.123892 +2707.568115 0.127081 +2711.425049 0.127712 +2715.281982 0.129201 +2719.138916 0.130355 +2722.99585 0.132832 +2726.852783 0.136051 +2730.709717 0.137992 +2734.56665 0.139079 +2738.423584 0.139874 +2742.280518 0.142823 +2746.137451 0.14439 +2749.994385 0.144809 +2753.851318 0.146405 +2757.708252 0.149177 +2761.565186 0.152907 +2765.422119 0.156536 +2769.279053 0.160128 +2773.135986 0.163716 +2776.99292 0.170169 +2780.849854 0.176736 +2784.706787 0.182123 +2788.563721 0.18825 +2792.420654 0.195435 +2796.277588 0.203335 +2800.134521 0.209338 +2803.991455 0.216905 +2807.848389 0.224688 +2811.705322 0.231271 +2815.562256 0.240789 +2819.419189 0.252931 +2823.276123 0.268691 +2827.133057 0.288805 +2830.98999 0.319675 +2834.846924 0.37317 +2838.703857 0.490491 +2842.560791 0.752726 +2846.417725 1.278588 +2850.274658 3.547169 +2854.131592 1.864663 +2857.988525 1.020072 +2861.845459 0.678025 +2865.702393 0.520933 +2869.559326 0.455058 +2873.41626 0.442317 +2877.273193 0.468809 +2881.130127 0.52601 +2884.987061 0.601824 +2888.843994 0.6806 +2892.700928 0.756426 +2896.557861 0.831596 +2900.414795 0.907269 +2904.271729 1.0234 +2908.128662 1.20281 +2911.985596 1.481329 +2915.842529 2.010163 +2919.699463 8.159303 +2923.556396 8.159303 +2927.41333 8.159303 +2931.270264 8.159303 +2935.127197 1.344721 +2938.984131 0.846779 +2942.841064 0.599405 +2946.697998 0.462005 +2950.554932 0.384985 +2954.411865 0.339581 +2958.268799 0.311217 +2962.125732 0.293415 +2965.982666 0.280584 +2969.8396 0.266669 +2973.696533 0.25436 +2977.553467 0.24508 +2981.4104 0.238963 +2985.267334 0.23609 +2989.124268 0.234872 +2992.981201 0.233873 +2996.838135 0.232613 +3000.695068 0.233535 +3004.552002 0.233868 +3008.408936 0.232737 +3012.265869 0.233329 +3016.122803 0.234665 +3019.979736 0.235345 +3023.83667 0.236011 +3027.693604 0.236947 +3031.550537 0.238511 +3035.407471 0.241039 +3039.264404 0.240936 +3043.121338 0.239143 +3046.978271 0.238718 +3050.835205 0.24097 +3054.692139 0.245612 +3058.549072 0.247351 +3062.406006 0.247046 +3066.262939 0.248492 +3070.119873 0.251256 +3073.976807 0.25365 +3077.83374 0.253988 +3081.690674 0.252814 +3085.547607 0.253247 +3089.404541 0.256518 +3093.261475 0.257485 +3097.118408 0.256107 +3100.975342 0.258556 +3104.832275 0.261868 +3108.689209 0.262195 +3112.546143 0.26374 +3116.403076 0.264531 +3120.26001 0.266315 +3124.116943 0.271453 +3127.973877 0.272884 +3131.830811 0.273801 +3135.687744 0.274658 +3139.544678 0.27568 +3143.401611 0.278555 +3147.258545 0.278531 +3151.115479 0.280644 +3154.972412 0.282855 +3158.829346 0.282387 +3162.686279 0.283106 +3166.543213 0.285258 +3170.400146 0.287859 +3174.25708 0.2904 +3178.114014 0.294073 +3181.970947 0.292664 +3185.827881 0.291102 +3189.684814 0.295654 +3193.541748 0.300153 +3197.398682 0.304076 +3201.255615 0.304851 +3205.112549 0.304563 +3208.969482 0.305357 +3212.826416 0.306796 +3216.68335 0.310194 +3220.540283 0.31221 +3224.397217 0.313876 +3228.25415 0.314126 +3232.111084 0.313369 +3235.968018 0.315882 +3239.824951 0.317707 +3243.681885 0.31754 +3247.538818 0.319288 +3251.395752 0.321948 +3255.252686 0.324138 +3259.109619 0.326708 +3262.966553 0.32804 +3266.823486 0.3278 +3270.68042 0.329835 +3274.537354 0.33465 +3278.394287 0.337762 +3282.251221 0.340154 +3286.108154 0.342881 +3289.965088 0.345075 +3293.822021 0.347906 +3297.678955 0.350114 +3301.535889 0.351199 +3305.392822 0.351983 +3309.249756 0.3562 +3313.106689 0.36275 +3316.963623 0.366295 +3320.820557 0.36812 +3324.67749 0.370943 +3328.534424 0.373606 +3332.391357 0.374156 +3336.248291 0.377316 +3340.105225 0.381299 +3343.962158 0.382803 +3347.819092 0.384863 +3351.676025 0.387344 +3355.532959 0.391755 +3359.389893 0.396881 +3363.246826 0.401809 +3367.10376 0.40365 +3370.960693 0.405394 +3374.817627 0.408003 +3378.674561 0.406788 +3382.531494 0.410868 +3386.388428 0.416363 +3390.245361 0.418181 +3394.102295 0.418514 +3397.959229 0.420373 +3401.816162 0.425953 +3405.673096 0.427757 +3409.530029 0.430295 +3413.386963 0.432285 +3417.243896 0.4355 +3421.10083 0.440059 +3424.957764 0.438144 +3428.814697 0.438745 +3432.671631 0.440176 +3436.528564 0.441479 +3440.385498 0.446113 +3444.242432 0.454693 +3448.099609 0.458408 +3451.956299 0.453192 +3455.813232 0.453524 +3459.67041 0.454045 +3463.5271 0.453562 +3467.384277 0.454329 +3471.241211 0.453832 +3475.098145 0.455571 +3478.955078 0.458273 +3482.812012 0.463572 +3486.668945 0.467153 +3490.525879 0.468294 +3494.382812 0.467316 +3498.239746 0.46946 +3502.09668 0.476743 +3505.953613 0.480509 +3509.810547 0.481056 +3513.66748 0.477007 +3517.524414 0.476513 +3521.381348 0.48312 +3525.238281 0.494273 +3529.095215 0.498595 +3532.952148 0.489976 +3536.809082 0.483772 +3540.666016 0.483548 +3544.522949 0.497348 +3548.379883 0.507212 +3552.236816 0.503781 +3556.09375 0.497842 +3559.950684 0.492978 +3563.807617 0.529133 +3567.664551 0.56289 +3571.521484 0.538575 +3575.378418 0.509557 +3579.235352 0.488392 +3583.092285 0.49707 +3586.949219 0.539608 +3590.806152 0.551493 +3594.663086 0.545023 +3598.52002 0.545352 +3602.376953 0.531468 +3606.233887 0.545 +3610.09082 0.574529 +3613.947754 0.583345 +3617.804688 0.601032 +3621.661621 0.576763 +3625.518555 0.59285 +3629.375488 0.666404 +3633.232422 0.629983 +3637.089355 0.574148 +3640.946289 0.534971 +3644.803223 0.56094 +3648.660156 0.676182 +3652.51709 0.677093 +3656.374023 0.626823 +3660.230957 0.571434 +3664.087891 0.525168 +3667.944824 0.557497 +3671.801758 0.650441 +3675.658691 0.720812 +3679.515625 0.656422 +3683.372559 0.584071 +3687.229492 0.639159 +3691.086426 0.689051 +3694.943359 0.635556 +3698.800293 0.611035 +3702.657227 0.600736 +3706.51416 0.59881 +3710.371094 0.659889 +3714.228027 0.659443 +3718.084961 0.602004 +3721.941895 0.604124 +3725.798828 0.590578 +3729.655762 0.583357 +3733.512695 0.655091 +3737.369629 0.667907 +3741.226562 0.649775 +3745.083496 0.722164 +3748.94043 0.828452 +3752.797363 0.834798 +3756.654297 0.7622 +3760.51123 0.704227 +3764.368164 0.680495 +3768.225098 0.692232 +3772.082031 0.675462 +3775.938965 0.640782 +3779.795898 0.651172 +3783.652832 0.648195 +3787.509766 0.620286 +3791.366699 0.587595 +3795.223633 0.584694 +3799.080566 0.646239 +3802.9375 0.710322 +3806.794434 0.709429 +3810.651367 0.642264 +3814.508301 0.626551 +3818.365234 0.709295 +3822.222168 0.752153 +3826.079102 0.703719 +3829.936035 0.641066 +3833.792969 0.653867 +3837.649902 0.732171 +3841.506836 0.760431 +3845.36377 0.661533 +3849.220703 0.611614 +3853.077637 0.757909 \ No newline at end of file diff --git a/main.cpp b/main.cpp index 8c12d47..0fc62a0 100644 --- a/main.cpp +++ b/main.cpp @@ -8,15 +8,19 @@ using namespace std; #include #include #include "qtSpectrumDisplay.h" +//#include "qwtSpectrumDisplay.h" #include "globals.h" #include "rtsGUIConsole.h" #include "PerformanceData.h" #include +#include //#include + PerformanceData PD; qtSpectrumDisplay* gpSpectrumDisplay; +//qwtSpectrumDisplay* SpectrumDisplay; QGraphicsScene* distortionScene = NULL; QGraphicsView* distortionWindow = NULL; @@ -43,6 +47,9 @@ double dNu = 2; double aMin = 0; double aMax = 1; +double nMag = 1.0; +double kMax = 1.0; + double scaleI0 = 1.0; double refSlope = 0.0; @@ -67,7 +74,7 @@ double cA = 1.0; //vector NMaterial; bool applyMaterial = true; vector MaterialList; -int currentMaterial = 0; +int currentMaterial = -1; //optical parameters double cNAi = 0.0; @@ -91,93 +98,106 @@ void TempSimSpectrum() temp.A = sin((double)i/200); SimSpectrum.push_back(temp); } -} + } -void UpdateDisplay(){ + void UpdateDisplay() { gpSpectrumDisplay->updateGL(); + //SpectrumDisplay->replot(); } -void LoadMaterial(string fileNameK, string fileNameN, string materialName) +void LoadMaterial(string fileName, string materialName) { - Material newMaterial; - newMaterial.name = materialName; - - vector KMaterial = LoadSpectrum(fileNameK.c_str()); - vector NMaterial = LoadSpectrum(fileNameN.c_str()); - - //make sure that the sizes are the same - if(KMaterial.size() != NMaterial.size()){ - cout<<"Error, material properties don't match."< eta; - //int j; - for(unsigned int i=0; i(NMaterial[i].A, KMaterial[i].A); - newMaterial.eta.push_back(eta); + Material newMaterial; + newMaterial.validN = false; + newMaterial.validK = false; + //read the header + string units; + getline(inFile, units, '\t'); + char c = 0; + while(c != '\n') + { + inFile.get(c); + if(c == 'n') newMaterial.validN = true; + if(c == 'k') newMaterial.validK = true; } - MaterialList.push_back(newMaterial); -} - -void LoadMaterial(string fileNameK, string materialName){ - //load the material absorbance - vector KMaterial = LoadSpectrum(fileNameK.c_str()); - vector NMaterial; - //KMaterial = LoadSpectrum("eta_TolueneK.txt"); + //read the entire refractive index (both real and imaginary) + float nu; + float n; + float k; - //compute the real IR using Kramers Kronig - //copy the absorbance values into a linear array - double* k = (double*)malloc(sizeof(double) * KMaterial.size()); - double* n = (double*)malloc(sizeof(double) * KMaterial.size()); - for(unsigned int i=0; i>nu) + { + n = 1.0; + k = 0.0; + if(newMaterial.validN) + inFile>>n; + if(newMaterial.validK) + inFile>>k; + //ignore the rest of the line + inFile.ignore(); + + newMaterial.nu.push_back(nu); + newMaterial.eta.push_back(complex(n, k)); + } - //use Kramers Kronig to determine the real part of the index of refraction - cudaKramersKronig(n, k, KMaterial.size(), KMaterial[0].nu, KMaterial.back().nu, baseIR); - SpecPair temp; - for(unsigned int i=0; i maxN) maxN = n; + if(k > maxK) maxK = k; + sumN += n; } + float meanN = sumN / newMaterial.nu.size(); - //create the material - Material newMaterial; + nMag = max(maxN - meanN, meanN - minN); + kMax = maxK; + baseIR = meanN; + + //set the name of the material object newMaterial.name = materialName; - complex eta; - for(unsigned int i=0; i(NMaterial[i].A, KMaterial[i].A); - newMaterial.eta.push_back(eta); - } + //add it to the material list MaterialList.push_back(newMaterial); + currentMaterial = MaterialList.size() - 1; } void LoadSource(string fileNameSource) { - SourceSpectrum = LoadSpectrum(fileNameSource); + SourceSpectrum = LoadSpectrum(fileNameSource); } void ResampleSource() { //clear the current resampled spectrum SourceResampled.clear(); - + //get the number of source and material samples int nMatSamples = EtaK.size(); int nSourceSamples = SourceSpectrum.size(); - + float nu, I; for(int i=0; i= nuMin && nu <= nuMax){ + if(nu >= nuMin && nu <= nuMax) { temp.nu = nu; temp.A = k[i]; EtaK.push_back(temp); @@ -309,6 +329,7 @@ void SetMaterial() { EtaK.clear(); EtaN.clear(); + if(currentMaterial == -1) return; int nSamples = MaterialList[currentMaterial].eta.size(); double nu; @@ -317,7 +338,7 @@ void SetMaterial() //initialize the current nuMin and nuMax values nuMin = MaterialList[currentMaterial].nu[0]; nuMax = nuMin; - for(int i=0; i= nuMin && nu <= nuMax){ @@ -325,14 +346,14 @@ void SetMaterial() if(nu < nuMin) nuMin = nu; if(nu > nuMax) nuMax = nu; - temp.nu = nu; - temp.A = MaterialList[currentMaterial].eta[i].imag(); - EtaK.push_back(temp); - temp.A = MaterialList[currentMaterial].eta[i].real(); - EtaN.push_back(temp); + temp.nu = nu; + temp.A = MaterialList[currentMaterial].eta[i].imag(); + EtaK.push_back(temp); + temp.A = MaterialList[currentMaterial].eta[i].real(); + EtaN.push_back(temp); } cA = 1.0; - + //resample the source spectrum if(SourceSpectrum.size() != 0) ResampleSource(); @@ -348,22 +369,33 @@ int main(int argc, char *argv[]) //load the default project file (any previous optical settings) LoadState(); + //load the default materials - LoadMaterial("eta_TolueneK.txt", "eta_TolueneN.txt", "Toluene"); + LoadMaterial("etaToluene.txt", "Toluene"); LoadMaterial("kPMMA.txt", "PMMA"); - LoadMaterial("eta_polystyreneK.txt", "Polystyrene"); + LoadMaterial("kPolyethylene.txt", "Polyethylene"); + LoadMaterial("kPTFE.txt", "Teflon"); + + + //LoadMaterial("eta_TolueneK.txt", "eta_TolueneN.txt", "Toluene"); + //LoadMaterial("kPMMA.txt", "PMMA"); + //LoadMaterial("eta_polystyreneK.txt", "Polystyrene"); //LoadMaterial("../../../../data/materials/rtsSU8_k.txt", "../../../../data/materials/rtsSU8_n.txt", "SU8"); SetMaterial(); - + + //load a mid-infrared source LoadSource("source_midIR.txt"); + ResampleSource(); //compute the analytical solution for the Mie scattered spectrum SimulateSpectrum(); QApplication a(argc, argv); - + + //SpectrumDisplay = new qwtSpectrumDisplay(); + InteractiveMie w; w.show() ; w.move(0, 0); @@ -385,6 +417,8 @@ int main(int argc, char *argv[]) gpSpectrumDisplay->move(uiFrame.width(), 0); gpSpectrumDisplay->show(); + + //distortion dialog box distortionDialog = new qtDistortionDialog(); distortionDialog->move(0, 0); diff --git a/qtDistortionDialog.cpp b/qtDistortionDialog.cpp index 0f6a0aa..0e329b1 100644 --- a/qtDistortionDialog.cpp +++ b/qtDistortionDialog.cpp @@ -1,12 +1,12 @@ -#include "qtDistortionDialog.h" - -qtDistortionDialog::qtDistortionDialog(QWidget *parent, Qt::WFlags flags) - : QDialog(parent, flags) -{ - ui.setupUi(this); -} - -qtDistortionDialog::~qtDistortionDialog() -{ - updating = false; +#include "qtDistortionDialog.h" + +qtDistortionDialog::qtDistortionDialog(QWidget *parent, Qt::WFlags flags) + : QDialog(parent, flags) +{ + ui.setupUi(this); +} + +qtDistortionDialog::~qtDistortionDialog() +{ + updating = false; } diff --git a/qtDistortionDialog.h b/qtDistortionDialog.h index 7d25207..ffce613 100644 --- a/qtDistortionDialog.h +++ b/qtDistortionDialog.h @@ -17,18 +17,18 @@ extern QGraphicsPixmapItem* pixmapItem; class qtDistortionDialog : public QDialog { - Q_OBJECT + Q_OBJECT public: - qtDistortionDialog(QWidget *parent = 0, Qt::WFlags flags = 0); - ~qtDistortionDialog(); - bool updating; + qtDistortionDialog(QWidget *parent = 0, Qt::WFlags flags = 0); + ~qtDistortionDialog(); + bool updating; private: - Ui::DistortionDialogClass ui; + Ui::DistortionDialogClass ui; public slots: - void on_btnComputeDistortionMap_clicked(){ + void on_btnComputeDistortionMap_clicked() { int steps = 100; @@ -49,7 +49,7 @@ public slots: //compute the extrema float minDistortion = 99999; float maxDistortion = distortionMap[0]; - for(int i=1; i 0) minDistortion = distortionMap[i]; if(distortionMap[i] > maxDistortion) @@ -62,11 +62,14 @@ public slots: float intensity; float v; for(i=0; i -#include -#include - -#include - -#include "qtSpectrumDisplay.h" - -qtSpectrumDisplay::qtSpectrumDisplay(QWidget *parent) - : QGLWidget(parent) -{ - object = 0; - xRot = 0; - yRot = 0; - zRot = 0; - - qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0); - qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0); -} - -qtSpectrumDisplay::~qtSpectrumDisplay() -{ - makeCurrent(); - glDeleteLists(object, 1); -} - -QSize qtSpectrumDisplay::minimumSizeHint() const -{ - return QSize(50, 50); -} - -QSize qtSpectrumDisplay::sizeHint() const -{ - return QSize(400, 400); -} - -void qtSpectrumDisplay::initializeGL() -{ - qglClearColor(qtPurple.dark()); - //object = makeObject(); - glShadeModel(GL_FLAT); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); -} - -void qtSpectrumDisplay::printWavenumber(int xPos) -{ - int viewParams[4]; - glGetIntegerv(GL_VIEWPORT, viewParams); - - float a = (float)xPos/(float)viewParams[2]; - - int wn = a * (nuMax - nuMin) + nuMin; - cout< +#include +#include + +#include + +#include "qtSpectrumDisplay.h" + +int axisMargins = 50; + +qtSpectrumDisplay::qtSpectrumDisplay(QWidget *parent) + : QGLWidget(parent) +{ + object = 0; + xRot = 0; + yRot = 0; + zRot = 0; + + qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0); + qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0); +} + +qtSpectrumDisplay::~qtSpectrumDisplay() +{ + makeCurrent(); + glDeleteLists(object, 1); +} + +QSize qtSpectrumDisplay::minimumSizeHint() const { - //prepare the projection (orthographic, bounded by spectral values) - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluOrtho2D(nuMin, nuMax, aMin, aMax); - glMatrixMode(GL_MODELVIEW); + return QSize(50, 50); +} + +QSize qtSpectrumDisplay::sizeHint() const +{ + return QSize(400, 400); +} + +void qtSpectrumDisplay::initializeGL() +{ + //qglClearColor(qtPurple.dark()); + glClearColor(0.0, 0.0, 0.0, 0.0); + //object = makeObject(); + glShadeModel(GL_FLAT); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); +} + +void qtSpectrumDisplay::printWavenumber(int xPos) +{ + int viewParams[4]; + glGetIntegerv(GL_VIEWPORT, viewParams); + + float a = (float)xPos/(float)viewParams[2]; + + int wn = a * (nuMax - nuMin) + nuMin; + cout< 0) + { + glColor3f(0.5, 0.5, 0.5); + glBegin(GL_LINE_STRIP); + float nu; + for(unsigned int i=0; i 0) - { - glColor3f(0.5, 0.5, 0.5); - glBegin(GL_LINE_STRIP); - float nu; - for(unsigned int i=0; i maxN) - maxN = thisN; - thisK = fabs(MaterialList[currentMaterial].eta[i].imag()); - if(thisK > maxK) - thisK = maxK; + glColor3f(1.0, 1.0, 0.0); + glBegin(GL_LINE_STRIP); + for(unsigned int i=0; ipos(); - - if(event->buttons() & Qt::LeftButton) - { - int wn = 0; - printWavenumber(event->x()); - } -} - -void qtSpectrumDisplay::mouseMoveEvent(QMouseEvent *event) -{ - int dx = event->x() - lastPos.x(); - int dy = event->y() - lastPos.y(); - - lastPos = event->pos(); -} - -void qtSpectrumDisplay::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, - GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4) -{ - qglColor(qtGreen); - - glVertex3d(x1, y1, -0.05); - glVertex3d(x2, y2, -0.05); - glVertex3d(x3, y3, -0.05); - glVertex3d(x4, y4, -0.05); - - glVertex3d(x4, y4, +0.05); - glVertex3d(x3, y3, +0.05); - glVertex3d(x2, y2, +0.05); - glVertex3d(x1, y1, +0.05); -} - -void qtSpectrumDisplay::normalizeAngle(int *angle) -{ - while (*angle < 0) - *angle += 360 * 16; - while (*angle > 360 * 16) - *angle -= 360 * 16; + + glCallList(object); + + glFlush(); + + //*********************** Display axes values **************************** + + + ostringstream buff; + glViewport(0, 0, w, h); + int nDivs = 11; + glColor3f(1.0, 1.0, 1.0); + for(int i = 0; i < nDivs; i++) + { + float divStep = (aMax - aMin)/(nDivs - 1); + float pixStep = (float)(h - 10)/(nDivs - 1); + + buff<pos(); + + if(event->buttons() & Qt::LeftButton) + { + int wn = 0; + printWavenumber(event->x()); + } +} + +void qtSpectrumDisplay::mouseMoveEvent(QMouseEvent *event) +{ + int dx = event->x() - lastPos.x(); + int dy = event->y() - lastPos.y(); + + lastPos = event->pos(); +} + +void qtSpectrumDisplay::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, + GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4) +{ + qglColor(qtGreen); + + glVertex3d(x1, y1, -0.05); + glVertex3d(x2, y2, -0.05); + glVertex3d(x3, y3, -0.05); + glVertex3d(x4, y4, -0.05); + + glVertex3d(x4, y4, +0.05); + glVertex3d(x3, y3, +0.05); + glVertex3d(x2, y2, +0.05); + glVertex3d(x1, y1, +0.05); +} + +void qtSpectrumDisplay::normalizeAngle(int *angle) +{ + while (*angle < 0) + *angle += 360 * 16; + while (*angle > 360 * 16) + *angle -= 360 * 16; } diff --git a/qtSpectrumDisplay.h b/qtSpectrumDisplay.h index 209cfc5..e42af53 100644 --- a/qtSpectrumDisplay.h +++ b/qtSpectrumDisplay.h @@ -1,52 +1,52 @@ - #ifndef GLWIDGET_H - #define GLWIDGET_H - -#include -#include "globals.h" - - class qtSpectrumDisplay : public QGLWidget - { - Q_OBJECT - - public: - qtSpectrumDisplay(QWidget *parent = 0); - ~qtSpectrumDisplay(); - - QSize minimumSizeHint() const; - QSize sizeHint() const; - - public slots: - /*void setXRotation(int angle); - void setYRotation(int angle); - void setZRotation(int angle);*/ - - signals: - void xRotationChanged(int angle); - void yRotationChanged(int angle); - void zRotationChanged(int angle); - - protected: - void initializeGL(); - void paintGL(); - void resizeGL(int width, int height); - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - - private: - //GLuint makeObject(); - void quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, - GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4); - //void extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); - void normalizeAngle(int *angle); - void printWavenumber(int wn); - - GLuint object; - int xRot; - int yRot; - int zRot; - QPoint lastPos; - QColor qtGreen; - QColor qtPurple; - }; - - #endif \ No newline at end of file +#ifndef GLWIDGET_H +#define GLWIDGET_H + +#include +#include "globals.h" + +class qtSpectrumDisplay : public QGLWidget +{ + Q_OBJECT + +public: + qtSpectrumDisplay(QWidget *parent = 0); + ~qtSpectrumDisplay(); + + QSize minimumSizeHint() const; + QSize sizeHint() const; + +public slots: + /*void setXRotation(int angle); + void setYRotation(int angle); + void setZRotation(int angle);*/ + +signals: + void xRotationChanged(int angle); + void yRotationChanged(int angle); + void zRotationChanged(int angle); + +protected: + void initializeGL(); + void paintGL(); + void resizeGL(int width, int height); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + +private: + //GLuint makeObject(); + void quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2, + GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4); + //void extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); + void normalizeAngle(int *angle); + void printWavenumber(int wn); + + GLuint object; + int xRot; + int yRot; + int zRot; + QPoint lastPos; + QColor qtGreen; + QColor qtPurple; +}; + +#endif -- libgit2 0.21.4