Commit 0c9bf8ae3d756b11c482aa79a62fd9f3db7a51e0

Authored by dmayerich
1 parent bfe3f56b

Case-sensitive errors with the bessel functions.

CMakeLists.txt
1   -#Specify the version being used aswell as the language
2   -cmake_minimum_required(VERSION 2.8)
3   -#Name your project here
4   -project(IMie)
5   -
6   -#set the module directory
7   -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}")
8   -
9   -#find the Qt4
10   -find_package(Qt4 REQUIRED)
11   -find_package(Qt4 REQUIRED)
12   -include_directories(${QT_INCLUDE_DIRECTORY})
13   -include(${QT_USE_FILE})
14   -
15   -#set up CUDA
16   -find_package(CUDA)
17   -
18   -#find OpenGL
19   -find_package(OpenGL REQUIRED)
20   -
21   -#find GLUT
22   -set(GLUT_ROOT_PATH $ENV{GLUT_ROOT_PATH})
23   -find_package(GLUT REQUIRED)
24   -
25   -#find GLEW
26   -find_package(GLEW REQUIRED)
27   -
28   -#add Qt OpenGL stuff
29   -set(QT_USE_QTOPENGL TRUE)
30   -
31   -#ask the user for the RTS location
32   -set(RTS_ROOT_PATH $ENV{RTS_ROOT_PATH})
33   -find_package(RTS REQUIRED)
34   -
35   -#set the include directories
36   -include_directories(
37   - ${CMAKE_CURRENT_BINARY_DIR}
38   - ${QT_INCLUDES}
39   - ${QT_QTOPENGL_INCLUDE_DIR}
40   - ${OPENGL_INCLUDE_DIR}
41   - ${GLEW_INCLUDE_PATH}
42   - ${GLUT_INCLUDE_DIR}
43   - ${RTS_INCLUDE_DIR}
44   -)
45   -
46   -#Assign source files to the appropriate variables
47   -file(GLOB SRC_CPP "*.cpp")
48   -file(GLOB SRC_H "*.h")
49   -file(GLOB SRC_UI "*.ui")
50   -file(GLOB SRC_QRC "*.qrc")
51   -file(GLOB SRC_CU "*.cu")
52   -
53   -#set up copying data files
54   -configure_file(kPMMA.txt ${CMAKE_CURRENT_BINARY_DIR}/kPMMA.txt @ONLY)
55   -configure_file(eta_TolueneK.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_TolueneK.txt @ONLY)
56   -configure_file(eta_TolueneN.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_TolueneN.txt @ONLY)
57   -
58   -#determine which source files have to be moc'd
59   -Qt4_wrap_cpp(UI_MOC ${SRC_H})
60   -Qt4_wrap_ui(UI_H ${SRC_UI})
61   -Qt4_add_resources(ALL_RCC ${ALL_QRC})
62   -
63   -#moc the necessary files
64   -Qt4_automoc(${ALL_CPP})
65   -
66   -source_group(QtMoc FILES ${UI_MOC})
67   -source_group(QtUI FILES ${SRC_UI})
68   -
69   -#create an executable
70   -cuda_add_executable(IMie ${SRC_CPP} ${SRC_H} ${UI_H} ${UI_MOC} ${ALL_RCC} ${SRC_CU})
71   -
72   -#set the link libraries
73   -target_link_libraries(IMie ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${GLEW_LIBRARY})
74   -
75   -
76   -
  1 +#Specify the version being used aswell as the language
  2 +cmake_minimum_required(VERSION 2.8)
  3 +#Name your project here
  4 +project(IMie)
  5 +
  6 +#set the module directory
  7 +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}")
  8 +
  9 +#find the Qt4
  10 +find_package(Qt4 REQUIRED)
  11 +find_package(Qt4 REQUIRED)
  12 +include_directories(${QT_INCLUDE_DIRECTORY})
  13 +include(${QT_USE_FILE})
  14 +
  15 +#set up CUDA
  16 +find_package(CUDA)
  17 +
  18 +#find OpenGL
  19 +find_package(OpenGL REQUIRED)
  20 +
  21 +#find GLUT
  22 +set(GLUT_ROOT_PATH $ENV{GLUT_ROOT_PATH})
  23 +find_package(GLUT REQUIRED)
  24 +
  25 +#find GLEW
  26 +find_package(GLEW REQUIRED)
  27 +
  28 +#add Qt OpenGL stuff
  29 +set(QT_USE_QTOPENGL TRUE)
  30 +
  31 +#ask the user for the RTS location
  32 +set(RTS_ROOT_PATH $ENV{RTS_ROOT_PATH})
  33 +find_package(RTS REQUIRED)
  34 +
  35 +#set the include directories
  36 +include_directories(
  37 + ${CMAKE_CURRENT_BINARY_DIR}
  38 + ${QT_INCLUDES}
  39 + ${QT_QTOPENGL_INCLUDE_DIR}
  40 + ${OPENGL_INCLUDE_DIR}
  41 + ${GLEW_INCLUDE_PATH}
  42 + ${GLUT_INCLUDE_DIR}
  43 + ${RTS_INCLUDE_DIR}
  44 +)
  45 +
  46 +#Assign source files to the appropriate variables
  47 +file(GLOB SRC_CPP "*.cpp")
  48 +file(GLOB SRC_H "*.h")
  49 +file(GLOB SRC_UI "*.ui")
  50 +file(GLOB SRC_QRC "*.qrc")
  51 +file(GLOB SRC_CU "*.cu")
  52 +
  53 +#set up copying data files
  54 +configure_file(kPMMA.txt ${CMAKE_CURRENT_BINARY_DIR}/kPMMA.txt @ONLY)
  55 +configure_file(eta_TolueneK.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_TolueneK.txt @ONLY)
  56 +configure_file(eta_TolueneN.txt ${CMAKE_CURRENT_BINARY_DIR}/eta_TolueneN.txt @ONLY)
  57 +
  58 +#determine which source files have to be moc'd
  59 +Qt4_wrap_cpp(UI_MOC ${SRC_H})
  60 +Qt4_wrap_ui(UI_H ${SRC_UI})
  61 +Qt4_add_resources(ALL_RCC ${ALL_QRC})
  62 +
  63 +#moc the necessary files
  64 +Qt4_automoc(${ALL_CPP})
  65 +
  66 +source_group(QtMoc FILES ${UI_MOC})
  67 +source_group(QtUI FILES ${SRC_UI})
  68 +
  69 +#create an executable
  70 +cuda_add_executable(IMie ${SRC_CPP} ${SRC_H} ${UI_H} ${UI_MOC} ${ALL_RCC} ${SRC_CU})
  71 +
  72 +#set the link libraries
  73 +target_link_libraries(IMie ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${GLEW_LIBRARY})
  74 +
  75 +
  76 +
... ...
EstimateMaterial.cpp
1   -#include "globals.h"
2   -#include <stdlib.h>
3   -#define PI 3.14159
4   -
5   -double CalculateError(double* E)
6   -{
7   - //Calculate the error between the Reference Spectrum and the Simulated Spectrum
8   - double sumE = 0.0;
9   - int nVals = RefSpectrum[currentSpec].size();
10   - double nu;
11   - for(int i=0; i<nVals; i++)
12   - {
13   - nu = RefSpectrum[currentSpec][i].nu;
14   - E[i] = RefSpectrum[currentSpec][i].A + nu * refSlope - SimSpectrum[i].A;
15   - sumE += E[i]*E[i];
16   - }
17   -
18   - return sumE/nVals;
19   -}
20   -
21   -void EstimateK(double* E)
22   -{
23   - int nVals = RefSpectrum[currentSpec].size();
24   - double nuStart = RefSpectrum[currentSpec].front().nu;
25   - double nuEnd = RefSpectrum[currentSpec].back().nu;
26   -
27   - double r = radius/10000.0;
28   - double nu;
29   - double dNu = (nuEnd - nuStart)/(nVals-1);
30   - double eScale;
31   - for(int i=0; i<nVals; i++)
32   - {
33   - nu = nuStart + i*2;
34   -
35   - eScale = 1/(8*PI*r*nu);
36   - EtaK[i].A = EtaK[i].A + eScale * E[i];
37   - if(EtaK[i].A < 0.0) EtaK[i].A = 0.0;
38   - }
39   -}
40   -
41   -void EstimateMaterial()
42   -{
43   - /*This function estimates the material properties of a sphere based on the
44   - input spectrum RefSpectrum and the optical properties of the system.
45   - 1) The material properties are stored in EtaK and EtaN
46   - 2) The best fit is stored in SimSpectrum*/
47   -
48   - //initialize the material index of refraction
49   - EtaN.clear();
50   - EtaK.clear();
51   -
52   - //insert the default material properties
53   - SpecPair temp;
54   - for(int s=0; s<(int)RefSpectrum[currentSpec].size(); s++)
55   - {
56   - //the real part of the IR is the user-specified baseline IR
57   - temp.nu = RefSpectrum[currentSpec][s].nu;
58   - temp.A = baseIR;
59   - EtaN.push_back(temp);
60   - //the imaginary part of the IR is zero absorbance
61   - temp.A = 0.0f;
62   - EtaK.push_back(temp);
63   - }
64   -
65   -
66   - //allocate space to store the list of error values
67   - double* E = (double*)malloc(sizeof(double) * RefSpectrum[currentSpec].size());
68   - //copy the absorbance values into a linear array
69   - double* k = (double*)malloc(sizeof(double) * EtaK.size());
70   - double* n = (double*)malloc(sizeof(double) * EtaN.size());
71   -
72   - //iterate to solve for both n and k
73   - double sumE = 99999.9;
74   - int j=0;
75   - //clear the console
76   - system("cls");
77   - while(sumE > minMSE && j < maxFitIter)
78   - {
79   - //simulate a spectrum based on the current IR
80   - SimulateSpectrum();
81   -
82   - //calculate the error term
83   - sumE = CalculateError(E);
84   -
85   - //estimate the new absorbance
86   - EstimateK(E);
87   -
88   - //use Kramers-Kronig to compute n
89   -
90   - for(unsigned int i=0; i<EtaK.size(); i++)
91   - k[i] = EtaK[i].A;
92   - cudaKramersKronig(n, k, EtaK.size(), EtaK.front().nu, EtaK.back().nu, baseIR);
93   -
94   - //copy the real part of the index of refraction into the vector
95   - EtaN.clear();
96   - for(int i=0; i<(int)EtaK.size(); i++)
97   - {
98   - temp.nu = EtaK[i].nu;
99   - temp.A = n[i];
100   - EtaN.push_back(temp);
101   - }
102   -
103   - cout<<" E = "<<sumE<<endl;
104   - j++;
105   - //SaveSpectrum(n, nVals, "simNj.txt");
106   - //SaveSpectrum(k, nVals, "simKj.txt");
107   - //SaveSpectrum(simSpec, nVals, "simSpec.txt");
108   - //exit(1);
109   -
110   - }
111   -
112   - free(E);
113   - free(k);
114   - free(n);
115   -
116   -
117   -
118   -
  1 +#include "globals.h"
  2 +#include <stdlib.h>
  3 +#define PI 3.14159
  4 +
  5 +double CalculateError(double* E)
  6 +{
  7 + //Calculate the error between the Reference Spectrum and the Simulated Spectrum
  8 + double sumE = 0.0;
  9 + int nVals = RefSpectrum[currentSpec].size();
  10 + double nu;
  11 + for(int i=0; i<nVals; i++)
  12 + {
  13 + nu = RefSpectrum[currentSpec][i].nu;
  14 + E[i] = RefSpectrum[currentSpec][i].A + nu * refSlope - SimSpectrum[i].A;
  15 + sumE += E[i]*E[i];
  16 + }
  17 +
  18 + return sumE/nVals;
  19 +}
  20 +
  21 +void EstimateK(double* E)
  22 +{
  23 + int nVals = RefSpectrum[currentSpec].size();
  24 + double nuStart = RefSpectrum[currentSpec].front().nu;
  25 + double nuEnd = RefSpectrum[currentSpec].back().nu;
  26 +
  27 + double r = radius/10000.0;
  28 + double nu;
  29 + double dNu = (nuEnd - nuStart)/(nVals-1);
  30 + double eScale;
  31 + for(int i=0; i<nVals; i++)
  32 + {
  33 + nu = nuStart + i*2;
  34 +
  35 + eScale = 1/(8*PI*r*nu);
  36 + EtaK[i].A = EtaK[i].A + eScale * E[i];
  37 + if(EtaK[i].A < 0.0) EtaK[i].A = 0.0;
  38 + }
  39 +}
  40 +
  41 +void EstimateMaterial()
  42 +{
  43 + /*This function estimates the material properties of a sphere based on the
  44 + input spectrum RefSpectrum and the optical properties of the system.
  45 + 1) The material properties are stored in EtaK and EtaN
  46 + 2) The best fit is stored in SimSpectrum*/
  47 +
  48 + //initialize the material index of refraction
  49 + EtaN.clear();
  50 + EtaK.clear();
  51 +
  52 + //insert the default material properties
  53 + SpecPair temp;
  54 + for(int s=0; s<(int)RefSpectrum[currentSpec].size(); s++)
  55 + {
  56 + //the real part of the IR is the user-specified baseline IR
  57 + temp.nu = RefSpectrum[currentSpec][s].nu;
  58 + temp.A = baseIR;
  59 + EtaN.push_back(temp);
  60 + //the imaginary part of the IR is zero absorbance
  61 + temp.A = 0.0f;
  62 + EtaK.push_back(temp);
  63 + }
  64 +
  65 +
  66 + //allocate space to store the list of error values
  67 + double* E = (double*)malloc(sizeof(double) * RefSpectrum[currentSpec].size());
  68 + //copy the absorbance values into a linear array
  69 + double* k = (double*)malloc(sizeof(double) * EtaK.size());
  70 + double* n = (double*)malloc(sizeof(double) * EtaN.size());
  71 +
  72 + //iterate to solve for both n and k
  73 + double sumE = 99999.9;
  74 + int j=0;
  75 + //clear the console
  76 + system("cls");
  77 + while(sumE > minMSE && j < maxFitIter)
  78 + {
  79 + //simulate a spectrum based on the current IR
  80 + SimulateSpectrum();
  81 +
  82 + //calculate the error term
  83 + sumE = CalculateError(E);
  84 +
  85 + //estimate the new absorbance
  86 + EstimateK(E);
  87 +
  88 + //use Kramers-Kronig to compute n
  89 +
  90 + for(unsigned int i=0; i<EtaK.size(); i++)
  91 + k[i] = EtaK[i].A;
  92 + cudaKramersKronig(n, k, EtaK.size(), EtaK.front().nu, EtaK.back().nu, baseIR);
  93 +
  94 + //copy the real part of the index of refraction into the vector
  95 + EtaN.clear();
  96 + for(int i=0; i<(int)EtaK.size(); i++)
  97 + {
  98 + temp.nu = EtaK[i].nu;
  99 + temp.A = n[i];
  100 + EtaN.push_back(temp);
  101 + }
  102 +
  103 + cout<<" E = "<<sumE<<endl;
  104 + j++;
  105 + //SaveSpectrum(n, nVals, "simNj.txt");
  106 + //SaveSpectrum(k, nVals, "simKj.txt");
  107 + //SaveSpectrum(simSpec, nVals, "simSpec.txt");
  108 + //exit(1);
  109 +
  110 + }
  111 +
  112 + free(E);
  113 + free(k);
  114 + free(n);
  115 +
  116 +
  117 +
  118 +
119 119 }
120 120 \ No newline at end of file
... ...
FileIO.cpp
1   -#include "globals.h"
2   -#include <sstream>
3   -#include <fstream>
4   -#include <iostream>
5   -using namespace std;
6   -
7   -vector<SpecPair> LoadSpectrum(string filename)
8   -{
9   - //load a spectrum from a file and resample to 2wn intervals
10   -
11   - //create the spectrum
12   - vector<SpecPair> S;
13   -
14   - //open the file
15   - ifstream inFile(filename.c_str());
16   -
17   -
18   - SpecPair temp;
19   - while(!inFile.eof()){
20   - inFile>>temp.nu;
21   - inFile>>temp.A;
22   - S.push_back(temp);
23   - }
24   -
25   - //compute the minimum and maximum input wavenumbers
26   - double inMin = S.front().nu;
27   - double inMax = S.back().nu;
28   -
29   - int nuMin = (int)ceil(inMin);
30   - int nuMax = (int)floor(inMax);
31   -
32   - //make sure both are either even or odd
33   - if(nuMin % 2 != nuMax % 2)
34   - nuMax--;
35   -
36   - //compute the number of values in the resampled spectrum
37   - int nVals = (nuMax - nuMin)/2 + 1;
38   -
39   - //allocate space for the spectrum
40   - vector<SpecPair> outSpec;
41   -
42   - double nu, highVal, lowVal, a;
43   - int j=1;
44   - for(int i=0; i<nVals; i++)
45   - {
46   - nu = nuMin + i * 2;
47   - temp.nu = nu;
48   -
49   - //handle the boundary cases
50   - if(nu < inMin || nu > inMax)
51   - temp.A = 0.0;
52   - else
53   - {
54   - //move to the correct position in the input array
55   - while(j < (int)S.size()-1 && S[j].nu <= nu)
56   - j++;
57   -
58   - lowVal = S[j-1].nu;
59   - highVal = S[j].nu;
60   - a = (nu - lowVal)/(highVal - lowVal);
61   - temp.A = S[j-1].A * (1.0 - a) + S[j].A * a;
62   - }
63   - outSpec.push_back(temp);
64   - }
65   -
66   -
67   -
68   - return outSpec;
69   -}
70   -
71   -vector<SpecPair> SetReferenceSpectrum(char* text)
72   -{
73   - stringstream inString(text);
74   -
75   - //create the spectrum
76   - vector<SpecPair> S;
77   -
78   - SpecPair temp;
79   - while(!inString.eof()){
80   - inString>>temp.nu;
81   - inString>>temp.A;
82   - S.push_back(temp);
83   - }
84   -
85   - return S;
86   -}
87   -
88   -void SaveK(string fileName)
89   -{
90   - ofstream outFile(fileName.c_str());
91   - for(unsigned int i=0; i<EtaK.size(); i++)
92   - {
93   - outFile<<EtaK[i].nu<<" ";
94   - outFile<<EtaK[i].A<<endl;
95   - }
96   - outFile.close();
97   -}
98   -
99   -void SaveN(string fileName)
100   -{
101   - ofstream outFile(fileName.c_str());
102   - for(unsigned int i=0; i<EtaN.size(); i++)
103   - {
104   - outFile<<EtaN[i].nu<<" ";
105   - outFile<<EtaN[i].A<<endl;
106   - }
107   - outFile.close();
108   -}
109   -
110   -void SaveSimulation(string fileName)
111   -{
112   - ofstream outFile(fileName.c_str());
113   - outFile.precision(10);
114   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
115   - {
116   - outFile<<SimSpectrum[i].nu<<" ";
117   - outFile<<SimSpectrum[i].A<<endl;
118   - }
119   - outFile.close();
120   -}
121   -
122   -void SaveState()
123   -{
124   - ofstream outFile("main.prj");
125   - //Window Parameters
126   - outFile<<nuMin<<endl;
127   - outFile<<nuMax<<endl;
128   - outFile<<aMin<<endl;
129   - outFile<<aMax<<endl;
130   - outFile<<dNu<<endl;
131   -
132   - //material parameters
133   - outFile<<radius<<endl;
134   - outFile<<baseIR<<endl;
135   - outFile<<cA<<endl;
136   -
137   - //optical parameters
138   - outFile<<cNAi<<endl;
139   - outFile<<cNAo<<endl;
140   - outFile<<oNAi<<endl;
141   - outFile<<oNAo<<endl;
142   -
143   - outFile.close();
144   -
145   -}
146   -
147   -void LoadState()
148   -{
149   - ifstream inFile("main.prj");
150   - //Window Parameters
151   - inFile>>nuMin;
152   - inFile>>nuMax;
153   - inFile>>aMin;
154   - inFile>>aMax;
155   - inFile>>dNu;
156   -
157   - //material parameters
158   - inFile>>radius;
159   - inFile>>baseIR;
160   - inFile>>cA;
161   -
162   - //optical parameters
163   - inFile>>cNAi;
164   - inFile>>cNAo;
165   - inFile>>oNAi;
166   - inFile>>oNAo;
167   -
168   - inFile.close();
169   -
170   -}
171   -
172   -void SetDefaults()
173   -{
174   -
175   - nuMin = 800;
176   - nuMax = 4000;
177   - dNu = 2;
178   -
179   - aMin = 0;
180   - aMax = 1;
181   -
182   -
183   - //material parameters
184   - radius = 4.0f;
185   - baseIR = 1.49f;
186   - cA = 1.0;
187   - vector<SpecPair> KMaterial;
188   - vector<SpecPair> NMaterial;
189   -
190   - //optical parameters
191   - cNAi = 0.0;
192   - cNAo = 0.6;
193   - oNAi = 0.0;
194   - oNAo = 0.6;
  1 +#include "globals.h"
  2 +#include <sstream>
  3 +#include <fstream>
  4 +#include <iostream>
  5 +using namespace std;
  6 +
  7 +vector<SpecPair> LoadSpectrum(string filename)
  8 +{
  9 + //load a spectrum from a file and resample to 2wn intervals
  10 +
  11 + //create the spectrum
  12 + vector<SpecPair> S;
  13 +
  14 + //open the file
  15 + ifstream inFile(filename.c_str());
  16 +
  17 +
  18 + SpecPair temp;
  19 + while(!inFile.eof()){
  20 + inFile>>temp.nu;
  21 + inFile>>temp.A;
  22 + S.push_back(temp);
  23 + }
  24 +
  25 + //compute the minimum and maximum input wavenumbers
  26 + double inMin = S.front().nu;
  27 + double inMax = S.back().nu;
  28 +
  29 + int nuMin = (int)ceil(inMin);
  30 + int nuMax = (int)floor(inMax);
  31 +
  32 + //make sure both are either even or odd
  33 + if(nuMin % 2 != nuMax % 2)
  34 + nuMax--;
  35 +
  36 + //compute the number of values in the resampled spectrum
  37 + int nVals = (nuMax - nuMin)/2 + 1;
  38 +
  39 + //allocate space for the spectrum
  40 + vector<SpecPair> outSpec;
  41 +
  42 + double nu, highVal, lowVal, a;
  43 + int j=1;
  44 + for(int i=0; i<nVals; i++)
  45 + {
  46 + nu = nuMin + i * 2;
  47 + temp.nu = nu;
  48 +
  49 + //handle the boundary cases
  50 + if(nu < inMin || nu > inMax)
  51 + temp.A = 0.0;
  52 + else
  53 + {
  54 + //move to the correct position in the input array
  55 + while(j < (int)S.size()-1 && S[j].nu <= nu)
  56 + j++;
  57 +
  58 + lowVal = S[j-1].nu;
  59 + highVal = S[j].nu;
  60 + a = (nu - lowVal)/(highVal - lowVal);
  61 + temp.A = S[j-1].A * (1.0 - a) + S[j].A * a;
  62 + }
  63 + outSpec.push_back(temp);
  64 + }
  65 +
  66 +
  67 +
  68 + return outSpec;
  69 +}
  70 +
  71 +vector<SpecPair> SetReferenceSpectrum(char* text)
  72 +{
  73 + stringstream inString(text);
  74 +
  75 + //create the spectrum
  76 + vector<SpecPair> S;
  77 +
  78 + SpecPair temp;
  79 + while(!inString.eof()){
  80 + inString>>temp.nu;
  81 + inString>>temp.A;
  82 + S.push_back(temp);
  83 + }
  84 +
  85 + return S;
  86 +}
  87 +
  88 +void SaveK(string fileName)
  89 +{
  90 + ofstream outFile(fileName.c_str());
  91 + for(unsigned int i=0; i<EtaK.size(); i++)
  92 + {
  93 + outFile<<EtaK[i].nu<<" ";
  94 + outFile<<EtaK[i].A<<endl;
  95 + }
  96 + outFile.close();
  97 +}
  98 +
  99 +void SaveN(string fileName)
  100 +{
  101 + ofstream outFile(fileName.c_str());
  102 + for(unsigned int i=0; i<EtaN.size(); i++)
  103 + {
  104 + outFile<<EtaN[i].nu<<" ";
  105 + outFile<<EtaN[i].A<<endl;
  106 + }
  107 + outFile.close();
  108 +}
  109 +
  110 +void SaveSimulation(string fileName)
  111 +{
  112 + ofstream outFile(fileName.c_str());
  113 + outFile.precision(10);
  114 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  115 + {
  116 + outFile<<SimSpectrum[i].nu<<" ";
  117 + outFile<<SimSpectrum[i].A<<endl;
  118 + }
  119 + outFile.close();
  120 +}
  121 +
  122 +void SaveState()
  123 +{
  124 + ofstream outFile("main.prj");
  125 + //Window Parameters
  126 + outFile<<nuMin<<endl;
  127 + outFile<<nuMax<<endl;
  128 + outFile<<aMin<<endl;
  129 + outFile<<aMax<<endl;
  130 + outFile<<dNu<<endl;
  131 +
  132 + //material parameters
  133 + outFile<<radius<<endl;
  134 + outFile<<baseIR<<endl;
  135 + outFile<<cA<<endl;
  136 +
  137 + //optical parameters
  138 + outFile<<cNAi<<endl;
  139 + outFile<<cNAo<<endl;
  140 + outFile<<oNAi<<endl;
  141 + outFile<<oNAo<<endl;
  142 +
  143 + outFile.close();
  144 +
  145 +}
  146 +
  147 +void LoadState()
  148 +{
  149 + ifstream inFile("main.prj");
  150 + //Window Parameters
  151 + inFile>>nuMin;
  152 + inFile>>nuMax;
  153 + inFile>>aMin;
  154 + inFile>>aMax;
  155 + inFile>>dNu;
  156 +
  157 + //material parameters
  158 + inFile>>radius;
  159 + inFile>>baseIR;
  160 + inFile>>cA;
  161 +
  162 + //optical parameters
  163 + inFile>>cNAi;
  164 + inFile>>cNAo;
  165 + inFile>>oNAi;
  166 + inFile>>oNAo;
  167 +
  168 + inFile.close();
  169 +
  170 +}
  171 +
  172 +void SetDefaults()
  173 +{
  174 +
  175 + nuMin = 800;
  176 + nuMax = 4000;
  177 + dNu = 2;
  178 +
  179 + aMin = 0;
  180 + aMax = 1;
  181 +
  182 +
  183 + //material parameters
  184 + radius = 4.0f;
  185 + baseIR = 1.49f;
  186 + cA = 1.0;
  187 + vector<SpecPair> KMaterial;
  188 + vector<SpecPair> NMaterial;
  189 +
  190 + //optical parameters
  191 + cNAi = 0.0;
  192 + cNAo = 0.6;
  193 + oNAi = 0.0;
  194 + oNAo = 0.6;
195 195 }
196 196 \ No newline at end of file
... ...
FindCUDASDK.cmake
1   -#
2   -# The script defines the following variables:
3   -#
4   -##############################################################################
5   -# Note: Removed everything related to CUDA_SDK_ROOT_DIR and only left this as
6   -# a possible environment variable to set the SDK directory.
7   -# Include file will be: CUDA_CUT_INCLUDE_DIR
8   -# Cutil library: CUDA_CUT_LIBRARY
9   -##############################################################################
10   -#
11   -#
12   -# CUDA_SDK_ROOT_DIR -- Path to the CUDA SDK. Use this to find files in the
13   -# SDK. This script will not directly support finding
14   -# specific libraries or headers, as that isn't
15   -# supported by NVIDIA. If you want to change
16   -# libraries when the path changes see the
17   -# FindCUDA.cmake script for an example of how to clear
18   -# these variables. There are also examples of how to
19   -# use the CUDA_SDK_ROOT_DIR to locate headers or
20   -# libraries, if you so choose (at your own risk).
21   -#
22   -# This code is licensed under the MIT License. See the FindCUDASDK.cmake script
23   -# for the text of the license.
24   -
25   -# The MIT License
26   -#
27   -# License for the specific language governing rights and limitations under
28   -# Permission is hereby granted, free of charge, to any person obtaining a
29   -# copy of this software and associated documentation files (the "Software"),
30   -# to deal in the Software without restriction, including without limitation
31   -# the rights to use, copy, modify, merge, publish, distribute, sublicense,
32   -# and/or sell copies of the Software, and to permit persons to whom the
33   -# Software is furnished to do so, subject to the following conditions:
34   -#
35   -# The above copyright notice and this permission notice shall be included
36   -# in all copies or substantial portions of the Software.
37   -#
38   -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
39   -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40   -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
41   -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42   -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
43   -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
44   -# DEALINGS IN THE SOFTWARE.
45   -#
46   -###############################################################################
47   -
48   -# FindCUDASDK.cmake
49   -
50   -# # Check to see if the CUDA_SDK_ROOT_DIR has changed,
51   -# # if it has then clear the cache variable, so that it will be detected again.
52   -# if(NOT "${CUDA_SDK_ROOT_DIR}" STREQUAL "${CUDA_SDK_ROOT_DIR_INTERNAL}")
53   -# # No specific variables to catch. Use this kind of code before calling
54   -# # find_package(CUDA) to clean up any variables that may depend on this path.
55   -#
56   -# # unset(MY_SPECIAL_CUDA_SDK_INCLUDE_DIR CACHE)
57   -# # unset(MY_SPECIAL_CUDA_SDK_LIBRARY CACHE)
58   -# endif()
59   -#
60   -# ########################
61   -# # Look for the SDK stuff
62   -# find_path(CUDA_SDK_ROOT_DIR cutil.h
63   -# PATH_SUFFIXES "common/inc" "C/common/inc"
64   -# "$ENV{NVSDKCUDA_ROOT}"
65   -# "[HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Installed Products\\NVIDIA SDK 10\\Compute;InstallDir]"
66   -# "/Developer/GPU\ Computing/C"
67   -# )
68   -#
69   -# # fallback method for determining CUDA_SDK_ROOT_DIR in case the previous one failed!
70   -# if (NOT CUDA_SDK_ROOT_DIR)
71   -# find_path(CUDA_SDK_ROOT_DIR C/common/inc/cutil.h
72   -# "$ENV{NVSDKCUDA_ROOT}"
73   -# "[HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Installed Products\\NVIDIA SDK 10\\Compute;InstallDir]"
74   -# "/Developer/GPU\ Computing/C"
75   -# )
76   -# endif()
77   -
78   -# Keep the CUDA_SDK_ROOT_DIR first in order to be able to override the
79   -# environment variables.
80   -set(CUDA_SDK_SEARCH_PATH
81   - "${CUDA_SDK_ROOT_DIR}"
82   - "${CUDA_TOOLKIT_ROOT_DIR}/local/NVSDK0.2"
83   - "${CUDA_TOOLKIT_ROOT_DIR}/NVSDK0.2"
84   - "${CUDA_TOOLKIT_ROOT_DIR}/NV_SDK"
85   - "${CUDA_TOOLKIT_ROOT_DIR}/NV_CUDA_SDK"
86   - "$ENV{HOME}/NVIDIA_CUDA_SDK"
87   - "$ENV{HOME}/NVIDIA_CUDA_SDK_MACOSX"
88   - "$ENV{HOME}/NVIDIA_GPU_Computing_SDK"
89   - "/Developer/CUDA"
90   - )
91   -
92   -# Find include file from the CUDA_SDK_SEARCH_PATH
93   -
94   -find_path(CUDA_CUT_INCLUDE_DIR
95   - cutil.h
96   - PATHS ${CUDA_SDK_SEARCH_PATH}
97   - PATH_SUFFIXES "common/inc" "C/common/inc"
98   - DOC "Location of cutil.h"
99   - NO_DEFAULT_PATH
100   - )
101   -# Now search system paths
102   -find_path(CUDA_CUT_INCLUDE_DIR cutil.h DOC "Location of cutil.h")
103   -
104   -# mark_as_advanced(CUDA_CUT_INCLUDE_DIR)
105   -
106   -
107   -# Example of how to find a library in the CUDA_SDK_ROOT_DIR
108   -
109   -# cutil library is called cutil64 for 64 bit builds on windows. We don't want
110   -# to get these confused, so we are setting the name based on the word size of
111   -# the build.
112   -
113   -# New library might be called cutil_x86_64 !
114   -
115   -if(CMAKE_SIZEOF_VOID_P EQUAL 8)
116   - set(cuda_cutil_name cutil64)
117   -else(CMAKE_SIZEOF_VOID_P EQUAL 8)
118   - set(cuda_cutil_name cutil32)
119   -endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
120   -
121   -find_library(CUDA_CUT_LIBRARY
122   - NAMES ${cuda_cutil_name} cutil cutil_x86_64 cutil_i386
123   - PATHS ${CUDA_SDK_SEARCH_PATH}
124   - # The new version of the sdk shows up in common/lib, but the old one is in lib
125   - # The very newest installation Path of the SDK is in subdirectory 'C'. Please add this Path to the possible suffixes.
126   - PATH_SUFFIXES "C/lib" "common/lib" "lib" "C/common/lib" "common/lib"
127   - DOC "Location of cutil library"
128   - NO_DEFAULT_PATH
129   - )
130   -# # Now search system paths
131   -# find_library(CUDA_CUT_LIBRARY NAMES cutil ${cuda_cutil_name} DOC "Location of cutil library")
132   -mark_as_advanced(CUDA_CUT_LIBRARY)
133   -set(CUDA_CUT_LIBRARIES ${CUDA_CUT_LIBRARY})
134   -
135   -#############################
136   -# Check for required components
137   -if(CUDA_CUT_INCLUDE_DIR)
138   - set(CUDASDK_FOUND TRUE)
139   -endif(CUDA_CUT_INCLUDE_DIR)
140   -
141   -# set(CUDA_SDK_ROOT_DIR_INTERNAL "${CUDA_SDK_ROOT_DIR}" CACHE INTERNAL
142   -# "This is the value of the last time CUDA_SDK_ROOT_DIR was set successfully." FORCE)
  1 +#
  2 +# The script defines the following variables:
  3 +#
  4 +##############################################################################
  5 +# Note: Removed everything related to CUDA_SDK_ROOT_DIR and only left this as
  6 +# a possible environment variable to set the SDK directory.
  7 +# Include file will be: CUDA_CUT_INCLUDE_DIR
  8 +# Cutil library: CUDA_CUT_LIBRARY
  9 +##############################################################################
  10 +#
  11 +#
  12 +# CUDA_SDK_ROOT_DIR -- Path to the CUDA SDK. Use this to find files in the
  13 +# SDK. This script will not directly support finding
  14 +# specific libraries or headers, as that isn't
  15 +# supported by NVIDIA. If you want to change
  16 +# libraries when the path changes see the
  17 +# FindCUDA.cmake script for an example of how to clear
  18 +# these variables. There are also examples of how to
  19 +# use the CUDA_SDK_ROOT_DIR to locate headers or
  20 +# libraries, if you so choose (at your own risk).
  21 +#
  22 +# This code is licensed under the MIT License. See the FindCUDASDK.cmake script
  23 +# for the text of the license.
  24 +
  25 +# The MIT License
  26 +#
  27 +# License for the specific language governing rights and limitations under
  28 +# Permission is hereby granted, free of charge, to any person obtaining a
  29 +# copy of this software and associated documentation files (the "Software"),
  30 +# to deal in the Software without restriction, including without limitation
  31 +# the rights to use, copy, modify, merge, publish, distribute, sublicense,
  32 +# and/or sell copies of the Software, and to permit persons to whom the
  33 +# Software is furnished to do so, subject to the following conditions:
  34 +#
  35 +# The above copyright notice and this permission notice shall be included
  36 +# in all copies or substantial portions of the Software.
  37 +#
  38 +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  39 +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  40 +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  41 +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  42 +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  43 +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  44 +# DEALINGS IN THE SOFTWARE.
  45 +#
  46 +###############################################################################
  47 +
  48 +# FindCUDASDK.cmake
  49 +
  50 +# # Check to see if the CUDA_SDK_ROOT_DIR has changed,
  51 +# # if it has then clear the cache variable, so that it will be detected again.
  52 +# if(NOT "${CUDA_SDK_ROOT_DIR}" STREQUAL "${CUDA_SDK_ROOT_DIR_INTERNAL}")
  53 +# # No specific variables to catch. Use this kind of code before calling
  54 +# # find_package(CUDA) to clean up any variables that may depend on this path.
  55 +#
  56 +# # unset(MY_SPECIAL_CUDA_SDK_INCLUDE_DIR CACHE)
  57 +# # unset(MY_SPECIAL_CUDA_SDK_LIBRARY CACHE)
  58 +# endif()
  59 +#
  60 +# ########################
  61 +# # Look for the SDK stuff
  62 +# find_path(CUDA_SDK_ROOT_DIR cutil.h
  63 +# PATH_SUFFIXES "common/inc" "C/common/inc"
  64 +# "$ENV{NVSDKCUDA_ROOT}"
  65 +# "[HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Installed Products\\NVIDIA SDK 10\\Compute;InstallDir]"
  66 +# "/Developer/GPU\ Computing/C"
  67 +# )
  68 +#
  69 +# # fallback method for determining CUDA_SDK_ROOT_DIR in case the previous one failed!
  70 +# if (NOT CUDA_SDK_ROOT_DIR)
  71 +# find_path(CUDA_SDK_ROOT_DIR C/common/inc/cutil.h
  72 +# "$ENV{NVSDKCUDA_ROOT}"
  73 +# "[HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Installed Products\\NVIDIA SDK 10\\Compute;InstallDir]"
  74 +# "/Developer/GPU\ Computing/C"
  75 +# )
  76 +# endif()
  77 +
  78 +# Keep the CUDA_SDK_ROOT_DIR first in order to be able to override the
  79 +# environment variables.
  80 +set(CUDA_SDK_SEARCH_PATH
  81 + "${CUDA_SDK_ROOT_DIR}"
  82 + "${CUDA_TOOLKIT_ROOT_DIR}/local/NVSDK0.2"
  83 + "${CUDA_TOOLKIT_ROOT_DIR}/NVSDK0.2"
  84 + "${CUDA_TOOLKIT_ROOT_DIR}/NV_SDK"
  85 + "${CUDA_TOOLKIT_ROOT_DIR}/NV_CUDA_SDK"
  86 + "$ENV{HOME}/NVIDIA_CUDA_SDK"
  87 + "$ENV{HOME}/NVIDIA_CUDA_SDK_MACOSX"
  88 + "$ENV{HOME}/NVIDIA_GPU_Computing_SDK"
  89 + "/Developer/CUDA"
  90 + )
  91 +
  92 +# Find include file from the CUDA_SDK_SEARCH_PATH
  93 +
  94 +find_path(CUDA_CUT_INCLUDE_DIR
  95 + cutil.h
  96 + PATHS ${CUDA_SDK_SEARCH_PATH}
  97 + PATH_SUFFIXES "common/inc" "C/common/inc"
  98 + DOC "Location of cutil.h"
  99 + NO_DEFAULT_PATH
  100 + )
  101 +# Now search system paths
  102 +find_path(CUDA_CUT_INCLUDE_DIR cutil.h DOC "Location of cutil.h")
  103 +
  104 +# mark_as_advanced(CUDA_CUT_INCLUDE_DIR)
  105 +
  106 +
  107 +# Example of how to find a library in the CUDA_SDK_ROOT_DIR
  108 +
  109 +# cutil library is called cutil64 for 64 bit builds on windows. We don't want
  110 +# to get these confused, so we are setting the name based on the word size of
  111 +# the build.
  112 +
  113 +# New library might be called cutil_x86_64 !
  114 +
  115 +if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  116 + set(cuda_cutil_name cutil64)
  117 +else(CMAKE_SIZEOF_VOID_P EQUAL 8)
  118 + set(cuda_cutil_name cutil32)
  119 +endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
  120 +
  121 +find_library(CUDA_CUT_LIBRARY
  122 + NAMES ${cuda_cutil_name} cutil cutil_x86_64 cutil_i386
  123 + PATHS ${CUDA_SDK_SEARCH_PATH}
  124 + # The new version of the sdk shows up in common/lib, but the old one is in lib
  125 + # The very newest installation Path of the SDK is in subdirectory 'C'. Please add this Path to the possible suffixes.
  126 + PATH_SUFFIXES "C/lib" "common/lib" "lib" "C/common/lib" "common/lib"
  127 + DOC "Location of cutil library"
  128 + NO_DEFAULT_PATH
  129 + )
  130 +# # Now search system paths
  131 +# find_library(CUDA_CUT_LIBRARY NAMES cutil ${cuda_cutil_name} DOC "Location of cutil library")
  132 +mark_as_advanced(CUDA_CUT_LIBRARY)
  133 +set(CUDA_CUT_LIBRARIES ${CUDA_CUT_LIBRARY})
  134 +
  135 +#############################
  136 +# Check for required components
  137 +if(CUDA_CUT_INCLUDE_DIR)
  138 + set(CUDASDK_FOUND TRUE)
  139 +endif(CUDA_CUT_INCLUDE_DIR)
  140 +
  141 +# set(CUDA_SDK_ROOT_DIR_INTERNAL "${CUDA_SDK_ROOT_DIR}" CACHE INTERNAL
  142 +# "This is the value of the last time CUDA_SDK_ROOT_DIR was set successfully." FORCE)
... ...
FindGLEW.cmake
1   -#
2   -# Try to find GLEW library and include path.
3   -# Once done this will define
4   -#
5   -# GLEW_FOUND
6   -# GLEW_INCLUDE_PATH
7   -# GLEW_LIBRARY
8   -#
9   -
10   -IF (WIN32)
11   - FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
12   - $ENV{PROGRAMFILES}/GLEW/include
13   - ${PROJECT_SOURCE_DIR}/src/nvgl/glew/include
14   - DOC "The directory where GL/glew.h resides")
15   - FIND_LIBRARY( GLEW_LIBRARY
16   - NAMES glew GLEW glew32 glew32s
17   - PATHS
18   - $ENV{PROGRAMFILES}/GLEW/lib
19   - ${PROJECT_SOURCE_DIR}/src/nvgl/glew/bin
20   - ${PROJECT_SOURCE_DIR}/src/nvgl/glew/lib
21   - DOC "The GLEW library")
22   -ELSE (WIN32)
23   - FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
24   - /usr/include
25   - /usr/local/include
26   - /sw/include
27   - /opt/local/include
28   - DOC "The directory where GL/glew.h resides")
29   - FIND_LIBRARY( GLEW_LIBRARY
30   - NAMES GLEW glew
31   - PATHS
32   - /usr/lib64
33   - /usr/lib
34   - /usr/local/lib64
35   - /usr/local/lib
36   - /sw/lib
37   - /opt/local/lib
38   - DOC "The GLEW library")
39   -ENDIF (WIN32)
40   -
41   -IF (GLEW_INCLUDE_PATH)
42   - SET( GLEW_FOUND 1 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
43   -ELSE (GLEW_INCLUDE_PATH)
44   - SET( GLEW_FOUND 0 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
45   -ENDIF (GLEW_INCLUDE_PATH)
46   -
47   -MARK_AS_ADVANCED(
48   - GLEW_FOUND
49   - GLEW_INCLUDE_PATH
50   - GLEW_LIBRARY
  1 +#
  2 +# Try to find GLEW library and include path.
  3 +# Once done this will define
  4 +#
  5 +# GLEW_FOUND
  6 +# GLEW_INCLUDE_PATH
  7 +# GLEW_LIBRARY
  8 +#
  9 +
  10 +IF (WIN32)
  11 + FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
  12 + $ENV{PROGRAMFILES}/GLEW/include
  13 + ${PROJECT_SOURCE_DIR}/src/nvgl/glew/include
  14 + DOC "The directory where GL/glew.h resides")
  15 + FIND_LIBRARY( GLEW_LIBRARY
  16 + NAMES glew GLEW glew32 glew32s
  17 + PATHS
  18 + $ENV{PROGRAMFILES}/GLEW/lib
  19 + ${PROJECT_SOURCE_DIR}/src/nvgl/glew/bin
  20 + ${PROJECT_SOURCE_DIR}/src/nvgl/glew/lib
  21 + DOC "The GLEW library")
  22 +ELSE (WIN32)
  23 + FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
  24 + /usr/include
  25 + /usr/local/include
  26 + /sw/include
  27 + /opt/local/include
  28 + DOC "The directory where GL/glew.h resides")
  29 + FIND_LIBRARY( GLEW_LIBRARY
  30 + NAMES GLEW glew
  31 + PATHS
  32 + /usr/lib64
  33 + /usr/lib
  34 + /usr/local/lib64
  35 + /usr/local/lib
  36 + /sw/lib
  37 + /opt/local/lib
  38 + DOC "The GLEW library")
  39 +ENDIF (WIN32)
  40 +
  41 +IF (GLEW_INCLUDE_PATH)
  42 + SET( GLEW_FOUND 1 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
  43 +ELSE (GLEW_INCLUDE_PATH)
  44 + SET( GLEW_FOUND 0 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
  45 +ENDIF (GLEW_INCLUDE_PATH)
  46 +
  47 +MARK_AS_ADVANCED(
  48 + GLEW_FOUND
  49 + GLEW_INCLUDE_PATH
  50 + GLEW_LIBRARY
51 51 )
52 52 \ No newline at end of file
... ...
FindRTS.cmake
1   -# Tries to find the RTS include directory
2   -
3   - FIND_PATH( RTS_INCLUDE_DIR NAMES rts_glShaderProgram.h
4   - PATHS
5   - ${CMAKE_CURRENT_SOURCE_DIR}/rts
6   - ${RTS_ROOT_PATH}
7   -)
8   -
9   -IF (RTS_FOUND)
10   - #The following deprecated settings are for backwards compatibility with CMake1.4
11   - SET (RTS_INCLUDE_PATH ${RTS_INCLUDE_DIR})
12   -ENDIF(RTS_FOUND)
13   -
14   -FIND_PACKAGE_HANDLE_STANDARD_ARGS(RTS REQUIRED_VARS TRUE RTS_INCLUDE_DIR)
  1 +# Tries to find the RTS include directory
  2 +
  3 + FIND_PATH( RTS_INCLUDE_DIR NAMES rts_glShaderProgram.h
  4 + PATHS
  5 + ${CMAKE_CURRENT_SOURCE_DIR}/rts
  6 + ${RTS_ROOT_PATH}
  7 +)
  8 +
  9 +IF (RTS_FOUND)
  10 + #The following deprecated settings are for backwards compatibility with CMake1.4
  11 + SET (RTS_INCLUDE_PATH ${RTS_INCLUDE_DIR})
  12 +ENDIF(RTS_FOUND)
  13 +
  14 +FIND_PACKAGE_HANDLE_STANDARD_ARGS(RTS REQUIRED_VARS TRUE RTS_INCLUDE_DIR)
... ...
GAMMA.cpp
1   -// gamma.cpp -- computation of gamma function.
2   -// Algorithms and coefficient values from "Computation of Special
3   -// Functions", Zhang and Jin, John Wiley and Sons, 1996.
4   -//
5   -// (C) 2003, C. Bond. All rights reserved.
6   -//
7   -// Returns gamma function of argument 'x'.
8   -//
9   -// NOTE: Returns 1e308 if argument is a negative integer or 0,
10   -// or if argument exceeds 171.
11   -//
12   -#define _USE_MATH_DEFINES
13   -#include <math.h>
14   -double gamma(double x)
15   -{
16   - int i,k,m;
17   - double ga,gr,r,z;
18   -
19   - static double g[] = {
20   - 1.0,
21   - 0.5772156649015329,
22   - -0.6558780715202538,
23   - -0.420026350340952e-1,
24   - 0.1665386113822915,
25   - -0.421977345555443e-1,
26   - -0.9621971527877e-2,
27   - 0.7218943246663e-2,
28   - -0.11651675918591e-2,
29   - -0.2152416741149e-3,
30   - 0.1280502823882e-3,
31   - -0.201348547807e-4,
32   - -0.12504934821e-5,
33   - 0.1133027232e-5,
34   - -0.2056338417e-6,
35   - 0.6116095e-8,
36   - 0.50020075e-8,
37   - -0.11812746e-8,
38   - 0.1043427e-9,
39   - 0.77823e-11,
40   - -0.36968e-11,
41   - 0.51e-12,
42   - -0.206e-13,
43   - -0.54e-14,
44   - 0.14e-14};
45   -
46   - if (x > 171.0) return 1e308; // This value is an overflow flag.
47   - if (x == (int)x) {
48   - if (x > 0.0) {
49   - ga = 1.0; // use factorial
50   - for (i=2;i<x;i++) {
51   - ga *= i;
52   - }
53   - }
54   - else
55   - ga = 1e308;
56   - }
57   - else {
58   - if (fabs(x) > 1.0) {
59   - z = fabs(x);
60   - m = (int)z;
61   - r = 1.0;
62   - for (k=1;k<=m;k++) {
63   - r *= (z-k);
64   - }
65   - z -= m;
66   - }
67   - else
68   - z = x;
69   - gr = g[24];
70   - for (k=23;k>=0;k--) {
71   - gr = gr*z+g[k];
72   - }
73   - ga = 1.0/(gr*z);
74   - if (fabs(x) > 1.0) {
75   - ga *= r;
76   - if (x < 0.0) {
77   - ga = -M_PI/(x*ga*sin(M_PI*x));
78   - }
79   - }
80   - }
81   - return ga;
82   -}
  1 +// gamma.cpp -- computation of gamma function.
  2 +// Algorithms and coefficient values from "Computation of Special
  3 +// Functions", Zhang and Jin, John Wiley and Sons, 1996.
  4 +//
  5 +// (C) 2003, C. Bond. All rights reserved.
  6 +//
  7 +// Returns gamma function of argument 'x'.
  8 +//
  9 +// NOTE: Returns 1e308 if argument is a negative integer or 0,
  10 +// or if argument exceeds 171.
  11 +//
  12 +#define _USE_MATH_DEFINES
  13 +#include <math.h>
  14 +double gamma(double x)
  15 +{
  16 + int i,k,m;
  17 + double ga,gr,r,z;
  18 +
  19 + static double g[] = {
  20 + 1.0,
  21 + 0.5772156649015329,
  22 + -0.6558780715202538,
  23 + -0.420026350340952e-1,
  24 + 0.1665386113822915,
  25 + -0.421977345555443e-1,
  26 + -0.9621971527877e-2,
  27 + 0.7218943246663e-2,
  28 + -0.11651675918591e-2,
  29 + -0.2152416741149e-3,
  30 + 0.1280502823882e-3,
  31 + -0.201348547807e-4,
  32 + -0.12504934821e-5,
  33 + 0.1133027232e-5,
  34 + -0.2056338417e-6,
  35 + 0.6116095e-8,
  36 + 0.50020075e-8,
  37 + -0.11812746e-8,
  38 + 0.1043427e-9,
  39 + 0.77823e-11,
  40 + -0.36968e-11,
  41 + 0.51e-12,
  42 + -0.206e-13,
  43 + -0.54e-14,
  44 + 0.14e-14};
  45 +
  46 + if (x > 171.0) return 1e308; // This value is an overflow flag.
  47 + if (x == (int)x) {
  48 + if (x > 0.0) {
  49 + ga = 1.0; // use factorial
  50 + for (i=2;i<x;i++) {
  51 + ga *= i;
  52 + }
  53 + }
  54 + else
  55 + ga = 1e308;
  56 + }
  57 + else {
  58 + if (fabs(x) > 1.0) {
  59 + z = fabs(x);
  60 + m = (int)z;
  61 + r = 1.0;
  62 + for (k=1;k<=m;k++) {
  63 + r *= (z-k);
  64 + }
  65 + z -= m;
  66 + }
  67 + else
  68 + z = x;
  69 + gr = g[24];
  70 + for (k=23;k>=0;k--) {
  71 + gr = gr*z+g[k];
  72 + }
  73 + ga = 1.0/(gr*z);
  74 + if (fabs(x) > 1.0) {
  75 + ga *= r;
  76 + if (x < 0.0) {
  77 + ga = -M_PI/(x*ga*sin(M_PI*x));
  78 + }
  79 + }
  80 + }
  81 + return ga;
  82 +}
... ...
PerformanceData.h
1   -// add the following to a cpp file:
2   -// PerformanceData PD;
3   -
4   -
5   -#pragma once
6   -#include <ostream>
7   -using namespace std;
8   -
9   -enum PerformanceDataType
10   -{
11   - PD_DISPLAY=0,
12   - PD_SPS,
13   - PD_UNUSED0,
14   -
15   - //my stuff
16   - SIMULATE_SPECTRUM,
17   - SIMULATE_GPU,
18   - KRAMERS_KRONIG,
19   -
20   -
21   -
22   - //end my stuff
23   - PERFORMANCE_DATA_TYPE_COUNT
24   -};
25   -
26   -static char PDTypeNames[][255] = {
27   - "Display ",
28   - "Simulation Total ",
29   - " ----------------- ",
30   - //my stuff
31   - "Simulate Spectrum ",
32   - " GPU Portion ",
33   - "Kramers-Kronig ",
34   -
35   - //end my stuff
36   -
37   -};
38   -#ifdef WIN32
39   -#include <stdio.h>
40   -#include <windows.h>
41   -#include <float.h>
42   -
43   -#include <iostream>
44   -#include <iomanip>
45   -
46   -//-------------------------------------------------------------------------------
47   -
48   -class PerformanceData
49   -{
50   -public:
51   - PerformanceData() { ClearAll(); QueryPerformanceFrequency(&cps); }
52   - ~PerformanceData(){}
53   -
54   - void ClearAll()
55   - {
56   - for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ ) {
57   - for ( int j=0; j<256; j++ ) times[i][j] = 0;
58   - pos[i] = 0;
59   - minTime[i] = 0xFFFFFFFF;
60   - maxTime[i] = 0;
61   - totalTime[i] = 0;
62   - dataReady[i] = false;
63   - }
64   - }
65   -
66   - void StartTimer( int type ) { QueryPerformanceCounter( &startTime[type] );}
67   - void EndTimer( int type ) {
68   - LARGE_INTEGER endTime;
69   - QueryPerformanceCounter( &endTime );
70   - double t = (double)(endTime.QuadPart - startTime[type].QuadPart);
71   - //unsigned int t = GetTickCount() - startTime[type];
72   - if ( t < minTime[type] ) minTime[type] = t;
73   - if ( t > maxTime[type] ) maxTime[type] = t;
74   - totalTime[type] -= times[type][ pos[type] ];
75   - times[type][ pos[type] ] = t;
76   - totalTime[type] += t;
77   - pos[type]++;
78   - if ( pos[type] == 0 ) dataReady[type] = true;
79   - }
80   -
81   - void PrintResult( ostream &os,int i=PERFORMANCE_DATA_TYPE_COUNT)
82   - {
83   - os.setf(ios::fixed);
84   - if ((i<PERFORMANCE_DATA_TYPE_COUNT)&&(i>=0)){
85   - double a = GetAvrgTime(i);
86   - if ( a )
87   - os<< PDTypeNames[i]<<" : avrg="<<setw(8)<<setprecision(3)<<a<<"\tmin="<<setw(8)<<setprecision(3)<< GetMinTime(i) <<"\tmax="<<setw(8)<<setprecision(3)<< GetMaxTime(i) <<endl ;
88   - else
89   - os<< PDTypeNames[i]<<" : avrg= -----\tmin= -----\tmax= -----"<<endl;
90   - }
91   - }
92   -
93   - void PrintResults( ostream &os)
94   - {
95   - for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ )
96   - PrintResult(os,i);
97   - }
98   -
99   - double GetLastTime( int type ) { return times[type][pos[type]]; }
100   - double GetAvrgTime( int type ) { double a = 1000.0 * totalTime[type] / (float)cps.QuadPart / ( (dataReady[type]) ? 256.0 : (double)pos[type] ); return (_finite(a))? a:0; }
101   - double GetMinTime( int type ) { return 1000.0 * minTime[type] / (float)cps.LowPart; }
102   - double GetMaxTime( int type ) { return 1000.0 * maxTime[type] / (float)cps.LowPart; }
103   -
104   -private:
105   - double times[PERFORMANCE_DATA_TYPE_COUNT][256];
106   - unsigned char pos[PERFORMANCE_DATA_TYPE_COUNT];
107   - LARGE_INTEGER startTime[PERFORMANCE_DATA_TYPE_COUNT];
108   - double minTime[ PERFORMANCE_DATA_TYPE_COUNT ];
109   - double maxTime[ PERFORMANCE_DATA_TYPE_COUNT ];
110   - double totalTime[ PERFORMANCE_DATA_TYPE_COUNT ];
111   - bool dataReady[ PERFORMANCE_DATA_TYPE_COUNT ];
112   - LARGE_INTEGER cps;
113   -};
114   -
115   -//-------------------------------------------------------------------------------
116   -#else
117   -
118   -class PerformanceData{
119   -public:
120   - PerformanceData() {;};
121   - ~PerformanceData(){;};
122   - void ClearAll(){;};
123   - void StartTimer( int type ) {;};
124   - void EndTimer( int type ) {;};
125   - void PrintResults( ostream &os){;};
126   - void PrintResult( ostream &os, int i=PERFORMANCE_DATA_TYPE_COUNT){;};
127   - double GetLastTime( int type ) { return 0.0; };
128   - double GetAvrgTime( int type ) { return 0.0; };
129   - double GetMinTime( int type ) { return 0.0; };
130   - double GetMaxTime( int type ) { return 0.0; };
131   -};
132   -
133   -#endif
134   -//-------------------------------------------------------------------------------
135   -
136   -extern PerformanceData PD;
137   -
138   -//-------------------------------------------------------------------------------
  1 +// add the following to a cpp file:
  2 +// PerformanceData PD;
  3 +
  4 +
  5 +#pragma once
  6 +#include <ostream>
  7 +using namespace std;
  8 +
  9 +enum PerformanceDataType
  10 +{
  11 + PD_DISPLAY=0,
  12 + PD_SPS,
  13 + PD_UNUSED0,
  14 +
  15 + //my stuff
  16 + SIMULATE_SPECTRUM,
  17 + SIMULATE_GPU,
  18 + KRAMERS_KRONIG,
  19 +
  20 +
  21 +
  22 + //end my stuff
  23 + PERFORMANCE_DATA_TYPE_COUNT
  24 +};
  25 +
  26 +static char PDTypeNames[][255] = {
  27 + "Display ",
  28 + "Simulation Total ",
  29 + " ----------------- ",
  30 + //my stuff
  31 + "Simulate Spectrum ",
  32 + " GPU Portion ",
  33 + "Kramers-Kronig ",
  34 +
  35 + //end my stuff
  36 +
  37 +};
  38 +#ifdef WIN32
  39 +#include <stdio.h>
  40 +#include <windows.h>
  41 +#include <float.h>
  42 +
  43 +#include <iostream>
  44 +#include <iomanip>
  45 +
  46 +//-------------------------------------------------------------------------------
  47 +
  48 +class PerformanceData
  49 +{
  50 +public:
  51 + PerformanceData() { ClearAll(); QueryPerformanceFrequency(&cps); }
  52 + ~PerformanceData(){}
  53 +
  54 + void ClearAll()
  55 + {
  56 + for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ ) {
  57 + for ( int j=0; j<256; j++ ) times[i][j] = 0;
  58 + pos[i] = 0;
  59 + minTime[i] = 0xFFFFFFFF;
  60 + maxTime[i] = 0;
  61 + totalTime[i] = 0;
  62 + dataReady[i] = false;
  63 + }
  64 + }
  65 +
  66 + void StartTimer( int type ) { QueryPerformanceCounter( &startTime[type] );}
  67 + void EndTimer( int type ) {
  68 + LARGE_INTEGER endTime;
  69 + QueryPerformanceCounter( &endTime );
  70 + double t = (double)(endTime.QuadPart - startTime[type].QuadPart);
  71 + //unsigned int t = GetTickCount() - startTime[type];
  72 + if ( t < minTime[type] ) minTime[type] = t;
  73 + if ( t > maxTime[type] ) maxTime[type] = t;
  74 + totalTime[type] -= times[type][ pos[type] ];
  75 + times[type][ pos[type] ] = t;
  76 + totalTime[type] += t;
  77 + pos[type]++;
  78 + if ( pos[type] == 0 ) dataReady[type] = true;
  79 + }
  80 +
  81 + void PrintResult( ostream &os,int i=PERFORMANCE_DATA_TYPE_COUNT)
  82 + {
  83 + os.setf(ios::fixed);
  84 + if ((i<PERFORMANCE_DATA_TYPE_COUNT)&&(i>=0)){
  85 + double a = GetAvrgTime(i);
  86 + if ( a )
  87 + os<< PDTypeNames[i]<<" : avrg="<<setw(8)<<setprecision(3)<<a<<"\tmin="<<setw(8)<<setprecision(3)<< GetMinTime(i) <<"\tmax="<<setw(8)<<setprecision(3)<< GetMaxTime(i) <<endl ;
  88 + else
  89 + os<< PDTypeNames[i]<<" : avrg= -----\tmin= -----\tmax= -----"<<endl;
  90 + }
  91 + }
  92 +
  93 + void PrintResults( ostream &os)
  94 + {
  95 + for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ )
  96 + PrintResult(os,i);
  97 + }
  98 +
  99 + double GetLastTime( int type ) { return times[type][pos[type]]; }
  100 + double GetAvrgTime( int type ) { double a = 1000.0 * totalTime[type] / (float)cps.QuadPart / ( (dataReady[type]) ? 256.0 : (double)pos[type] ); return (_finite(a))? a:0; }
  101 + double GetMinTime( int type ) { return 1000.0 * minTime[type] / (float)cps.LowPart; }
  102 + double GetMaxTime( int type ) { return 1000.0 * maxTime[type] / (float)cps.LowPart; }
  103 +
  104 +private:
  105 + double times[PERFORMANCE_DATA_TYPE_COUNT][256];
  106 + unsigned char pos[PERFORMANCE_DATA_TYPE_COUNT];
  107 + LARGE_INTEGER startTime[PERFORMANCE_DATA_TYPE_COUNT];
  108 + double minTime[ PERFORMANCE_DATA_TYPE_COUNT ];
  109 + double maxTime[ PERFORMANCE_DATA_TYPE_COUNT ];
  110 + double totalTime[ PERFORMANCE_DATA_TYPE_COUNT ];
  111 + bool dataReady[ PERFORMANCE_DATA_TYPE_COUNT ];
  112 + LARGE_INTEGER cps;
  113 +};
  114 +
  115 +//-------------------------------------------------------------------------------
  116 +#else
  117 +
  118 +class PerformanceData{
  119 +public:
  120 + PerformanceData() {;};
  121 + ~PerformanceData(){;};
  122 + void ClearAll(){;};
  123 + void StartTimer( int type ) {;};
  124 + void EndTimer( int type ) {;};
  125 + void PrintResults( ostream &os){;};
  126 + void PrintResult( ostream &os, int i=PERFORMANCE_DATA_TYPE_COUNT){;};
  127 + double GetLastTime( int type ) { return 0.0; };
  128 + double GetAvrgTime( int type ) { return 0.0; };
  129 + double GetMinTime( int type ) { return 0.0; };
  130 + double GetMaxTime( int type ) { return 0.0; };
  131 +};
  132 +
  133 +#endif
  134 +//-------------------------------------------------------------------------------
  135 +
  136 +extern PerformanceData PD;
  137 +
  138 +//-------------------------------------------------------------------------------
... ...
1   -I've just added support for double-precision values. This allows simulation of extremely small (nano-scale) particles, however a GPU with a compute capability of at least 1.3 is required.
2   -
3   -TrueEyes requires the following libraries:
4   -
5   -GLUT (OpenGL Utility Toolkit) http://www.opengl.org/resources/libraries/glut/
6   -GLEW (OpenGL Extension Wrangler) http://glew.sourceforge.net/
7   -Qt http://qt-project.org/
8   -RTS (my personal codebase) https://github.com/dmayerich/RTS
9   -CUDA http://www.nvidia.com/object/cuda_home_new.html
10   -
  1 +I've just added support for double-precision values. This allows simulation of extremely small (nano-scale) particles, however a GPU with a compute capability of at least 1.3 is required.
  2 +
  3 +TrueEyes requires the following libraries:
  4 +
  5 +GLUT (OpenGL Utility Toolkit) http://www.opengl.org/resources/libraries/glut/
  6 +GLEW (OpenGL Extension Wrangler) http://glew.sourceforge.net/
  7 +Qt http://qt-project.org/
  8 +RTS (my personal codebase) https://github.com/dmayerich/RTS
  9 +CUDA http://www.nvidia.com/object/cuda_home_new.html
  10 +
11 11 If CMake is unable to find these, make sure to specify their locations.
12 12 \ No newline at end of file
... ...
SimulateSpectrum.cpp
1   -#include <math.h>
2   -#include <complex>
3   -#include <iostream>
4   -#include <fstream>
5   -#include "globals.h"
6   -#include <stdlib.h>
7   -//#include "cufft.h"
8   -using namespace std;
9   -
10   -#define pi 3.14159
11   -
12   -typedef complex<double> scComplex;
13   -
14   -extern int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
15   - complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp);
16   -extern int bessjyv(double v,double x,double &vm,double *jv,double *yv,
17   - double *djv,double *dyv);
18   -
19   -complex<double> Jl_neg(complex<double> x)
20   -{
21   - //this function computes the bessel function of the first kind Jl(x) for l = -0.5
22   - return ( sqrt(2.0/pi) * cos(x) )/sqrt(x);
23   -}
24   -
25   -double Jl_neg(double x)
26   -{
27   - //this function computes the bessel function of the first kind Jl(x) for l = -0.5
28   - return ( sqrt(2.0/pi) * cos(x) )/sqrt(x);
29   -}
30   -
31   -double Yl_neg(double x)
32   -{
33   - //this function computes the bessel function of the second kind Yl(x) for l = -0.5;
34   - return ( sqrt(2.0/pi) * sin(x) )/sqrt(x);
35   -}
36   -
37   -void computeB(complex<double>* B, double radius, complex<double> refIndex, double lambda, int Nl)
38   -{
39   - double k = (2*pi)/lambda;
40   - int b = 2;
41   -
42   - //allocate space for the real bessel functions
43   - double* jv = (double*)malloc(sizeof(double)*(Nl+b));
44   - double* yv = (double*)malloc(sizeof(double)*(Nl+b));
45   - double* jvp = (double*)malloc(sizeof(double)*(Nl+b));
46   - double* yvp = (double*)malloc(sizeof(double)*(Nl+b));
47   -
48   - //allocate space for the complex bessel functions
49   - complex<double>* cjv = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
50   - complex<double>* cyv = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
51   - complex<double>* cjvp = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
52   - complex<double>* cyvp = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
53   -
54   - double kr = k*radius;
55   - complex<double> knr = k*refIndex*(double)radius;
56   - complex<double> n = refIndex;
57   -
58   - //compute the bessel functions for k*r
59   - double vm;// = Nl - 1;
60   - bessjyv((Nl)+0.5, kr, vm, jv, yv, jvp, yvp);
61   - //cout<<"Nl: "<<Nl<<" vm: "<<vm<<endl;
62   - //printf("Nl: %f, vm: %f\n", (float)Nl, (float)vm);
63   -
64   - //compute the bessel functions for k*n*r
65   - cbessjyva((Nl)+0.5, knr, vm, cjv, cyv, cjvp, cyvp);
66   -
67   - //scale factor for spherical bessel functions
68   - double scale_kr = sqrt(pi/(2.0*kr));
69   - complex<double> scale_knr = sqrt(pi/(2.0*knr));
70   -
71   - complex<double> numer, denom;
72   - double j_kr;
73   - double y_kr;
74   - complex<double> j_knr;
75   - complex<double> j_d_knr;
76   - double j_d_kr;
77   - complex<double> h_kr;
78   - complex<double> h_d_kr;
79   - complex<double> h_neg;
80   - complex<double> h_pos;
81   -
82   - //cout<<"B coefficients:"<<endl;
83   - for(int l=0; l<Nl; l++)
84   - {
85   - //compute the spherical bessel functions
86   - j_kr = jv[l] * scale_kr;
87   - y_kr = yv[l] * scale_kr;
88   - j_knr = cjv[l] * scale_knr;
89   -
90   - //compute the Hankel function
91   - h_kr = complex<double>(j_kr, y_kr);
92   -
93   - //compute the derivatives
94   - if(l == 0)
95   - {
96   - //spherical bessel functions for l=0
97   - j_d_kr = scale_kr * (Jl_neg(kr) - (jv[l] + kr*jv[l+1])/kr )/2.0;
98   - j_d_knr = scale_knr * ( Jl_neg(knr) - (cjv[l] + knr*cjv[l+1])/knr )/2.0;
99   - h_neg = complex<double>(scale_kr*Jl_neg(kr), scale_kr*Yl_neg(kr));
100   - h_pos = complex<double>(scale_kr*jv[l+1], scale_kr*yv[l+1]);
101   - h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0;
102   - }
103   - else
104   - {
105   - //spherical bessel functions
106   - j_d_kr = scale_kr * (jv[l-1] - (jv[l] + kr*jv[l+1])/kr )/2.0;
107   - j_d_knr = scale_knr * ( cjv[l-1] - (cjv[l] + knr*cjv[l+1])/knr )/2.0;
108   - h_neg = complex<double>(scale_kr*jv[l-1], scale_kr*yv[l-1]);
109   - h_pos = complex<double>(scale_kr*jv[l+1], scale_kr*yv[l+1]);
110   - h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0;
111   - }
112   -
113   - numer = j_kr*j_d_knr*n - j_knr*j_d_kr;
114   - denom = j_knr*h_d_kr - h_kr*j_d_knr*n;
115   - B[l] = numer/denom;
116   -
117   - //B[l] = scComplex(temp.real(), temp.imag());
118   - //cout<<B[l]<<endl;
119   - }
120   -
121   - free(jv);
122   - free(yv);
123   - free(jvp);
124   - free(yvp);
125   - free(cjv);
126   - free(cyv);
127   - free(cjvp);
128   - free(cyvp);
129   -}
130   -
131   -void Legendre(double* P, double x, int Nl)
132   -{
133   - //computes the legendre polynomials from orders 0 to Nl-1
134   - P[0] = 1;
135   - if(Nl == 1) return;
136   - P[1] = x;
137   - for(int l = 2; l < Nl; l++)
138   - {
139   - P[l] = ((2*l - 1)*x*P[l-1] - (l - 1)*P[l-2])/l;
140   - }
141   -
142   -}
143   -
144   -complex<double> integrateUi(double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi)
145   -{
146   - /*This function integrates the incident field of magnitude M in the far zone
147   - in order to evaluate the field at the central pixel of a detector.
148   - cNAi = condenser inner angle
149   - cNAo = condenser outer angle
150   - oNAi = objective inner angle
151   - oNAo = objective outer angle
152   - M = field magnitude*/
153   -
154   - double alphaIn = max(cAngleI, oAngleI);
155   - double alphaOut = min(cAngleO,oAngleO);
156   -
157   - complex<double> Ui;
158   - if(alphaIn > alphaOut)
159   - Ui = complex<double>(0.0, 0.0);
160   - else
161   - Ui = complex<double>(M * 2 * pi * (cos(alphaIn) - cos(alphaOut)), 0.0f);
162   -
163   - return Ui;
164   -
165   -}
166   -
167   -void computeCondenserAlpha(double* alpha, int Nl, double cAngleI, double cAngleO)
168   -{
169   - /*This function computes the condenser integral in order to build the field of incident light
170   - alpha = list of Nl floating point values representing the condenser alpha as a function of l
171   - Nl = number of orders in the incident field
172   - cAngleI, cAngleO = inner and outer condenser angles (inner and outer NA)*/
173   -
174   - //compute the Legendre polynomials for the condenser aperature
175   - double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1));
176   - Legendre(PcNAo, cos(cAngleO), Nl+1);
177   - double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1));
178   - Legendre(PcNAi, cos(cAngleI), Nl+1);
179   -
180   - for(int l=0; l<Nl; l++)
181   - {
182   - //integration term
183   - if(l == 0)
184   - alpha[l] = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
185   - else
186   - alpha[l] = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
187   -
188   - alpha[l] *= 2 * pi;
189   - }
190   -
191   -}
192   -
193   -complex<double> integrateUs(double r, double lambda, complex<double> eta,
194   - double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi)
195   -{
196   - /*This function integrates the incident field of magnitude M in the far zone
197   - in order to evaluate the field at the central pixel of a detector.
198   - r = sphere radius
199   - lambda = wavelength
200   - eta = index of refraction
201   - cNAi = condenser inner NA
202   - cNAo = condenser outer NA
203   - oNAi = objective inner NA
204   - oNAo = objective outer NA
205   - M = field magnitude*/
206   -
207   - //compute the required number of orders
208   - double k = 2*pi/lambda;
209   - int Nl = (int)ceil( k + 4 * exp(log(k*r)/3) + 3 );
210   -
211   - //compute the material coefficients B
212   - complex<double>* B = (complex<double>*)malloc(sizeof(complex<double>)*Nl);
213   - //compute the Legendre polynomials for the condenser and objective aperatures
214   - double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1));
215   - Legendre(PcNAo, cos(cAngleO), Nl+1);
216   - double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1));
217   - Legendre(PcNAi, cos(cAngleI), Nl+1);
218   -
219   - double* PoNAo = (double*)malloc(sizeof(double)*(Nl+1));
220   - Legendre(PoNAo, cos(oAngleO), Nl+1);
221   - double* PoNAi = (double*)malloc(sizeof(double)*(Nl+1));
222   - Legendre(PoNAi, cos(oAngleI), Nl+1);
223   -
224   - //store the index of refraction;
225   - complex<double> IR(eta.real(), eta.imag());
226   -
227   - //compute the scattering coefficients
228   - computeB(B, r, IR, lambda, Nl);
229   -
230   - //aperature terms for the condenser (alpha) and objective (beta)
231   - double alpha;
232   - double beta;
233   - double c;
234   - complex<double> Us(0.0, 0.0);
235   -
236   - for(int l=0; l<Nl; l++)
237   - {
238   - //integration term
239   - if(l == 0)
240   - {
241   - alpha = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
242   - beta = -PoNAo[l+1] + PoNAo[0] + PoNAi[l+1] - PoNAi[0];
243   - }
244   - else
245   - {
246   - alpha = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
247   - beta = -PoNAo[l+1] + PoNAo[l-1] + PoNAi[l+1] - PoNAi[l-1];
248   - }
249   - c = (2*pi)/(2.0 * l + 1.0);
250   - Us += c * alpha * beta * B[l] * M;
251   -
252   -
253   - }
254   - free(PcNAo);
255   - free(PcNAi);
256   - free(PoNAo);
257   - free(PoNAi);
258   - free(B);
259   -
260   - return Us;
261   -
262   -}
263   -
264   -void pointSpectrum()
265   -{
266   - PD.StartTimer(SIMULATE_SPECTRUM);
267   - //clear the previous spectrum
268   - SimSpectrum.clear();
269   -
270   - double dNu = 2.0f;
271   - double lambda;
272   -
273   - //compute the angles based on NA
274   - double cAngleI = asin(cNAi);
275   - double cAngleO = asin(cNAo);
276   - double oAngleI = asin(oNAi);
277   - double oAngleO = asin(oNAo);
278   -
279   - //implement a reflection-mode system if necessary
280   - if(opticsMode == ReflectionOpticsType){
281   -
282   - //set the condenser to match the objective
283   - cAngleI = oAngleI;
284   - cAngleO = oAngleO;
285   -
286   - //invert the objective
287   - oAngleO = pi - cAngleI;
288   - oAngleI = pi - cAngleO;
289   - }
290   -
291   - //integrate the incident field at the detector position
292   - complex<double> Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
293   - double I0 = Ui.real() * Ui.real() + Ui.imag() * Ui.imag();
294   - I0 *= scaleI0;
295   -
296   -
297   -
298   - //double I;
299   - SpecPair temp;
300   - double nu;
301   - complex<double> eta;
302   - complex<double> Us, U;
303   -
304   - double vecLen = 0.0;
305   - for(unsigned int i=0; i<EtaK.size(); i++)
306   - {
307   - nu = EtaK[i].nu;
308   - lambda = 10000.0f/nu;
309   - if(applyMaterial)
310   - eta = complex<double>(EtaN[i].A, EtaK[i].A);
311   - else
312   - eta = complex<double>(baseIR, 0.0);
313   -
314   -
315   - //integrate the scattered field at the detector position
316   - Us = integrateUs(radius, lambda, eta, cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
317   - U = Us + Ui;
318   - double I = U.real() * U.real() + U.imag() * U.imag();
319   -
320   - temp.nu = nu;
321   -
322   - //set the spectrum value based on the current display type
323   - if(dispSimType == AbsorbanceSpecType)
324   - temp.A = -log10(I/I0);
325   - else
326   - temp.A = I;
327   -
328   - if(dispNormalize)
329   - vecLen += temp.A * temp.A;
330   -
331   - SimSpectrum.push_back(temp);
332   - }
333   - vecLen = sqrt(vecLen);
334   -
335   - if(dispNormalize)
336   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
337   - SimSpectrum[i].A = (SimSpectrum[i].A / vecLen) * dispNormFactor;
338   -
339   - PD.EndTimer(SIMULATE_SPECTRUM);
340   -}
341   -
342   -void updateSpectrum(double* I, double I0, int n)
343   -{
344   - SimSpectrum.clear();
345   - SpecPair temp;
346   -
347   - //update the displayed spectrum based on the computed intensity I
348   - for(int i=0; i<n; i++)
349   - {
350   - temp.nu = EtaK[i].nu;
351   -
352   - //set the spectrum value based on the current display type
353   - if(dispSimType == AbsorbanceSpecType)
354   - temp.A = -log10(I[i]/I0);
355   - else
356   - temp.A = I[i];
357   -
358   - SimSpectrum.push_back(temp);
359   - }
360   -}
361   -
362   -void computeCassegrainAngles(double& cAngleI, double& cAngleO, double& oAngleI, double& oAngleO)
363   -{
364   - //compute the angles based on NA
365   - cAngleI = asin(cNAi);
366   - cAngleO = asin(cNAo);
367   - oAngleI = asin(oNAi);
368   - oAngleO = asin(oNAo);
369   -
370   - //implement a reflection-mode system if necessary
371   - if(opticsMode == ReflectionOpticsType){
372   -
373   - //set the condenser to match the objective
374   - cAngleI = oAngleI;
375   - cAngleO = oAngleO;
376   -
377   - //invert the objective
378   - oAngleO = pi - cAngleI;
379   - oAngleI = pi - cAngleO;
380   - }
381   -
382   -
383   -}
384   -
385   -int computeNl()
386   -{
387   - double maxNu = EtaK.back().nu;
388   - double maxLambda = 10000.0f/maxNu;
389   - double k = 2*pi/maxLambda;
390   - int Nl = (int)ceil( k + 4 * exp(log(k*radius)/3) + 3 );
391   -
392   - return Nl;
393   -}
394   -
395   -void computeBArray(complex<double>* B, int Nl, int nLambda)
396   -{
397   - double nu;
398   - complex<double> eta;
399   - double* Lambda = (double*)malloc(sizeof(double) * nLambda);
400   -
401   - //for each wavenumber nu
402   - for(unsigned int i=0; i<EtaK.size(); i++)
403   - {
404   - //compute information based on wavelength and material
405   - nu = EtaK[i].nu;
406   - Lambda[i] = 10000.0f/nu;
407   - if(applyMaterial)
408   - eta = complex<double>(EtaN[i].A, EtaK[i].A);
409   - else
410   - eta = complex<double>(baseIR, 0.0);
411   -
412   - //allocate memory for the scattering coefficients
413   - //complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>)*Nl);
414   -
415   - complex<double> IR(eta.real(), eta.imag());
416   - computeB(&B[i * Nl], radius, IR, Lambda[i], Nl);
417   - }
418   -}
419   -
420   -void computeOpticalParameters(double& cAngleI, double& cAngleO, double& oAngleI, double& oAngleO, double& I0, double* alpha, int Nl)
421   -{
422   - computeCassegrainAngles(cAngleI, cAngleO, oAngleI, oAngleO);
423   -
424   - //evaluate the incident field intensity
425   - I0 = 0.0;
426   - complex<double> Ui;
427   -
428   - Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
429   - I0 = Ui.real()*2*pi;
430   -
431   - //compute alpha (condenser integral)
432   - computeCondenserAlpha(alpha, Nl, cAngleI, cAngleO);
433   -}
434   -
435   -void gpuDetectorSpectrum(int numSamples)
436   -{
437   - //integrate across the objective aperature and calculate the resulting intensity on a detector
438   - PD.StartTimer(SIMULATE_SPECTRUM);
439   - //clear the previous spectrum
440   - SimSpectrum.clear();
441   -
442   - //compute Nl (maximum order of the spectrum)
443   - int Nl = computeNl();
444   -
445   - double* alpha = (double*)malloc(sizeof(double)*(Nl + 1));
446   - double cAngleI, cAngleO, oAngleI, oAngleO, I0;
447   - computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl);
448   -
449   - //allocate space for a list of wavelengths
450   - int nLambda = EtaK.size();
451   -
452   - //allocate space for the 2D array (Nl x nu) of scattering coefficients
453   - complex<double>* B = (complex<double>*)malloc(sizeof(complex<double>) * Nl * nLambda);
454   - computeBArray(B, Nl, nLambda);
455   -
456   -
457   - //allocate temporary space for the spectrum
458   - double* I = (double*)malloc(sizeof(double) * EtaK.size());
459   -
460   - //compute the spectrum on the GPU
461   - PD.StartTimer(SIMULATE_GPU);
462   - cudaComputeSpectrum(I, (double*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, numSamples);
463   - PD.EndTimer(SIMULATE_GPU);
464   -
465   - updateSpectrum(I, I0, nLambda);
466   -
467   - PD.EndTimer(SIMULATE_SPECTRUM);
468   -
469   -}
470   -
471   -void SimulateSpectrum()
472   -{
473   - if(pointDetector)
474   - pointSpectrum();
475   - else
476   - gpuDetectorSpectrum(objectiveSamples);
477   - //detectorSpectrum(objectiveSamples);
478   -}
479   -
480   -double absorbanceDistortion(){
481   -
482   - //compute the mean of the spectrum
483   - double sumSim = 0.0;
484   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
485   - {
486   - sumSim += SimSpectrum[i].A;
487   - }
488   - double meanSim = sumSim/SimSpectrum.size();
489   -
490   - //compute the distortion (MSE from the mean)
491   - double sumSE = 0.0;
492   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
493   - {
494   - sumSE += pow(SimSpectrum[i].A - meanSim, 2);
495   - }
496   - double MSE = sumSE / SimSpectrum.size();
497   -
498   - return MSE;
499   -}
500   -
501   -double intensityDistortion(){
502   -
503   - //compute the magnitude of the spectrum
504   - double sumSim = 0.0;
505   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
506   - {
507   - sumSim += SimSpectrum[i].A * SimSpectrum[i].A;
508   - }
509   - double magSim = sqrt(sumSim);
510   -
511   - //compute the distortion (MSE from the mean)
512   - double sumSE = 0.0;
513   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
514   - {
515   - sumSE += (SimSpectrum[i].A/magSim) * (1.0/SimSpectrum.size());
516   - }
517   - double MSE = sumSE;
518   -
519   - return MSE;
520   -}
521   -
522   -void MinimizeDistortion(){
523   - ofstream outFile("distortion.txt");
524   -
525   - //set the parameters for the distortion simulation
526   - double step = 0.001;
527   -
528   - oNAi = 0.2;
529   - oNAo = 0.5;
530   -
531   - //compute the optical parameters
532   - //compute Nl (maximum order of the spectrum)
533   - int Nl = computeNl();
534   -
535   - double* alpha = (double*)malloc(sizeof(double)*(Nl + 1));
536   - double cAngleI, cAngleO, oAngleI, oAngleO, I0;
537   -
538   - //allocate space for a list of wavelengths
539   - int nLambda = EtaK.size();
540   -
541   - //allocate temporary space for the spectrum
542   - double* I = (double*)malloc(sizeof(double) * EtaK.size());
543   -
544   - //calculate the material parameters
545   - //allocate space for the 2D array (Nl x nu) of scattering coefficients
546   - complex<double>* B = (complex<double>*)malloc(sizeof(complex<double>) * Nl * nLambda);
547   - computeBArray(B, Nl, nLambda);
548   -
549   -
550   -
551   - double D;
552   - double e = 0.001;
553   - for(double i=0.0; i<=oNAo-step; i+=step)
554   - {
555   -
556   - for(double o=oNAi+step; o<=1.0; o+=step)
557   - {
558   -
559   -
560   - //set the current optical parameters
561   - cNAi = i;
562   - cNAo = o;
563   -
564   - //compute the optical parameters
565   - computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl);
566   -
567   - //simulate the spectrum
568   - cudaComputeSpectrum(I, (double*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, objectiveSamples);
569   - updateSpectrum(I, I0, nLambda);
570   -
571   - if(dispSimType == AbsorbanceSpecType)
572   - {
573   - if(i + e >= o || i + e >= oNAo || oNAi + e >= o || oNAi + e >= oNAo)
574   - D = 0.0;
575   - else
576   - D = absorbanceDistortion();
577   - }
578   - else
579   - {
580   - if(i >= o || oNAi >= oNAo)
581   - D=0;
582   - else
583   - D = intensityDistortion();
584   - }
585   - outFile<<D<<" ";
586   - }
587   - outFile<<endl;
588   - cout<<i<<endl;
589   - }
590   - outFile.close();
  1 +#include <math.h>
  2 +#include <complex>
  3 +#include <iostream>
  4 +#include <fstream>
  5 +#include "globals.h"
  6 +#include <stdlib.h>
  7 +//#include "cufft.h"
  8 +using namespace std;
  9 +
  10 +#define pi 3.14159
  11 +
  12 +typedef complex<double> scComplex;
  13 +
  14 +extern int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
  15 + complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp);
  16 +extern int bessjyv(double v,double x,double &vm,double *jv,double *yv,
  17 + double *djv,double *dyv);
  18 +
  19 +complex<double> Jl_neg(complex<double> x)
  20 +{
  21 + //this function computes the bessel function of the first kind Jl(x) for l = -0.5
  22 + return ( sqrt(2.0/pi) * cos(x) )/sqrt(x);
  23 +}
  24 +
  25 +double Jl_neg(double x)
  26 +{
  27 + //this function computes the bessel function of the first kind Jl(x) for l = -0.5
  28 + return ( sqrt(2.0/pi) * cos(x) )/sqrt(x);
  29 +}
  30 +
  31 +double Yl_neg(double x)
  32 +{
  33 + //this function computes the bessel function of the second kind Yl(x) for l = -0.5;
  34 + return ( sqrt(2.0/pi) * sin(x) )/sqrt(x);
  35 +}
  36 +
  37 +void computeB(complex<double>* B, double radius, complex<double> refIndex, double lambda, int Nl)
  38 +{
  39 + double k = (2*pi)/lambda;
  40 + int b = 2;
  41 +
  42 + //allocate space for the real bessel functions
  43 + double* jv = (double*)malloc(sizeof(double)*(Nl+b));
  44 + double* yv = (double*)malloc(sizeof(double)*(Nl+b));
  45 + double* jvp = (double*)malloc(sizeof(double)*(Nl+b));
  46 + double* yvp = (double*)malloc(sizeof(double)*(Nl+b));
  47 +
  48 + //allocate space for the complex bessel functions
  49 + complex<double>* cjv = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  50 + complex<double>* cyv = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  51 + complex<double>* cjvp = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  52 + complex<double>* cyvp = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  53 +
  54 + double kr = k*radius;
  55 + complex<double> knr = k*refIndex*(double)radius;
  56 + complex<double> n = refIndex;
  57 +
  58 + //compute the bessel functions for k*r
  59 + double vm;// = Nl - 1;
  60 + bessjyv((Nl)+0.5, kr, vm, jv, yv, jvp, yvp);
  61 + //cout<<"Nl: "<<Nl<<" vm: "<<vm<<endl;
  62 + //printf("Nl: %f, vm: %f\n", (float)Nl, (float)vm);
  63 +
  64 + //compute the bessel functions for k*n*r
  65 + cbessjyva((Nl)+0.5, knr, vm, cjv, cyv, cjvp, cyvp);
  66 +
  67 + //scale factor for spherical bessel functions
  68 + double scale_kr = sqrt(pi/(2.0*kr));
  69 + complex<double> scale_knr = sqrt(pi/(2.0*knr));
  70 +
  71 + complex<double> numer, denom;
  72 + double j_kr;
  73 + double y_kr;
  74 + complex<double> j_knr;
  75 + complex<double> j_d_knr;
  76 + double j_d_kr;
  77 + complex<double> h_kr;
  78 + complex<double> h_d_kr;
  79 + complex<double> h_neg;
  80 + complex<double> h_pos;
  81 +
  82 + //cout<<"B coefficients:"<<endl;
  83 + for(int l=0; l<Nl; l++)
  84 + {
  85 + //compute the spherical bessel functions
  86 + j_kr = jv[l] * scale_kr;
  87 + y_kr = yv[l] * scale_kr;
  88 + j_knr = cjv[l] * scale_knr;
  89 +
  90 + //compute the Hankel function
  91 + h_kr = complex<double>(j_kr, y_kr);
  92 +
  93 + //compute the derivatives
  94 + if(l == 0)
  95 + {
  96 + //spherical bessel functions for l=0
  97 + j_d_kr = scale_kr * (Jl_neg(kr) - (jv[l] + kr*jv[l+1])/kr )/2.0;
  98 + j_d_knr = scale_knr * ( Jl_neg(knr) - (cjv[l] + knr*cjv[l+1])/knr )/2.0;
  99 + h_neg = complex<double>(scale_kr*Jl_neg(kr), scale_kr*Yl_neg(kr));
  100 + h_pos = complex<double>(scale_kr*jv[l+1], scale_kr*yv[l+1]);
  101 + h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0;
  102 + }
  103 + else
  104 + {
  105 + //spherical bessel functions
  106 + j_d_kr = scale_kr * (jv[l-1] - (jv[l] + kr*jv[l+1])/kr )/2.0;
  107 + j_d_knr = scale_knr * ( cjv[l-1] - (cjv[l] + knr*cjv[l+1])/knr )/2.0;
  108 + h_neg = complex<double>(scale_kr*jv[l-1], scale_kr*yv[l-1]);
  109 + h_pos = complex<double>(scale_kr*jv[l+1], scale_kr*yv[l+1]);
  110 + h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0;
  111 + }
  112 +
  113 + numer = j_kr*j_d_knr*n - j_knr*j_d_kr;
  114 + denom = j_knr*h_d_kr - h_kr*j_d_knr*n;
  115 + B[l] = numer/denom;
  116 +
  117 + //B[l] = scComplex(temp.real(), temp.imag());
  118 + //cout<<B[l]<<endl;
  119 + }
  120 +
  121 + free(jv);
  122 + free(yv);
  123 + free(jvp);
  124 + free(yvp);
  125 + free(cjv);
  126 + free(cyv);
  127 + free(cjvp);
  128 + free(cyvp);
  129 +}
  130 +
  131 +void Legendre(double* P, double x, int Nl)
  132 +{
  133 + //computes the legendre polynomials from orders 0 to Nl-1
  134 + P[0] = 1;
  135 + if(Nl == 1) return;
  136 + P[1] = x;
  137 + for(int l = 2; l < Nl; l++)
  138 + {
  139 + P[l] = ((2*l - 1)*x*P[l-1] - (l - 1)*P[l-2])/l;
  140 + }
  141 +
  142 +}
  143 +
  144 +complex<double> integrateUi(double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi)
  145 +{
  146 + /*This function integrates the incident field of magnitude M in the far zone
  147 + in order to evaluate the field at the central pixel of a detector.
  148 + cNAi = condenser inner angle
  149 + cNAo = condenser outer angle
  150 + oNAi = objective inner angle
  151 + oNAo = objective outer angle
  152 + M = field magnitude*/
  153 +
  154 + double alphaIn = max(cAngleI, oAngleI);
  155 + double alphaOut = min(cAngleO,oAngleO);
  156 +
  157 + complex<double> Ui;
  158 + if(alphaIn > alphaOut)
  159 + Ui = complex<double>(0.0, 0.0);
  160 + else
  161 + Ui = complex<double>(M * 2 * pi * (cos(alphaIn) - cos(alphaOut)), 0.0f);
  162 +
  163 + return Ui;
  164 +
  165 +}
  166 +
  167 +void computeCondenserAlpha(double* alpha, int Nl, double cAngleI, double cAngleO)
  168 +{
  169 + /*This function computes the condenser integral in order to build the field of incident light
  170 + alpha = list of Nl floating point values representing the condenser alpha as a function of l
  171 + Nl = number of orders in the incident field
  172 + cAngleI, cAngleO = inner and outer condenser angles (inner and outer NA)*/
  173 +
  174 + //compute the Legendre polynomials for the condenser aperature
  175 + double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1));
  176 + Legendre(PcNAo, cos(cAngleO), Nl+1);
  177 + double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1));
  178 + Legendre(PcNAi, cos(cAngleI), Nl+1);
  179 +
  180 + for(int l=0; l<Nl; l++)
  181 + {
  182 + //integration term
  183 + if(l == 0)
  184 + alpha[l] = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
  185 + else
  186 + alpha[l] = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
  187 +
  188 + alpha[l] *= 2 * pi;
  189 + }
  190 +
  191 +}
  192 +
  193 +complex<double> integrateUs(double r, double lambda, complex<double> eta,
  194 + double cAngleI, double cAngleO, double oAngleI, double oAngleO, double M = 2*pi)
  195 +{
  196 + /*This function integrates the incident field of magnitude M in the far zone
  197 + in order to evaluate the field at the central pixel of a detector.
  198 + r = sphere radius
  199 + lambda = wavelength
  200 + eta = index of refraction
  201 + cNAi = condenser inner NA
  202 + cNAo = condenser outer NA
  203 + oNAi = objective inner NA
  204 + oNAo = objective outer NA
  205 + M = field magnitude*/
  206 +
  207 + //compute the required number of orders
  208 + double k = 2*pi/lambda;
  209 + int Nl = (int)ceil( k + 4 * exp(log(k*r)/3) + 3 );
  210 +
  211 + //compute the material coefficients B
  212 + complex<double>* B = (complex<double>*)malloc(sizeof(complex<double>)*Nl);
  213 + //compute the Legendre polynomials for the condenser and objective aperatures
  214 + double* PcNAo = (double*)malloc(sizeof(double)*(Nl+1));
  215 + Legendre(PcNAo, cos(cAngleO), Nl+1);
  216 + double* PcNAi = (double*)malloc(sizeof(double)*(Nl+1));
  217 + Legendre(PcNAi, cos(cAngleI), Nl+1);
  218 +
  219 + double* PoNAo = (double*)malloc(sizeof(double)*(Nl+1));
  220 + Legendre(PoNAo, cos(oAngleO), Nl+1);
  221 + double* PoNAi = (double*)malloc(sizeof(double)*(Nl+1));
  222 + Legendre(PoNAi, cos(oAngleI), Nl+1);
  223 +
  224 + //store the index of refraction;
  225 + complex<double> IR(eta.real(), eta.imag());
  226 +
  227 + //compute the scattering coefficients
  228 + computeB(B, r, IR, lambda, Nl);
  229 +
  230 + //aperature terms for the condenser (alpha) and objective (beta)
  231 + double alpha;
  232 + double beta;
  233 + double c;
  234 + complex<double> Us(0.0, 0.0);
  235 +
  236 + for(int l=0; l<Nl; l++)
  237 + {
  238 + //integration term
  239 + if(l == 0)
  240 + {
  241 + alpha = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
  242 + beta = -PoNAo[l+1] + PoNAo[0] + PoNAi[l+1] - PoNAi[0];
  243 + }
  244 + else
  245 + {
  246 + alpha = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
  247 + beta = -PoNAo[l+1] + PoNAo[l-1] + PoNAi[l+1] - PoNAi[l-1];
  248 + }
  249 + c = (2*pi)/(2.0 * l + 1.0);
  250 + Us += c * alpha * beta * B[l] * M;
  251 +
  252 +
  253 + }
  254 + free(PcNAo);
  255 + free(PcNAi);
  256 + free(PoNAo);
  257 + free(PoNAi);
  258 + free(B);
  259 +
  260 + return Us;
  261 +
  262 +}
  263 +
  264 +void pointSpectrum()
  265 +{
  266 + PD.StartTimer(SIMULATE_SPECTRUM);
  267 + //clear the previous spectrum
  268 + SimSpectrum.clear();
  269 +
  270 + double dNu = 2.0f;
  271 + double lambda;
  272 +
  273 + //compute the angles based on NA
  274 + double cAngleI = asin(cNAi);
  275 + double cAngleO = asin(cNAo);
  276 + double oAngleI = asin(oNAi);
  277 + double oAngleO = asin(oNAo);
  278 +
  279 + //implement a reflection-mode system if necessary
  280 + if(opticsMode == ReflectionOpticsType){
  281 +
  282 + //set the condenser to match the objective
  283 + cAngleI = oAngleI;
  284 + cAngleO = oAngleO;
  285 +
  286 + //invert the objective
  287 + oAngleO = pi - cAngleI;
  288 + oAngleI = pi - cAngleO;
  289 + }
  290 +
  291 + //integrate the incident field at the detector position
  292 + complex<double> Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  293 + double I0 = Ui.real() * Ui.real() + Ui.imag() * Ui.imag();
  294 + I0 *= scaleI0;
  295 +
  296 +
  297 +
  298 + //double I;
  299 + SpecPair temp;
  300 + double nu;
  301 + complex<double> eta;
  302 + complex<double> Us, U;
  303 +
  304 + double vecLen = 0.0;
  305 + for(unsigned int i=0; i<EtaK.size(); i++)
  306 + {
  307 + nu = EtaK[i].nu;
  308 + lambda = 10000.0f/nu;
  309 + if(applyMaterial)
  310 + eta = complex<double>(EtaN[i].A, EtaK[i].A);
  311 + else
  312 + eta = complex<double>(baseIR, 0.0);
  313 +
  314 +
  315 + //integrate the scattered field at the detector position
  316 + Us = integrateUs(radius, lambda, eta, cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  317 + U = Us + Ui;
  318 + double I = U.real() * U.real() + U.imag() * U.imag();
  319 +
  320 + temp.nu = nu;
  321 +
  322 + //set the spectrum value based on the current display type
  323 + if(dispSimType == AbsorbanceSpecType)
  324 + temp.A = -log10(I/I0);
  325 + else
  326 + temp.A = I;
  327 +
  328 + if(dispNormalize)
  329 + vecLen += temp.A * temp.A;
  330 +
  331 + SimSpectrum.push_back(temp);
  332 + }
  333 + vecLen = sqrt(vecLen);
  334 +
  335 + if(dispNormalize)
  336 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  337 + SimSpectrum[i].A = (SimSpectrum[i].A / vecLen) * dispNormFactor;
  338 +
  339 + PD.EndTimer(SIMULATE_SPECTRUM);
  340 +}
  341 +
  342 +void updateSpectrum(double* I, double I0, int n)
  343 +{
  344 + SimSpectrum.clear();
  345 + SpecPair temp;
  346 +
  347 + //update the displayed spectrum based on the computed intensity I
  348 + for(int i=0; i<n; i++)
  349 + {
  350 + temp.nu = EtaK[i].nu;
  351 +
  352 + //set the spectrum value based on the current display type
  353 + if(dispSimType == AbsorbanceSpecType)
  354 + temp.A = -log10(I[i]/I0);
  355 + else
  356 + temp.A = I[i];
  357 +
  358 + SimSpectrum.push_back(temp);
  359 + }
  360 +}
  361 +
  362 +void computeCassegrainAngles(double& cAngleI, double& cAngleO, double& oAngleI, double& oAngleO)
  363 +{
  364 + //compute the angles based on NA
  365 + cAngleI = asin(cNAi);
  366 + cAngleO = asin(cNAo);
  367 + oAngleI = asin(oNAi);
  368 + oAngleO = asin(oNAo);
  369 +
  370 + //implement a reflection-mode system if necessary
  371 + if(opticsMode == ReflectionOpticsType){
  372 +
  373 + //set the condenser to match the objective
  374 + cAngleI = oAngleI;
  375 + cAngleO = oAngleO;
  376 +
  377 + //invert the objective
  378 + oAngleO = pi - cAngleI;
  379 + oAngleI = pi - cAngleO;
  380 + }
  381 +
  382 +
  383 +}
  384 +
  385 +int computeNl()
  386 +{
  387 + double maxNu = EtaK.back().nu;
  388 + double maxLambda = 10000.0f/maxNu;
  389 + double k = 2*pi/maxLambda;
  390 + int Nl = (int)ceil( k + 4 * exp(log(k*radius)/3) + 3 );
  391 +
  392 + return Nl;
  393 +}
  394 +
  395 +void computeBArray(complex<double>* B, int Nl, int nLambda)
  396 +{
  397 + double nu;
  398 + complex<double> eta;
  399 + double* Lambda = (double*)malloc(sizeof(double) * nLambda);
  400 +
  401 + //for each wavenumber nu
  402 + for(unsigned int i=0; i<EtaK.size(); i++)
  403 + {
  404 + //compute information based on wavelength and material
  405 + nu = EtaK[i].nu;
  406 + Lambda[i] = 10000.0f/nu;
  407 + if(applyMaterial)
  408 + eta = complex<double>(EtaN[i].A, EtaK[i].A);
  409 + else
  410 + eta = complex<double>(baseIR, 0.0);
  411 +
  412 + //allocate memory for the scattering coefficients
  413 + //complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>)*Nl);
  414 +
  415 + complex<double> IR(eta.real(), eta.imag());
  416 + computeB(&B[i * Nl], radius, IR, Lambda[i], Nl);
  417 + }
  418 +}
  419 +
  420 +void computeOpticalParameters(double& cAngleI, double& cAngleO, double& oAngleI, double& oAngleO, double& I0, double* alpha, int Nl)
  421 +{
  422 + computeCassegrainAngles(cAngleI, cAngleO, oAngleI, oAngleO);
  423 +
  424 + //evaluate the incident field intensity
  425 + I0 = 0.0;
  426 + complex<double> Ui;
  427 +
  428 + Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  429 + I0 = Ui.real()*2*pi;
  430 +
  431 + //compute alpha (condenser integral)
  432 + computeCondenserAlpha(alpha, Nl, cAngleI, cAngleO);
  433 +}
  434 +
  435 +void gpuDetectorSpectrum(int numSamples)
  436 +{
  437 + //integrate across the objective aperature and calculate the resulting intensity on a detector
  438 + PD.StartTimer(SIMULATE_SPECTRUM);
  439 + //clear the previous spectrum
  440 + SimSpectrum.clear();
  441 +
  442 + //compute Nl (maximum order of the spectrum)
  443 + int Nl = computeNl();
  444 +
  445 + double* alpha = (double*)malloc(sizeof(double)*(Nl + 1));
  446 + double cAngleI, cAngleO, oAngleI, oAngleO, I0;
  447 + computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl);
  448 +
  449 + //allocate space for a list of wavelengths
  450 + int nLambda = EtaK.size();
  451 +
  452 + //allocate space for the 2D array (Nl x nu) of scattering coefficients
  453 + complex<double>* B = (complex<double>*)malloc(sizeof(complex<double>) * Nl * nLambda);
  454 + computeBArray(B, Nl, nLambda);
  455 +
  456 +
  457 + //allocate temporary space for the spectrum
  458 + double* I = (double*)malloc(sizeof(double) * EtaK.size());
  459 +
  460 + //compute the spectrum on the GPU
  461 + PD.StartTimer(SIMULATE_GPU);
  462 + cudaComputeSpectrum(I, (double*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, numSamples);
  463 + PD.EndTimer(SIMULATE_GPU);
  464 +
  465 + updateSpectrum(I, I0, nLambda);
  466 +
  467 + PD.EndTimer(SIMULATE_SPECTRUM);
  468 +
  469 +}
  470 +
  471 +void SimulateSpectrum()
  472 +{
  473 + if(pointDetector)
  474 + pointSpectrum();
  475 + else
  476 + gpuDetectorSpectrum(objectiveSamples);
  477 + //detectorSpectrum(objectiveSamples);
  478 +}
  479 +
  480 +double absorbanceDistortion(){
  481 +
  482 + //compute the mean of the spectrum
  483 + double sumSim = 0.0;
  484 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  485 + {
  486 + sumSim += SimSpectrum[i].A;
  487 + }
  488 + double meanSim = sumSim/SimSpectrum.size();
  489 +
  490 + //compute the distortion (MSE from the mean)
  491 + double sumSE = 0.0;
  492 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  493 + {
  494 + sumSE += pow(SimSpectrum[i].A - meanSim, 2);
  495 + }
  496 + double MSE = sumSE / SimSpectrum.size();
  497 +
  498 + return MSE;
  499 +}
  500 +
  501 +double intensityDistortion(){
  502 +
  503 + //compute the magnitude of the spectrum
  504 + double sumSim = 0.0;
  505 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  506 + {
  507 + sumSim += SimSpectrum[i].A * SimSpectrum[i].A;
  508 + }
  509 + double magSim = sqrt(sumSim);
  510 +
  511 + //compute the distortion (MSE from the mean)
  512 + double sumSE = 0.0;
  513 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  514 + {
  515 + sumSE += (SimSpectrum[i].A/magSim) * (1.0/SimSpectrum.size());
  516 + }
  517 + double MSE = sumSE;
  518 +
  519 + return MSE;
  520 +}
  521 +
  522 +void MinimizeDistortion(){
  523 + ofstream outFile("distortion.txt");
  524 +
  525 + //set the parameters for the distortion simulation
  526 + double step = 0.001;
  527 +
  528 + oNAi = 0.2;
  529 + oNAo = 0.5;
  530 +
  531 + //compute the optical parameters
  532 + //compute Nl (maximum order of the spectrum)
  533 + int Nl = computeNl();
  534 +
  535 + double* alpha = (double*)malloc(sizeof(double)*(Nl + 1));
  536 + double cAngleI, cAngleO, oAngleI, oAngleO, I0;
  537 +
  538 + //allocate space for a list of wavelengths
  539 + int nLambda = EtaK.size();
  540 +
  541 + //allocate temporary space for the spectrum
  542 + double* I = (double*)malloc(sizeof(double) * EtaK.size());
  543 +
  544 + //calculate the material parameters
  545 + //allocate space for the 2D array (Nl x nu) of scattering coefficients
  546 + complex<double>* B = (complex<double>*)malloc(sizeof(complex<double>) * Nl * nLambda);
  547 + computeBArray(B, Nl, nLambda);
  548 +
  549 +
  550 +
  551 + double D;
  552 + double e = 0.001;
  553 + for(double i=0.0; i<=oNAo-step; i+=step)
  554 + {
  555 +
  556 + for(double o=oNAi+step; o<=1.0; o+=step)
  557 + {
  558 +
  559 +
  560 + //set the current optical parameters
  561 + cNAi = i;
  562 + cNAo = o;
  563 +
  564 + //compute the optical parameters
  565 + computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl);
  566 +
  567 + //simulate the spectrum
  568 + cudaComputeSpectrum(I, (double*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, objectiveSamples);
  569 + updateSpectrum(I, I0, nLambda);
  570 +
  571 + if(dispSimType == AbsorbanceSpecType)
  572 + {
  573 + if(i + e >= o || i + e >= oNAo || oNAi + e >= o || oNAi + e >= oNAo)
  574 + D = 0.0;
  575 + else
  576 + D = absorbanceDistortion();
  577 + }
  578 + else
  579 + {
  580 + if(i >= o || oNAi >= oNAo)
  581 + D=0;
  582 + else
  583 + D = intensityDistortion();
  584 + }
  585 + outFile<<D<<" ";
  586 + }
  587 + outFile<<endl;
  588 + cout<<i<<endl;
  589 + }
  590 + outFile.close();
591 591 }
592 592 \ No newline at end of file
... ...
BESSEL.h renamed to bessel.h
1   -#ifndef bessH
2   -#define bessH
3   -#define _USE_MATH_DEFINES
4   -#include <math.h>
5   -#include <complex>
6   -using namespace std;
7   -#define eps 1e-15
8   -#define el 0.5772156649015329
9   -
10   -int msta1(double x,int mp);
11   -int msta2(double x,int n,int mp);
12   -int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1,
13   - double &j0p,double &j1p,double &y0p,double &y1p);
14   -int bessjy01b(double x,double &j0,double &j1,double &y0,double &y1,
15   - double &j0p,double &j1p,double &y0p,double &y1p);
16   -int bessjyna(int n,double x,int &nm,double *jn,double *yn,
17   - double *jnp,double *ynp);
18   -int bessjynb(int n,double x,int &nm,double *jn,double *yn,
19   - double *jnp,double *ynp);
20   -int bessjyv(double v,double x,double &vm,double *jv,double *yv,
21   - double *jvp,double *yvp);
22   -int bessik01a(double x,double &i0,double &i1,double &k0,double &k1,
23   - double &i0p,double &i1p,double &k0p,double &k1p);
24   -int bessik01b(double x,double &i0,double &i1,double &k0,double &k1,
25   - double &i0p,double &i1p,double &k0p,double &k1p);
26   -int bessikna(int n,double x,int &nm,double *in,double *kn,
27   - double *inp,double *knp);
28   -int bessiknb(int n,double x,int &nm,double *in,double *kn,
29   - double *inp,double *knp);
30   -int bessikv(double v,double x,double &vm,double *iv,double *kv,
31   - double *ivp,double *kvp);
32   -int cbessjy01(complex<double> z,complex<double> &cj0,complex<double> &cj1,
33   - complex<double> &cy0,complex<double> &cy1,complex<double> &cj0p,
34   - complex<double> &cj1p,complex<double> &cy0p,complex<double> &cy1p);
35   -int cbessjyna(int n,complex<double> z,int &nm,complex<double> *cj,
36   - complex<double> *cy,complex<double> *cjp,complex<double> *cyp);
37   -int cbessjynb(int n,complex<double> z,int &nm,complex<double> *cj,
38   - complex<double> *cy,complex<double> *cjp,complex<double> *cyp);
39   -int cbessik01(complex<double>z,complex<double>&ci0,complex<double>&ci1,
40   - complex<double>&ck0,complex<double>&ck1,complex<double>&ci0p,
41   - complex<double>&ci1p,complex<double>&ck0p,complex<double>&ck1p);
42   -int cbessikna(int n,complex<double> z,int &nm,complex<double> *ci,
43   - complex<double> *ck,complex<double> *cip,complex<double> *ckp);
44   -int cbessiknb(int n,complex<double> z,int &nm,complex<double> *ci,
45   - complex<double> *ck,complex<double> *cip,complex<double> *ckp);
46   -int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
47   - complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp);
48   -int cbessikv(double v,complex<double>z,double &vm,complex<double> *civ,
49   - complex<double> *ckv,complex<double> *civp,complex<double> *ckvp);
50   -
51   -#endif
  1 +#ifndef bessH
  2 +#define bessH
  3 +#define _USE_MATH_DEFINES
  4 +#include <math.h>
  5 +#include <complex>
  6 +using namespace std;
  7 +#define eps 1e-15
  8 +#define el 0.5772156649015329
  9 +
  10 +int msta1(double x,int mp);
  11 +int msta2(double x,int n,int mp);
  12 +int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1,
  13 + double &j0p,double &j1p,double &y0p,double &y1p);
  14 +int bessjy01b(double x,double &j0,double &j1,double &y0,double &y1,
  15 + double &j0p,double &j1p,double &y0p,double &y1p);
  16 +int bessjyna(int n,double x,int &nm,double *jn,double *yn,
  17 + double *jnp,double *ynp);
  18 +int bessjynb(int n,double x,int &nm,double *jn,double *yn,
  19 + double *jnp,double *ynp);
  20 +int bessjyv(double v,double x,double &vm,double *jv,double *yv,
  21 + double *jvp,double *yvp);
  22 +int bessik01a(double x,double &i0,double &i1,double &k0,double &k1,
  23 + double &i0p,double &i1p,double &k0p,double &k1p);
  24 +int bessik01b(double x,double &i0,double &i1,double &k0,double &k1,
  25 + double &i0p,double &i1p,double &k0p,double &k1p);
  26 +int bessikna(int n,double x,int &nm,double *in,double *kn,
  27 + double *inp,double *knp);
  28 +int bessiknb(int n,double x,int &nm,double *in,double *kn,
  29 + double *inp,double *knp);
  30 +int bessikv(double v,double x,double &vm,double *iv,double *kv,
  31 + double *ivp,double *kvp);
  32 +int cbessjy01(complex<double> z,complex<double> &cj0,complex<double> &cj1,
  33 + complex<double> &cy0,complex<double> &cy1,complex<double> &cj0p,
  34 + complex<double> &cj1p,complex<double> &cy0p,complex<double> &cy1p);
  35 +int cbessjyna(int n,complex<double> z,int &nm,complex<double> *cj,
  36 + complex<double> *cy,complex<double> *cjp,complex<double> *cyp);
  37 +int cbessjynb(int n,complex<double> z,int &nm,complex<double> *cj,
  38 + complex<double> *cy,complex<double> *cjp,complex<double> *cyp);
  39 +int cbessik01(complex<double>z,complex<double>&ci0,complex<double>&ci1,
  40 + complex<double>&ck0,complex<double>&ck1,complex<double>&ci0p,
  41 + complex<double>&ci1p,complex<double>&ck0p,complex<double>&ck1p);
  42 +int cbessikna(int n,complex<double> z,int &nm,complex<double> *ci,
  43 + complex<double> *ck,complex<double> *cip,complex<double> *ckp);
  44 +int cbessiknb(int n,complex<double> z,int &nm,complex<double> *ci,
  45 + complex<double> *ck,complex<double> *cip,complex<double> *ckp);
  46 +int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
  47 + complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp);
  48 +int cbessikv(double v,complex<double>z,double &vm,complex<double> *civ,
  49 + complex<double> *ckv,complex<double> *civp,complex<double> *ckvp);
  50 +
  51 +#endif
... ...
BESSIK.CPP renamed to bessik.CPP
1   -// bessik.cpp -- computation of modified Bessel functions In, Kn
2   -// and their derivatives. Algorithms and coefficient values from
3   -// "Computation of Special Functions", Zhang and Jin, John
4   -// Wiley and Sons, 1996.
5   -//
6   -// (C) 2003, C. Bond. All rights reserved.
7   -//
8   -#define _USE_MATH_DEFINES
9   -#include <math.h>
10   -#include "bessel.h"
11   -
12   -double gamma(double x);
13   -
14   -int bessik01a(double x,double &i0,double &i1,double &k0,double &k1,
15   - double &i0p,double &i1p,double &k0p,double &k1p)
16   -{
17   - double r,x2,ca,cb,ct,ww,w0,xr,xr2;
18   - int k,kz;
19   - static double a[] = {
20   - 0.125,
21   - 7.03125e-2,
22   - 7.32421875e-2,
23   - 1.1215209960938e-1,
24   - 2.2710800170898e-1,
25   - 5.7250142097473e-1,
26   - 1.7277275025845,
27   - 6.0740420012735,
28   - 2.4380529699556e1,
29   - 1.1001714026925e2,
30   - 5.5133589612202e2,
31   - 3.0380905109224e3};
32   - static double b[] = {
33   - -0.375,
34   - -1.171875e-1,
35   - -1.025390625e-1,
36   - -1.4419555664063e-1,
37   - -2.7757644653320e-1,
38   - -6.7659258842468e-1,
39   - -1.9935317337513,
40   - -6.8839142681099,
41   - -2.7248827311269e1,
42   - -1.2159789187654e2,
43   - -6.0384407670507e2,
44   - -3.3022722944809e3};
45   - static double a1[] = {
46   - 0.125,
47   - 0.2109375,
48   - 1.0986328125,
49   - 1.1775970458984e1,
50   - 2.1461706161499e2,
51   - 5.9511522710323e3,
52   - 2.3347645606175e5,
53   - 1.2312234987631e7};
54   -
55   - if (x < 0.0) return 1;
56   - if (x == 0.0) {
57   - i0 = 1.0;
58   - i1 = 0.0;
59   - k0 = 1e308;
60   - k1 = 1e308;
61   - i0p = 0.0;
62   - i1p = 0.5;
63   - k0p = -1e308;
64   - k1p = -1e308;
65   - return 0;
66   - }
67   - x2 = x*x;
68   - if (x <= 18.0) {
69   - i0 = 1.0;
70   - r = 1.0;
71   - for (k=1;k<=50;k++) {
72   - r *= 0.25*x2/(k*k);
73   - i0 += r;
74   - if (fabs(r/i0) < eps) break;
75   - }
76   - i1 = 1.0;
77   - r = 1.0;
78   - for (k=1;k<=50;k++) {
79   - r *= 0.25*x2/(k*(k+1));
80   - i1 += r;
81   - if (fabs(r/i1) < eps) break;
82   - }
83   - i1 *= 0.5*x;
84   - }
85   - else {
86   - if (x >= 50.0) kz = 7;
87   - else if (x >= 35.0) kz = 9;
88   - else kz = 12;
89   - ca = exp(x)/sqrt(2.0*M_PI*x);
90   - i0 = 1.0;
91   - xr = 1.0/x;
92   - for (k=0;k<kz;k++) {
93   - i0 += a[k]*pow(xr,k+1);
94   - }
95   - i0 *= ca;
96   - i1 = 1.0;
97   - for (k=0;k<kz;k++) {
98   - i1 += b[k]*pow(xr,k+1);
99   - }
100   - i1 *= ca;
101   - }
102   - if (x <= 9.0) {
103   - ct = -(log(0.5*x)+el);
104   - k0 = 0.0;
105   - w0 = 0.0;
106   - r = 1.0;
107   - ww = 0.0;
108   - for (k=1;k<=50;k++) {
109   - w0 += 1.0/k;
110   - r *= 0.25*x2/(k*k);
111   - k0 += r*(w0+ct);
112   - if (fabs((k0-ww)/k0) < eps) break;
113   - ww = k0;
114   - }
115   - k0 += ct;
116   - }
117   - else {
118   - cb = 0.5/x;
119   - xr2 = 1.0/x2;
120   - k0 = 1.0;
121   - for (k=0;k<8;k++) {
122   - k0 += a1[k]*pow(xr2,k+1);
123   - }
124   - k0 *= cb/i0;
125   - }
126   - k1 = (1.0/x - i1*k0)/i0;
127   - i0p = i1;
128   - i1p = i0-i1/x;
129   - k0p = -k1;
130   - k1p = -k0-k1/x;
131   - return 0;
132   -}
133   -
134   -int bessik01b(double x,double &i0,double &i1,double &k0,double &k1,
135   - double &i0p,double &i1p,double &k0p,double &k1p)
136   -{
137   - double t,t2,dtmp,dtmp1;
138   -
139   - if (x < 0.0) return 1;
140   - if (x == 0.0) {
141   - i0 = 1.0;
142   - i1 = 0.0;
143   - k0 = 1e308;
144   - k1 = 1e308;
145   - i0p = 0.0;
146   - i1p = 0.5;
147   - k0p = -1e308;
148   - k1p = -1e308;
149   - return 0;
150   - }
151   - if (x < 3.75) {
152   - t = x/3.75;
153   - t2 = t*t;
154   - i0 = (((((0.0045813*t2+0.0360768)*t2+0.2659732)*t2+
155   - 1.2067492)*t2+3.0899424)*t2+3.5156229)*t2+1.0;
156   - i1 = x*(((((0.00032411*t2+0.00301532)*t2+0.02658733*t2+
157   - 0.15084934)*t2+0.51498869)*t2+0.87890594)*t2+0.5);
158   - }
159   - else {
160   - t = 3.75/x;
161   - dtmp1 = exp(x)/sqrt(x);
162   - dtmp = (((((((0.00392377*t-0.01647633)*t+0.026355537)*t-0.02057706)*t+
163   - 0.00916281)*t-0.00157565)*t+0.00225319)*t+0.01328592)*t+0.39894228;
164   - i0 = dtmp*dtmp1;
165   - dtmp = (((((((-0.00420059*t+0.01787654)*t-0.02895312)*t+0.02282967)*t-
166   - 0.01031555)*t+0.00163801)*t-0.00362018)*t-0.03988024)*t+0.39894228;
167   - i1 = dtmp*dtmp1;
168   - }
169   - if (x < 2.0) {
170   - t = 0.5*x;
171   - t2 = t*t; // already calculated above
172   - dtmp = (((((0.0000074*t2+0.0001075)*t2+0.00262698)*t2+0.0348859)*t2+
173   - 0.23069756)*t2+0.4227842)*t2-0.57721566;
174   - k0 = dtmp - i0*log(t);
175   - dtmp = (((((-0.00004686*t2-0.00110404)*t2-0.01919402)*t2-
176   - 0.18156897)*t2-0.67278578)*t2+0.15443144)*t2+1.0;
177   - k1 = dtmp/x + i1*log(t);
178   - }
179   - else {
180   - t = 2.0/x;
181   - dtmp1 = exp(-x)/sqrt(x);
182   - dtmp = (((((0.00053208*t-0.0025154)*t+0.00587872)*t-0.01062446)*t+
183   - 0.02189568)*t-0.07832358)*t+1.25331414;
184   - k0 = dtmp*dtmp1;
185   - dtmp = (((((-0.00068245*t+0.00325614)*t-0.00780353)*t+0.01504268)*t-
186   - 0.0365562)*t+0.23498619)*t+1.25331414;
187   - k1 = dtmp*dtmp1;
188   - }
189   - i0p = i1;
190   - i1p = i0 - i1/x;
191   - k0p = -k1;
192   - k1p = -k0 - k1/x;
193   - return 0;
194   -}
195   -int bessikna(int n,double x,int &nm,double *in,double *kn,
196   - double *inp,double *knp)
197   -{
198   - double bi0,bi1,bk0,bk1,g,g0,g1,f,f0,f1,h,h0,h1,s0;
199   - int k,m,ecode;
200   -
201   - if ((x < 0.0) || (n < 0)) return 1;
202   - if (x < eps) {
203   - for (k=0;k<=n;k++) {
204   - in[k] = 0.0;
205   - kn[k] = 1e308;
206   - inp[k] = 0.0;
207   - knp[k] = -1e308;
208   - }
209   - in[0] = 1.0;
210   - inp[1] = 0.5;
211   - return 0;
212   - }
213   - nm = n;
214   - ecode = bessik01a(x,in[0],in[1],kn[0],kn[1],inp[0],inp[1],knp[0],knp[1]);
215   - if (n < 2) return 0;
216   - bi0 = in[0];
217   - bi1 = in[1];
218   - bk0 = kn[0];
219   - bk1 = kn[1];
220   - if ((x > 40.0) && (n < (int)(0.25*x))) {
221   - h0 = bi0;
222   - h1 = bi1;
223   - for (k=2;k<=n;k++) {
224   - h = -2.0*(k-1.0)*h1/x+h0;
225   - in[k] = h;
226   - h0 = h1;
227   - h1 = h;
228   - }
229   - }
230   - else {
231   - m = msta1(x,200);
232   - if (m < n) nm = m;
233   - else m = msta2(x,n,15);
234   - f0 = 0.0;
235   - f1 = 1.0e-100;
236   - for (k=m;k>=0;k--) {
237   - f = 2.0*(k+1.0)*f1/x+f0;
238   - if (x <= nm) in[k] = f;
239   - f0 = f1;
240   - f1 = f;
241   - }
242   - s0 = bi0/f;
243   - for (k=0;k<=m;k++) {
244   - in[k] *= s0;
245   - }
246   - }
247   - g0 = bk0;
248   - g1 = bk1;
249   - for (k=2;k<=nm;k++) {
250   - g = 2.0*(k-1.0)*g1/x+g0;
251   - kn[k] = g;
252   - g0 = g1;
253   - g1 = g;
254   - }
255   - for (k=2;k<=nm;k++) {
256   - inp[k] = in[k-1]-k*in[k]/x;
257   - knp[k] = -kn[k-1]-k*kn[k]/x;
258   - }
259   - return 0;
260   -}
261   -int bessiknb(int n,double x,int &nm,double *in,double *kn,
262   - double *inp,double *knp)
263   -{
264   - double s0,bs,f,f0,f1,sk0,a0,bkl,vt,r,g,g0,g1;
265   - int k,kz,m,l;
266   -
267   - if ((x < 0.0) || (n < 0)) return 1;
268   - if (x < eps) {
269   - for (k=0;k<=n;k++) {
270   - in[k] = 0.0;
271   - kn[k] = 1e308;
272   - inp[k] = 0.0;
273   - knp[k] = -1e308;
274   - }
275   - in[0] = 1.0;
276   - inp[1] = 0.5;
277   - return 0;
278   - }
279   - nm = n;
280   - if (n == 0) nm = 1;
281   - m = msta1(x,200);
282   - if (m < nm) nm = m;
283   - else m = msta2(x,nm,15);
284   - bs = 0.0;
285   - sk0 = 0.0;
286   - f0 = 0.0;
287   - f1 = 1.0e-100;
288   - for (k=m;k>=0;k--) {
289   - f = 2.0*(k+1.0)*f1/x+f0;
290   - if (k <= nm) in[k] = f;
291   - if ((k != 0) && (k == 2*(int)(k/2))) {
292   - sk0 += 4.0*f/k;
293   - }
294   - bs += 2.0*f;
295   - f0 = f1;
296   - f1 = f;
297   - }
298   - s0 = exp(x)/(bs-f);
299   - for (k=0;k<=nm;k++) {
300   - in[k] *= s0;
301   - }
302   - if (x <= 8.0) {
303   - kn[0] = -(log(0.5*x)+el)*in[0]+s0*sk0;
304   - kn[1] = (1.0/x-in[1]*kn[0])/in[0];
305   - }
306   - else {
307   - a0 = sqrt(M_PI_2/x)*exp(-x);
308   - if (x >= 200.0) kz = 6;
309   - else if (x >= 80.0) kz = 8;
310   - else if (x >= 25.0) kz = 10;
311   - else kz = 16;
312   - for (l=0;l<2;l++) {
313   - bkl = 1.0;
314   - vt = 4.0*l;
315   - r = 1.0;
316   - for (k=1;k<=kz;k++) {
317   - r *= 0.125*(vt-pow(2.0*k-1.0,2))/(k*x);
318   - bkl += r;
319   - }
320   - kn[l] = a0*bkl;
321   - }
322   - }
323   - g0 = kn[0];
324   - g1 = kn[1];
325   - for (k=2;k<=nm;k++) {
326   - g = 2.0*(k-1.0)*g1/x+g0;
327   - kn[k] = g;
328   - g0 = g1;
329   - g1 = g;
330   - }
331   - inp[0] = in[1];
332   - knp[0] = -kn[1];
333   - for (k=1;k<=nm;k++) {
334   - inp[k] = in[k-1]-k*in[k]/x;
335   - knp[k] = -kn[k-1]-k*kn[k]/x;
336   - }
337   - return 0;
338   -}
339   -
340   -// The following program computes the modified Bessel functions
341   -// Iv(x) and Kv(x) for arbitrary positive order. For negative
342   -// order use:
343   -//
344   -// I-v(x) = Iv(x) + 2/pi sin(v pi) Kv(x)
345   -// K-v(x) = Kv(x)
346   -//
347   -int bessikv(double v,double x,double &vm,double *iv,double *kv,
348   - double *ivp,double *kvp)
349   -{
350   - double x2,v0,piv,vt,a1,v0p,gap,r,bi0,ca,sum;
351   - double f,f1,f2,ct,cs,wa,gan,ww,w0,v0n;
352   - double r1,r2,bk0,bk1,bk2,a2,cb;
353   - int n,k,kz,m;
354   -
355   - if ((v < 0.0) || (x < 0.0)) return 1;
356   - x2 = x*x;
357   - n = (int)v;
358   - v0 = v-n;
359   - if (n == 0) n = 1;
360   - if (x == 0.0) {
361   - for (k=0;k<=n;k++) {
362   - iv[k] = 0.0;
363   - kv[k] = -1e308;
364   - ivp[k] = 0.0;
365   - kvp[k] = 1e308;
366   - }
367   - if (v0 == 0.0) {
368   - iv[0] = 1.0;
369   - ivp[1] = 0.5;
370   - }
371   - vm = v;
372   - return 0;
373   - }
374   - piv = M_PI*v0;
375   - vt = 4.0*v0*v0;
376   - if (v0 == 0.0) {
377   - a1 = 1.0;
378   - }
379   - else {
380   - v0p = 1.0+v0;
381   - gap = gamma(v0p);
382   - a1 = pow(0.5*x,v0)/gap;
383   - }
384   - if (x >= 50.0) kz = 8;
385   - else if (x >= 35.0) kz = 10;
386   - else kz = 14;
387   - if (x <= 18.0) {
388   - bi0 = 1.0;
389   - r = 1.0;
390   - for (k=1;k<=30;k++) {
391   - r *= 0.25*x2/(k*(k+v0));
392   - bi0 += r;
393   - if (fabs(r/bi0) < eps) break;
394   - }
395   - bi0 *= a1;
396   - }
397   - else {
398   - ca = exp(x)/sqrt(2.0*M_PI*x);
399   - sum = 1.0;
400   - r = 1.0;
401   - for (k=1;k<=kz;k++) {
402   - r *= -0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x);
403   - sum += r;
404   - }
405   - bi0 = ca*sum;
406   - }
407   - m = msta1(x,200);
408   - if (m < n) n = m;
409   - else m = msta2(x,n,15);
410   - f2 = 0.0;
411   - f1 = 1.0e-100;
412   - for (k=m;k>=0;k--) {
413   - f = 2.0*(v0+k+1.0)*f1/x+f2;
414   - if (k <= n) iv[k] = f;
415   - f2 = f1;
416   - f1 = f;
417   - }
418   - cs = bi0/f;
419   - for (k=0;k<=n;k++) {
420   - iv[k] *= cs;
421   - }
422   - ivp[0] = v0*iv[0]/x+iv[1];
423   - for (k=1;k<=n;k++) {
424   - ivp[k] = -(k+v0)*iv[k]/x+iv[k-1];
425   - }
426   - ww = 0.0;
427   - if (x <= 9.0) {
428   - if (v0 == 0.0) {
429   - ct = -log(0.5*x)-el;
430   - cs = 0.0;
431   - w0 = 0.0;
432   - r = 1.0;
433   - for (k=1;k<=50;k++) {
434   - w0 += 1.0/k;
435   - r *= 0.25*x2/(k*k);
436   - cs += r*(w0+ct);
437   - wa = fabs(cs);
438   - if (fabs((wa-ww)/wa) < eps) break;
439   - ww = wa;
440   - }
441   - bk0 = ct+cs;
442   - }
443   - else {
444   - v0n = 1.0-v0;
445   - gan = gamma(v0n);
446   - a2 = 1.0/(gan*pow(0.5*x,v0));
447   - a1 = pow(0.5*x,v0)/gap;
448   - sum = a2-a1;
449   - r1 = 1.0;
450   - r2 = 1.0;
451   - for (k=1;k<=120;k++) {
452   - r1 *= 0.25*x2/(k*(k-v0));
453   - r2 *= 0.25*x2/(k*(k+v0));
454   - sum += a2*r1-a1*r2;
455   - wa = fabs(sum);
456   - if (fabs((wa-ww)/wa) < eps) break;
457   - ww = wa;
458   - }
459   - bk0 = M_PI_2*sum/sin(piv);
460   - }
461   - }
462   - else {
463   - cb = exp(-x)*sqrt(M_PI_2/x);
464   - sum = 1.0;
465   - r = 1.0;
466   - for (k=1;k<=kz;k++) {
467   - r *= 0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x);
468   - sum += r;
469   - }
470   - bk0 = cb*sum;
471   - }
472   - bk1 = (1.0/x-iv[1]*bk0)/iv[0];
473   - kv[0] = bk0;
474   - kv[1] = bk1;
475   - for (k=2;k<=n;k++) {
476   - bk2 = 2.0*(v0+k-1.0)*bk1/x+bk0;
477   - kv[k] = bk2;
478   - bk0 = bk1;
479   - bk1 = bk2;
480   - }
481   - kvp[0] = v0*kv[0]/x-kv[1];
482   - for (k=1;k<=n;k++) {
483   - kvp[k] = -(k+v0)*kv[k]/x-kv[k-1];
484   - }
485   - vm = n+v0;
486   - return 0;
487   -}
  1 +// bessik.cpp -- computation of modified Bessel functions In, Kn
  2 +// and their derivatives. Algorithms and coefficient values from
  3 +// "Computation of Special Functions", Zhang and Jin, John
  4 +// Wiley and Sons, 1996.
  5 +//
  6 +// (C) 2003, C. Bond. All rights reserved.
  7 +//
  8 +#define _USE_MATH_DEFINES
  9 +#include <math.h>
  10 +#include "bessel.h"
  11 +
  12 +double gamma(double x);
  13 +
  14 +int bessik01a(double x,double &i0,double &i1,double &k0,double &k1,
  15 + double &i0p,double &i1p,double &k0p,double &k1p)
  16 +{
  17 + double r,x2,ca,cb,ct,ww,w0,xr,xr2;
  18 + int k,kz;
  19 + static double a[] = {
  20 + 0.125,
  21 + 7.03125e-2,
  22 + 7.32421875e-2,
  23 + 1.1215209960938e-1,
  24 + 2.2710800170898e-1,
  25 + 5.7250142097473e-1,
  26 + 1.7277275025845,
  27 + 6.0740420012735,
  28 + 2.4380529699556e1,
  29 + 1.1001714026925e2,
  30 + 5.5133589612202e2,
  31 + 3.0380905109224e3};
  32 + static double b[] = {
  33 + -0.375,
  34 + -1.171875e-1,
  35 + -1.025390625e-1,
  36 + -1.4419555664063e-1,
  37 + -2.7757644653320e-1,
  38 + -6.7659258842468e-1,
  39 + -1.9935317337513,
  40 + -6.8839142681099,
  41 + -2.7248827311269e1,
  42 + -1.2159789187654e2,
  43 + -6.0384407670507e2,
  44 + -3.3022722944809e3};
  45 + static double a1[] = {
  46 + 0.125,
  47 + 0.2109375,
  48 + 1.0986328125,
  49 + 1.1775970458984e1,
  50 + 2.1461706161499e2,
  51 + 5.9511522710323e3,
  52 + 2.3347645606175e5,
  53 + 1.2312234987631e7};
  54 +
  55 + if (x < 0.0) return 1;
  56 + if (x == 0.0) {
  57 + i0 = 1.0;
  58 + i1 = 0.0;
  59 + k0 = 1e308;
  60 + k1 = 1e308;
  61 + i0p = 0.0;
  62 + i1p = 0.5;
  63 + k0p = -1e308;
  64 + k1p = -1e308;
  65 + return 0;
  66 + }
  67 + x2 = x*x;
  68 + if (x <= 18.0) {
  69 + i0 = 1.0;
  70 + r = 1.0;
  71 + for (k=1;k<=50;k++) {
  72 + r *= 0.25*x2/(k*k);
  73 + i0 += r;
  74 + if (fabs(r/i0) < eps) break;
  75 + }
  76 + i1 = 1.0;
  77 + r = 1.0;
  78 + for (k=1;k<=50;k++) {
  79 + r *= 0.25*x2/(k*(k+1));
  80 + i1 += r;
  81 + if (fabs(r/i1) < eps) break;
  82 + }
  83 + i1 *= 0.5*x;
  84 + }
  85 + else {
  86 + if (x >= 50.0) kz = 7;
  87 + else if (x >= 35.0) kz = 9;
  88 + else kz = 12;
  89 + ca = exp(x)/sqrt(2.0*M_PI*x);
  90 + i0 = 1.0;
  91 + xr = 1.0/x;
  92 + for (k=0;k<kz;k++) {
  93 + i0 += a[k]*pow(xr,k+1);
  94 + }
  95 + i0 *= ca;
  96 + i1 = 1.0;
  97 + for (k=0;k<kz;k++) {
  98 + i1 += b[k]*pow(xr,k+1);
  99 + }
  100 + i1 *= ca;
  101 + }
  102 + if (x <= 9.0) {
  103 + ct = -(log(0.5*x)+el);
  104 + k0 = 0.0;
  105 + w0 = 0.0;
  106 + r = 1.0;
  107 + ww = 0.0;
  108 + for (k=1;k<=50;k++) {
  109 + w0 += 1.0/k;
  110 + r *= 0.25*x2/(k*k);
  111 + k0 += r*(w0+ct);
  112 + if (fabs((k0-ww)/k0) < eps) break;
  113 + ww = k0;
  114 + }
  115 + k0 += ct;
  116 + }
  117 + else {
  118 + cb = 0.5/x;
  119 + xr2 = 1.0/x2;
  120 + k0 = 1.0;
  121 + for (k=0;k<8;k++) {
  122 + k0 += a1[k]*pow(xr2,k+1);
  123 + }
  124 + k0 *= cb/i0;
  125 + }
  126 + k1 = (1.0/x - i1*k0)/i0;
  127 + i0p = i1;
  128 + i1p = i0-i1/x;
  129 + k0p = -k1;
  130 + k1p = -k0-k1/x;
  131 + return 0;
  132 +}
  133 +
  134 +int bessik01b(double x,double &i0,double &i1,double &k0,double &k1,
  135 + double &i0p,double &i1p,double &k0p,double &k1p)
  136 +{
  137 + double t,t2,dtmp,dtmp1;
  138 +
  139 + if (x < 0.0) return 1;
  140 + if (x == 0.0) {
  141 + i0 = 1.0;
  142 + i1 = 0.0;
  143 + k0 = 1e308;
  144 + k1 = 1e308;
  145 + i0p = 0.0;
  146 + i1p = 0.5;
  147 + k0p = -1e308;
  148 + k1p = -1e308;
  149 + return 0;
  150 + }
  151 + if (x < 3.75) {
  152 + t = x/3.75;
  153 + t2 = t*t;
  154 + i0 = (((((0.0045813*t2+0.0360768)*t2+0.2659732)*t2+
  155 + 1.2067492)*t2+3.0899424)*t2+3.5156229)*t2+1.0;
  156 + i1 = x*(((((0.00032411*t2+0.00301532)*t2+0.02658733*t2+
  157 + 0.15084934)*t2+0.51498869)*t2+0.87890594)*t2+0.5);
  158 + }
  159 + else {
  160 + t = 3.75/x;
  161 + dtmp1 = exp(x)/sqrt(x);
  162 + dtmp = (((((((0.00392377*t-0.01647633)*t+0.026355537)*t-0.02057706)*t+
  163 + 0.00916281)*t-0.00157565)*t+0.00225319)*t+0.01328592)*t+0.39894228;
  164 + i0 = dtmp*dtmp1;
  165 + dtmp = (((((((-0.00420059*t+0.01787654)*t-0.02895312)*t+0.02282967)*t-
  166 + 0.01031555)*t+0.00163801)*t-0.00362018)*t-0.03988024)*t+0.39894228;
  167 + i1 = dtmp*dtmp1;
  168 + }
  169 + if (x < 2.0) {
  170 + t = 0.5*x;
  171 + t2 = t*t; // already calculated above
  172 + dtmp = (((((0.0000074*t2+0.0001075)*t2+0.00262698)*t2+0.0348859)*t2+
  173 + 0.23069756)*t2+0.4227842)*t2-0.57721566;
  174 + k0 = dtmp - i0*log(t);
  175 + dtmp = (((((-0.00004686*t2-0.00110404)*t2-0.01919402)*t2-
  176 + 0.18156897)*t2-0.67278578)*t2+0.15443144)*t2+1.0;
  177 + k1 = dtmp/x + i1*log(t);
  178 + }
  179 + else {
  180 + t = 2.0/x;
  181 + dtmp1 = exp(-x)/sqrt(x);
  182 + dtmp = (((((0.00053208*t-0.0025154)*t+0.00587872)*t-0.01062446)*t+
  183 + 0.02189568)*t-0.07832358)*t+1.25331414;
  184 + k0 = dtmp*dtmp1;
  185 + dtmp = (((((-0.00068245*t+0.00325614)*t-0.00780353)*t+0.01504268)*t-
  186 + 0.0365562)*t+0.23498619)*t+1.25331414;
  187 + k1 = dtmp*dtmp1;
  188 + }
  189 + i0p = i1;
  190 + i1p = i0 - i1/x;
  191 + k0p = -k1;
  192 + k1p = -k0 - k1/x;
  193 + return 0;
  194 +}
  195 +int bessikna(int n,double x,int &nm,double *in,double *kn,
  196 + double *inp,double *knp)
  197 +{
  198 + double bi0,bi1,bk0,bk1,g,g0,g1,f,f0,f1,h,h0,h1,s0;
  199 + int k,m,ecode;
  200 +
  201 + if ((x < 0.0) || (n < 0)) return 1;
  202 + if (x < eps) {
  203 + for (k=0;k<=n;k++) {
  204 + in[k] = 0.0;
  205 + kn[k] = 1e308;
  206 + inp[k] = 0.0;
  207 + knp[k] = -1e308;
  208 + }
  209 + in[0] = 1.0;
  210 + inp[1] = 0.5;
  211 + return 0;
  212 + }
  213 + nm = n;
  214 + ecode = bessik01a(x,in[0],in[1],kn[0],kn[1],inp[0],inp[1],knp[0],knp[1]);
  215 + if (n < 2) return 0;
  216 + bi0 = in[0];
  217 + bi1 = in[1];
  218 + bk0 = kn[0];
  219 + bk1 = kn[1];
  220 + if ((x > 40.0) && (n < (int)(0.25*x))) {
  221 + h0 = bi0;
  222 + h1 = bi1;
  223 + for (k=2;k<=n;k++) {
  224 + h = -2.0*(k-1.0)*h1/x+h0;
  225 + in[k] = h;
  226 + h0 = h1;
  227 + h1 = h;
  228 + }
  229 + }
  230 + else {
  231 + m = msta1(x,200);
  232 + if (m < n) nm = m;
  233 + else m = msta2(x,n,15);
  234 + f0 = 0.0;
  235 + f1 = 1.0e-100;
  236 + for (k=m;k>=0;k--) {
  237 + f = 2.0*(k+1.0)*f1/x+f0;
  238 + if (x <= nm) in[k] = f;
  239 + f0 = f1;
  240 + f1 = f;
  241 + }
  242 + s0 = bi0/f;
  243 + for (k=0;k<=m;k++) {
  244 + in[k] *= s0;
  245 + }
  246 + }
  247 + g0 = bk0;
  248 + g1 = bk1;
  249 + for (k=2;k<=nm;k++) {
  250 + g = 2.0*(k-1.0)*g1/x+g0;
  251 + kn[k] = g;
  252 + g0 = g1;
  253 + g1 = g;
  254 + }
  255 + for (k=2;k<=nm;k++) {
  256 + inp[k] = in[k-1]-k*in[k]/x;
  257 + knp[k] = -kn[k-1]-k*kn[k]/x;
  258 + }
  259 + return 0;
  260 +}
  261 +int bessiknb(int n,double x,int &nm,double *in,double *kn,
  262 + double *inp,double *knp)
  263 +{
  264 + double s0,bs,f,f0,f1,sk0,a0,bkl,vt,r,g,g0,g1;
  265 + int k,kz,m,l;
  266 +
  267 + if ((x < 0.0) || (n < 0)) return 1;
  268 + if (x < eps) {
  269 + for (k=0;k<=n;k++) {
  270 + in[k] = 0.0;
  271 + kn[k] = 1e308;
  272 + inp[k] = 0.0;
  273 + knp[k] = -1e308;
  274 + }
  275 + in[0] = 1.0;
  276 + inp[1] = 0.5;
  277 + return 0;
  278 + }
  279 + nm = n;
  280 + if (n == 0) nm = 1;
  281 + m = msta1(x,200);
  282 + if (m < nm) nm = m;
  283 + else m = msta2(x,nm,15);
  284 + bs = 0.0;
  285 + sk0 = 0.0;
  286 + f0 = 0.0;
  287 + f1 = 1.0e-100;
  288 + for (k=m;k>=0;k--) {
  289 + f = 2.0*(k+1.0)*f1/x+f0;
  290 + if (k <= nm) in[k] = f;
  291 + if ((k != 0) && (k == 2*(int)(k/2))) {
  292 + sk0 += 4.0*f/k;
  293 + }
  294 + bs += 2.0*f;
  295 + f0 = f1;
  296 + f1 = f;
  297 + }
  298 + s0 = exp(x)/(bs-f);
  299 + for (k=0;k<=nm;k++) {
  300 + in[k] *= s0;
  301 + }
  302 + if (x <= 8.0) {
  303 + kn[0] = -(log(0.5*x)+el)*in[0]+s0*sk0;
  304 + kn[1] = (1.0/x-in[1]*kn[0])/in[0];
  305 + }
  306 + else {
  307 + a0 = sqrt(M_PI_2/x)*exp(-x);
  308 + if (x >= 200.0) kz = 6;
  309 + else if (x >= 80.0) kz = 8;
  310 + else if (x >= 25.0) kz = 10;
  311 + else kz = 16;
  312 + for (l=0;l<2;l++) {
  313 + bkl = 1.0;
  314 + vt = 4.0*l;
  315 + r = 1.0;
  316 + for (k=1;k<=kz;k++) {
  317 + r *= 0.125*(vt-pow(2.0*k-1.0,2))/(k*x);
  318 + bkl += r;
  319 + }
  320 + kn[l] = a0*bkl;
  321 + }
  322 + }
  323 + g0 = kn[0];
  324 + g1 = kn[1];
  325 + for (k=2;k<=nm;k++) {
  326 + g = 2.0*(k-1.0)*g1/x+g0;
  327 + kn[k] = g;
  328 + g0 = g1;
  329 + g1 = g;
  330 + }
  331 + inp[0] = in[1];
  332 + knp[0] = -kn[1];
  333 + for (k=1;k<=nm;k++) {
  334 + inp[k] = in[k-1]-k*in[k]/x;
  335 + knp[k] = -kn[k-1]-k*kn[k]/x;
  336 + }
  337 + return 0;
  338 +}
  339 +
  340 +// The following program computes the modified Bessel functions
  341 +// Iv(x) and Kv(x) for arbitrary positive order. For negative
  342 +// order use:
  343 +//
  344 +// I-v(x) = Iv(x) + 2/pi sin(v pi) Kv(x)
  345 +// K-v(x) = Kv(x)
  346 +//
  347 +int bessikv(double v,double x,double &vm,double *iv,double *kv,
  348 + double *ivp,double *kvp)
  349 +{
  350 + double x2,v0,piv,vt,a1,v0p,gap,r,bi0,ca,sum;
  351 + double f,f1,f2,ct,cs,wa,gan,ww,w0,v0n;
  352 + double r1,r2,bk0,bk1,bk2,a2,cb;
  353 + int n,k,kz,m;
  354 +
  355 + if ((v < 0.0) || (x < 0.0)) return 1;
  356 + x2 = x*x;
  357 + n = (int)v;
  358 + v0 = v-n;
  359 + if (n == 0) n = 1;
  360 + if (x == 0.0) {
  361 + for (k=0;k<=n;k++) {
  362 + iv[k] = 0.0;
  363 + kv[k] = -1e308;
  364 + ivp[k] = 0.0;
  365 + kvp[k] = 1e308;
  366 + }
  367 + if (v0 == 0.0) {
  368 + iv[0] = 1.0;
  369 + ivp[1] = 0.5;
  370 + }
  371 + vm = v;
  372 + return 0;
  373 + }
  374 + piv = M_PI*v0;
  375 + vt = 4.0*v0*v0;
  376 + if (v0 == 0.0) {
  377 + a1 = 1.0;
  378 + }
  379 + else {
  380 + v0p = 1.0+v0;
  381 + gap = gamma(v0p);
  382 + a1 = pow(0.5*x,v0)/gap;
  383 + }
  384 + if (x >= 50.0) kz = 8;
  385 + else if (x >= 35.0) kz = 10;
  386 + else kz = 14;
  387 + if (x <= 18.0) {
  388 + bi0 = 1.0;
  389 + r = 1.0;
  390 + for (k=1;k<=30;k++) {
  391 + r *= 0.25*x2/(k*(k+v0));
  392 + bi0 += r;
  393 + if (fabs(r/bi0) < eps) break;
  394 + }
  395 + bi0 *= a1;
  396 + }
  397 + else {
  398 + ca = exp(x)/sqrt(2.0*M_PI*x);
  399 + sum = 1.0;
  400 + r = 1.0;
  401 + for (k=1;k<=kz;k++) {
  402 + r *= -0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x);
  403 + sum += r;
  404 + }
  405 + bi0 = ca*sum;
  406 + }
  407 + m = msta1(x,200);
  408 + if (m < n) n = m;
  409 + else m = msta2(x,n,15);
  410 + f2 = 0.0;
  411 + f1 = 1.0e-100;
  412 + for (k=m;k>=0;k--) {
  413 + f = 2.0*(v0+k+1.0)*f1/x+f2;
  414 + if (k <= n) iv[k] = f;
  415 + f2 = f1;
  416 + f1 = f;
  417 + }
  418 + cs = bi0/f;
  419 + for (k=0;k<=n;k++) {
  420 + iv[k] *= cs;
  421 + }
  422 + ivp[0] = v0*iv[0]/x+iv[1];
  423 + for (k=1;k<=n;k++) {
  424 + ivp[k] = -(k+v0)*iv[k]/x+iv[k-1];
  425 + }
  426 + ww = 0.0;
  427 + if (x <= 9.0) {
  428 + if (v0 == 0.0) {
  429 + ct = -log(0.5*x)-el;
  430 + cs = 0.0;
  431 + w0 = 0.0;
  432 + r = 1.0;
  433 + for (k=1;k<=50;k++) {
  434 + w0 += 1.0/k;
  435 + r *= 0.25*x2/(k*k);
  436 + cs += r*(w0+ct);
  437 + wa = fabs(cs);
  438 + if (fabs((wa-ww)/wa) < eps) break;
  439 + ww = wa;
  440 + }
  441 + bk0 = ct+cs;
  442 + }
  443 + else {
  444 + v0n = 1.0-v0;
  445 + gan = gamma(v0n);
  446 + a2 = 1.0/(gan*pow(0.5*x,v0));
  447 + a1 = pow(0.5*x,v0)/gap;
  448 + sum = a2-a1;
  449 + r1 = 1.0;
  450 + r2 = 1.0;
  451 + for (k=1;k<=120;k++) {
  452 + r1 *= 0.25*x2/(k*(k-v0));
  453 + r2 *= 0.25*x2/(k*(k+v0));
  454 + sum += a2*r1-a1*r2;
  455 + wa = fabs(sum);
  456 + if (fabs((wa-ww)/wa) < eps) break;
  457 + ww = wa;
  458 + }
  459 + bk0 = M_PI_2*sum/sin(piv);
  460 + }
  461 + }
  462 + else {
  463 + cb = exp(-x)*sqrt(M_PI_2/x);
  464 + sum = 1.0;
  465 + r = 1.0;
  466 + for (k=1;k<=kz;k++) {
  467 + r *= 0.125*(vt-pow(2.0*k-1.0,2.0))/(k*x);
  468 + sum += r;
  469 + }
  470 + bk0 = cb*sum;
  471 + }
  472 + bk1 = (1.0/x-iv[1]*bk0)/iv[0];
  473 + kv[0] = bk0;
  474 + kv[1] = bk1;
  475 + for (k=2;k<=n;k++) {
  476 + bk2 = 2.0*(v0+k-1.0)*bk1/x+bk0;
  477 + kv[k] = bk2;
  478 + bk0 = bk1;
  479 + bk1 = bk2;
  480 + }
  481 + kvp[0] = v0*kv[0]/x-kv[1];
  482 + for (k=1;k<=n;k++) {
  483 + kvp[k] = -(k+v0)*kv[k]/x-kv[k-1];
  484 + }
  485 + vm = n+v0;
  486 + return 0;
  487 +}
... ...
BESSJY.CPP renamed to bessjy.cpp
1   -// bessjy.cpp -- computation of Bessel functions Jn, Yn and their
2   -// derivatives. Algorithms and coefficient values from
3   -// "Computation of Special Functions", Zhang and Jin, John
4   -// Wiley and Sons, 1996.
5   -//
6   -// (C) 2003, C. Bond. All rights reserved.
7   -//
8   -// Note that 'math.h' provides (or should provide) values for:
9   -// pi M_PI
10   -// 2/pi M_2_PI
11   -// pi/4 M_PI_4
12   -// pi/2 M_PI_2
13   -//
14   -#define _USE_MATH_DEFINES
15   -#include <math.h>
16   -#include "bessel.h"
17   -
18   -double gamma(double x);
19   -//
20   -// INPUT:
21   -// double x -- argument of Bessel function
22   -//
23   -// OUTPUT (via address pointers):
24   -// double j0 -- Bessel function of 1st kind, 0th order
25   -// double j1 -- Bessel function of 1st kind, 1st order
26   -// double y0 -- Bessel function of 2nd kind, 0th order
27   -// double y1 -- Bessel function of 2nd kind, 1st order
28   -// double j0p -- derivative of Bessel function of 1st kind, 0th order
29   -// double j1p -- derivative of Bessel function of 1st kind, 1st order
30   -// double y0p -- derivative of Bessel function of 2nd kind, 0th order
31   -// double y1p -- derivative of Bessel function of 2nd kind, 1st order
32   -//
33   -// RETURN:
34   -// int error code: 0 = OK, 1 = error
35   -//
36   -// This algorithm computes the above functions using series expansions.
37   -//
38   -int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1,
39   - double &j0p,double &j1p,double &y0p,double &y1p)
40   -{
41   - double x2,r,ec,w0,w1,r0,r1,cs0,cs1;
42   - double cu,p0,q0,p1,q1,t1,t2;
43   - int k,kz;
44   - static double a[] = {
45   - -7.03125e-2,
46   - 0.112152099609375,
47   - -0.5725014209747314,
48   - 6.074042001273483,
49   - -1.100171402692467e2,
50   - 3.038090510922384e3,
51   - -1.188384262567832e5,
52   - 6.252951493434797e6,
53   - -4.259392165047669e8,
54   - 3.646840080706556e10,
55   - -3.833534661393944e12,
56   - 4.854014686852901e14,
57   - -7.286857349377656e16,
58   - 1.279721941975975e19};
59   - static double b[] = {
60   - 7.32421875e-2,
61   - -0.2271080017089844,
62   - 1.727727502584457,
63   - -2.438052969955606e1,
64   - 5.513358961220206e2,
65   - -1.825775547429318e4,
66   - 8.328593040162893e5,
67   - -5.006958953198893e7,
68   - 3.836255180230433e9,
69   - -3.649010818849833e11,
70   - 4.218971570284096e13,
71   - -5.827244631566907e15,
72   - 9.476288099260110e17,
73   - -1.792162323051699e20};
74   - static double a1[] = {
75   - 0.1171875,
76   - -0.1441955566406250,
77   - 0.6765925884246826,
78   - -6.883914268109947,
79   - 1.215978918765359e2,
80   - -3.302272294480852e3,
81   - 1.276412726461746e5,
82   - -6.656367718817688e6,
83   - 4.502786003050393e8,
84   - -3.833857520742790e10,
85   - 4.011838599133198e12,
86   - -5.060568503314727e14,
87   - 7.572616461117958e16,
88   - -1.326257285320556e19};
89   - static double b1[] = {
90   - -0.1025390625,
91   - 0.2775764465332031,
92   - -1.993531733751297,
93   - 2.724882731126854e1,
94   - -6.038440767050702e2,
95   - 1.971837591223663e4,
96   - -8.902978767070678e5,
97   - 5.310411010968522e7,
98   - -4.043620325107754e9,
99   - 3.827011346598605e11,
100   - -4.406481417852278e13,
101   - 6.065091351222699e15,
102   - -9.833883876590679e17,
103   - 1.855045211579828e20};
104   -
105   - if (x < 0.0) return 1;
106   - if (x == 0.0) {
107   - j0 = 1.0;
108   - j1 = 0.0;
109   - y0 = -1e308;
110   - y1 = -1e308;
111   - j0p = 0.0;
112   - j1p = 0.5;
113   - y0p = 1e308;
114   - y1p = 1e308;
115   - return 0;
116   - }
117   - x2 = x*x;
118   - if (x <= 12.0) {
119   - j0 = 1.0;
120   - r = 1.0;
121   - for (k=1;k<=30;k++) {
122   - r *= -0.25*x2/(k*k);
123   - j0 += r;
124   - if (fabs(r) < fabs(j0)*1e-15) break;
125   - }
126   - j1 = 1.0;
127   - r = 1.0;
128   - for (k=1;k<=30;k++) {
129   - r *= -0.25*x2/(k*(k+1));
130   - j1 += r;
131   - if (fabs(r) < fabs(j1)*1e-15) break;
132   - }
133   - j1 *= 0.5*x;
134   - ec = log(0.5*x)+el;
135   - cs0 = 0.0;
136   - w0 = 0.0;
137   - r0 = 1.0;
138   - for (k=1;k<=30;k++) {
139   - w0 += 1.0/k;
140   - r0 *= -0.25*x2/(k*k);
141   - r = r0 * w0;
142   - cs0 += r;
143   - if (fabs(r) < fabs(cs0)*1e-15) break;
144   - }
145   - y0 = M_2_PI*(ec*j0-cs0);
146   - cs1 = 1.0;
147   - w1 = 0.0;
148   - r1 = 1.0;
149   - for (k=1;k<=30;k++) {
150   - w1 += 1.0/k;
151   - r1 *= -0.25*x2/(k*(k+1));
152   - r = r1*(2.0*w1+1.0/(k+1));
153   - cs1 += r;
154   - if (fabs(r) < fabs(cs1)*1e-15) break;
155   - }
156   - y1 = M_2_PI * (ec*j1-1.0/x-0.25*x*cs1);
157   - }
158   - else {
159   - if (x >= 50.0) kz = 8; // Can be changed to 10
160   - else if (x >= 35.0) kz = 10; // " " 12
161   - else kz = 12; // " " 14
162   - t1 = x-M_PI_4;
163   - p0 = 1.0;
164   - q0 = -0.125/x;
165   - for (k=0;k<kz;k++) {
166   - p0 += a[k]*pow(x,-2*k-2);
167   - q0 += b[k]*pow(x,-2*k-3);
168   - }
169   - cu = sqrt(M_2_PI/x);
170   - j0 = cu*(p0*cos(t1)-q0*sin(t1));
171   - y0 = cu*(p0*sin(t1)+q0*cos(t1));
172   - t2 = x-0.75*M_PI;
173   - p1 = 1.0;
174   - q1 = 0.375/x;
175   - for (k=0;k<kz;k++) {
176   - p1 += a1[k]*pow(x,-2*k-2);
177   - q1 += b1[k]*pow(x,-2*k-3);
178   - }
179   - j1 = cu*(p1*cos(t2)-q1*sin(t2));
180   - y1 = cu*(p1*sin(t2)+q1*cos(t2));
181   - }
182   - j0p = -j1;
183   - j1p = j0-j1/x;
184   - y0p = -y1;
185   - y1p = y0-y1/x;
186   - return 0;
187   -}
188   -//
189   -// INPUT:
190   -// double x -- argument of Bessel function
191   -//
192   -// OUTPUT:
193   -// double j0 -- Bessel function of 1st kind, 0th order
194   -// double j1 -- Bessel function of 1st kind, 1st order
195   -// double y0 -- Bessel function of 2nd kind, 0th order
196   -// double y1 -- Bessel function of 2nd kind, 1st order
197   -// double j0p -- derivative of Bessel function of 1st kind, 0th order
198   -// double j1p -- derivative of Bessel function of 1st kind, 1st order
199   -// double y0p -- derivative of Bessel function of 2nd kind, 0th order
200   -// double y1p -- derivative of Bessel function of 2nd kind, 1st order
201   -//
202   -// RETURN:
203   -// int error code: 0 = OK, 1 = error
204   -//
205   -// This algorithm computes the functions using polynomial approximations.
206   -//
207   -int bessjy01b(double x,double &j0,double &j1,double &y0,double &y1,
208   - double &j0p,double &j1p,double &y0p,double &y1p)
209   -{
210   - double t,t2,dtmp,a0,p0,q0,p1,q1,ta0,ta1;
211   - if (x < 0.0) return 1;
212   - if (x == 0.0) {
213   - j0 = 1.0;
214   - j1 = 0.0;
215   - y0 = -1e308;
216   - y1 = -1e308;
217   - j0p = 0.0;
218   - j1p = 0.5;
219   - y0p = 1e308;
220   - y1p = 1e308;
221   - return 0;
222   - }
223   - if(x <= 4.0) {
224   - t = x/4.0;
225   - t2 = t*t;
226   - j0 = ((((((-0.5014415e-3*t2+0.76771853e-2)*t2-0.0709253492)*t2+
227   - 0.4443584263)*t2-1.7777560599)*t2+3.9999973021)*t2
228   - -3.9999998721)*t2+1.0;
229   - j1 = t*(((((((-0.1289769e-3*t2+0.22069155e-2)*t2-0.0236616773)*t2+
230   - 0.1777582922)*t2-0.8888839649)*t2+2.6666660544)*t2-
231   - 3.999999971)*t2+1.9999999998);
232   - dtmp = (((((((-0.567433e-4*t2+0.859977e-3)*t2-0.94855882e-2)*t2+
233   - 0.0772975809)*t2-0.4261737419)*t2+1.4216421221)*t2-
234   - 2.3498519931)*t2+1.0766115157)*t2+0.3674669052;
235   - y0 = M_2_PI*log(0.5*x)*j0+dtmp;
236   - dtmp = (((((((0.6535773e-3*t2-0.0108175626)*t2+0.107657607)*t2-
237   - 0.7268945577)*t2+3.1261399273)*t2-7.3980241381)*t2+
238   - 6.8529236342)*t2+0.3932562018)*t2-0.6366197726;
239   - y1 = M_2_PI*log(0.5*x)*j1+dtmp/x;
240   - }
241   - else {
242   - t = 4.0/x;
243   - t2 = t*t;
244   - a0 = sqrt(M_2_PI/x);
245   - p0 = ((((-0.9285e-5*t2+0.43506e-4)*t2-0.122226e-3)*t2+
246   - 0.434725e-3)*t2-0.4394275e-2)*t2+0.999999997;
247   - q0 = t*(((((0.8099e-5*t2-0.35614e-4)*t2+0.85844e-4)*t2-
248   - 0.218024e-3)*t2+0.1144106e-2)*t2-0.031249995);
249   - ta0 = x-M_PI_4;
250   - j0 = a0*(p0*cos(ta0)-q0*sin(ta0));
251   - y0 = a0*(p0*sin(ta0)+q0*cos(ta0));
252   - p1 = ((((0.10632e-4*t2-0.50363e-4)*t2+0.145575e-3)*t2
253   - -0.559487e-3)*t2+0.7323931e-2)*t2+1.000000004;
254   - q1 = t*(((((-0.9173e-5*t2+0.40658e-4)*t2-0.99941e-4)*t2
255   - +0.266891e-3)*t2-0.1601836e-2)*t2+0.093749994);
256   - ta1 = x-0.75*M_PI;
257   - j1 = a0*(p1*cos(ta1)-q1*sin(ta1));
258   - y1 = a0*(p1*sin(ta1)+q1*cos(ta1));
259   - }
260   - j0p = -j1;
261   - j1p = j0-j1/x;
262   - y0p = -y1;
263   - y1p = y0-y1/x;
264   - return 0;
265   -}
266   -int msta1(double x,int mp)
267   -{
268   - double a0,f0,f1,f;
269   - int i,n0,n1,nn;
270   -
271   - a0 = fabs(x);
272   - n0 = (int)(1.1*a0)+1;
273   - f0 = 0.5*log10(6.28*n0)-n0*log10(1.36*a0/n0)-mp;
274   - n1 = n0+5;
275   - f1 = 0.5*log10(6.28*n1)-n1*log10(1.36*a0/n1)-mp;
276   - for (i=0;i<20;i++) {
277   - nn = (int)(n1-(n1-n0)/(1.0-f0/f1));
278   - f = 0.5*log10(6.28*nn)-nn*log10(1.36*a0/nn)-mp;
279   - if (abs(nn-n1) < 1) break;
280   - n0 = n1;
281   - f0 = f1;
282   - n1 = nn;
283   - f1 = f;
284   - }
285   - return nn;
286   -}
287   -int msta2(double x,int n,int mp)
288   -{
289   - double a0,ejn,hmp,f0,f1,f,obj;
290   - int i,n0,n1,nn;
291   -
292   - a0 = fabs(x);
293   - hmp = 0.5*mp;
294   - ejn = 0.5*log10(6.28*n)-n*log10(1.36*a0/n);
295   - if (ejn <= hmp) {
296   - obj = mp;
297   - n0 = (int)(1.1*a0);
298   - if (n0 < 1) n0 = 1;
299   - }
300   - else {
301   - obj = hmp+ejn;
302   - n0 = n;
303   - }
304   - f0 = 0.5*log10(6.28*n0)-n0*log10(1.36*a0/n0)-obj;
305   - n1 = n0+5;
306   - f1 = 0.5*log10(6.28*n1)-n1*log10(1.36*a0/n1)-obj;
307   - for (i=0;i<20;i++) {
308   - nn = (int)(n1-(n1-n0)/(1.0-f0/f1));
309   - f = 0.5*log10(6.28*nn)-nn*log10(1.36*a0/nn)-obj;
310   - if (abs(nn-n1) < 1) break;
311   - n0 = n1;
312   - f0 = f1;
313   - n1 = nn;
314   - f1 = f;
315   - }
316   - return nn+10;
317   -}
318   -//
319   -// INPUT:
320   -// double x -- argument of Bessel function of 1st and 2nd kind.
321   -// int n -- order
322   -//
323   -// OUPUT:
324   -//
325   -// int nm -- highest order actually computed (nm <= n)
326   -// double jn[] -- Bessel function of 1st kind, orders from 0 to nm
327   -// double yn[] -- Bessel function of 2nd kind, orders from 0 to nm
328   -// double j'n[]-- derivative of Bessel function of 1st kind,
329   -// orders from 0 to nm
330   -// double y'n[]-- derivative of Bessel function of 2nd kind,
331   -// orders from 0 to nm
332   -//
333   -// Computes Bessel functions of all order up to 'n' using recurrence
334   -// relations. If 'nm' < 'n' only 'nm' orders are returned.
335   -//
336   -int bessjyna(int n,double x,int &nm,double *jn,double *yn,
337   - double *jnp,double *ynp)
338   -{
339   - double bj0,bj1,f,f0,f1,f2,cs;
340   - int i,k,m,ecode;
341   -
342   - nm = n;
343   - if ((x < 0.0) || (n < 0)) return 1;
344   - if (x < 1e-15) {
345   - for (i=0;i<=n;i++) {
346   - jn[i] = 0.0;
347   - yn[i] = -1e308;
348   - jnp[i] = 0.0;
349   - ynp[i] = 1e308;
350   - }
351   - jn[0] = 1.0;
352   - jnp[1] = 0.5;
353   - return 0;
354   - }
355   - ecode = bessjy01a(x,jn[0],jn[1],yn[0],yn[1],jnp[0],jnp[1],ynp[0],ynp[1]);
356   - if (n < 2) return 0;
357   - bj0 = jn[0];
358   - bj1 = jn[1];
359   - if (n < (int)0.9*x) {
360   - for (k=2;k<=n;k++) {
361   - jn[k] = 2.0*(k-1.0)*bj1/x-bj0;
362   - bj0 = bj1;
363   - bj1 = jn[k];
364   - }
365   - }
366   - else {
367   - m = msta1(x,200);
368   - if (m < n) nm = m;
369   - else m = msta2(x,n,15);
370   - f2 = 0.0;
371   - f1 = 1.0e-100;
372   - for (k=m;k>=0;k--) {
373   - f = 2.0*(k+1.0)/x*f1-f2;
374   - if (k <= nm) jn[k] = f;
375   - f2 = f1;
376   - f1 = f;
377   - }
378   - if (fabs(bj0) > fabs(bj1)) cs = bj0/f;
379   - else cs = bj1/f2;
380   - for (k=0;k<=nm;k++) {
381   - jn[k] *= cs;
382   - }
383   - }
384   - for (k=2;k<=nm;k++) {
385   - jnp[k] = jn[k-1]-k*jn[k]/x;
386   - }
387   - f0 = yn[0];
388   - f1 = yn[1];
389   - for (k=2;k<=nm;k++) {
390   - f = 2.0*(k-1.0)*f1/x-f0;
391   - yn[k] = f;
392   - f0 = f1;
393   - f1 = f;
394   - }
395   - for (k=2;k<=nm;k++) {
396   - ynp[k] = yn[k-1]-k*yn[k]/x;
397   - }
398   - return 0;
399   -}
400   -//
401   -// Same input and output conventions as above. Different recurrence
402   -// relations used for 'x' < 300.
403   -//
404   -int bessjynb(int n,double x,int &nm,double *jn,double *yn,
405   - double *jnp,double *ynp)
406   -{
407   - double t1,t2,f,f1,f2,bj0,bj1,bjk,by0,by1,cu,s0,su,sv;
408   - double ec,bs,byk,p0,p1,q0,q1;
409   - static double a[] = {
410   - -0.7031250000000000e-1,
411   - 0.1121520996093750,
412   - -0.5725014209747314,
413   - 6.074042001273483};
414   - static double b[] = {
415   - 0.7324218750000000e-1,
416   - -0.2271080017089844,
417   - 1.727727502584457,
418   - -2.438052969955606e1};
419   - static double a1[] = {
420   - 0.1171875,
421   - -0.1441955566406250,
422   - 0.6765925884246826,
423   - -6.883914268109947};
424   - static double b1[] = {
425   - -0.1025390625,
426   - 0.2775764465332031,
427   - -1.993531733751297,
428   - 2.724882731126854e1};
429   -
430   - int i,k,m;
431   - nm = n;
432   - if ((x < 0.0) || (n < 0)) return 1;
433   - if (x < 1e-15) {
434   - for (i=0;i<=n;i++) {
435   - jn[i] = 0.0;
436   - yn[i] = -1e308;
437   - jnp[i] = 0.0;
438   - ynp[i] = 1e308;
439   - }
440   - jn[0] = 1.0;
441   - jnp[1] = 0.5;
442   - return 0;
443   - }
444   - if (x <= 300.0 || n > (int)(0.9*x)) {
445   - if (n == 0) nm = 1;
446   - m = msta1(x,200);
447   - if (m < nm) nm = m;
448   - else m = msta2(x,nm,15);
449   - bs = 0.0;
450   - su = 0.0;
451   - sv = 0.0;
452   - f2 = 0.0;
453   - f1 = 1.0e-100;
454   - for (k = m;k>=0;k--) {
455   - f = 2.0*(k+1.0)/x*f1 - f2;
456   - if (k <= nm) jn[k] = f;
457   - if ((k == 2*(int)(k/2)) && (k != 0)) {
458   - bs += 2.0*f;
459   -// su += pow(-1,k>>1)*f/(double)k;
460   - su += (-1)*((k & 2)-1)*f/(double)k;
461   - }
462   - else if (k > 1) {
463   -// sv += pow(-1,k>>1)*k*f/(k*k-1.0);
464   - sv += (-1)*((k & 2)-1)*(double)k*f/(k*k-1.0);
465   - }
466   - f2 = f1;
467   - f1 = f;
468   - }
469   - s0 = bs+f;
470   - for (k=0;k<=nm;k++) {
471   - jn[k] /= s0;
472   - }
473   - ec = log(0.5*x) +0.5772156649015329;
474   - by0 = M_2_PI*(ec*jn[0]-4.0*su/s0);
475   - yn[0] = by0;
476   - by1 = M_2_PI*((ec-1.0)*jn[1]-jn[0]/x-4.0*sv/s0);
477   - yn[1] = by1;
478   - }
479   - else {
480   - t1 = x-M_PI_4;
481   - p0 = 1.0;
482   - q0 = -0.125/x;
483   - for (k=0;k<4;k++) {
484   - p0 += a[k]*pow(x,-2*k-2);
485   - q0 += b[k]*pow(x,-2*k-3);
486   - }
487   - cu = sqrt(M_2_PI/x);
488   - bj0 = cu*(p0*cos(t1)-q0*sin(t1));
489   - by0 = cu*(p0*sin(t1)+q0*cos(t1));
490   - jn[0] = bj0;
491   - yn[0] = by0;
492   - t2 = x-0.75*M_PI;
493   - p1 = 1.0;
494   - q1 = 0.375/x;
495   - for (k=0;k<4;k++) {
496   - p1 += a1[k]*pow(x,-2*k-2);
497   - q1 += b1[k]*pow(x,-2*k-3);
498   - }
499   - bj1 = cu*(p1*cos(t2)-q1*sin(t2));
500   - by1 = cu*(p1*sin(t2)+q1*cos(t2));
501   - jn[1] = bj1;
502   - yn[1] = by1;
503   - for (k=2;k<=nm;k++) {
504   - bjk = 2.0*(k-1.0)*bj1/x-bj0;
505   - jn[k] = bjk;
506   - bj0 = bj1;
507   - bj1 = bjk;
508   - }
509   - }
510   - jnp[0] = -jn[1];
511   - for (k=1;k<=nm;k++) {
512   - jnp[k] = jn[k-1]-k*jn[k]/x;
513   - }
514   - for (k=2;k<=nm;k++) {
515   - byk = 2.0*(k-1.0)*by1/x-by0;
516   - yn[k] = byk;
517   - by0 = by1;
518   - by1 = byk;
519   - }
520   - ynp[0] = -yn[1];
521   - for (k=1;k<=nm;k++) {
522   - ynp[k] = yn[k-1]-k*yn[k]/x;
523   - }
524   - return 0;
525   -
526   -}
527   -
528   -// The following routine computes Bessel Jv(x) and Yv(x) for
529   -// arbitrary positive order (v). For negative order, use:
530   -//
531   -// J-v(x) = Jv(x)cos(v pi) - Yv(x)sin(v pi)
532   -// Y-v(x) = Jv(x)sin(v pi) + Yv(x)cos(v pi)
533   -//
534   -int bessjyv(double v,double x,double &vm,double *jv,double *yv,
535   - double *djv,double *dyv)
536   -{
537   - double v0,vl,vg,vv,a,a0,r,x2,bjv0,bjv1,bjvl,f,f0,f1,f2;
538   - double r0,r1,ck,cs,cs0,cs1,sk,qx,px,byv0,byv1,rp,xk,rq;
539   - double b,ec,w0,w1,bju0,bju1,pv0,pv1,byvk;
540   - int j,k,l,m,n,kz;
541   -
542   - x2 = x*x;
543   - n = (int)v;
544   - v0 = v-n;
545   - if ((x < 0.0) || (v < 0.0)) return 1;
546   - if (x < 1e-15) {
547   - for (k=0;k<=n;k++) {
548   - jv[k] = 0.0;
549   - yv[k] = -1e308;
550   - djv[k] = 0.0;
551   - dyv[k] = 1e308;
552   - if (v0 == 0.0) {
553   - jv[0] = 1.0;
554   - djv[1] = 0.5;
555   - }
556   - else djv[0] = 1e308;
557   - }
558   - vm = v;
559   - return 0;
560   - }
561   - if (x <= 12.0) {
562   - for (l=0;l<2;l++) {
563   - vl = v0 + l;
564   - bjvl = 1.0;
565   - r = 1.0;
566   - for (k=1;k<=40;k++) {
567   - r *= -0.25*x2/(k*(k+vl));
568   - bjvl += r;
569   - if (fabs(r) < fabs(bjvl)*1e-15) break;
570   - }
571   - vg = 1.0 + vl;
572   - a = pow(0.5*x,vl)/gamma(vg);
573   - if (l == 0) bjv0 = bjvl*a;
574   - else bjv1 = bjvl*a;
575   - }
576   - }
577   - else {
578   - if (x >= 50.0) kz = 8;
579   - else if (x >= 35.0) kz = 10;
580   - else kz = 11;
581   - for (j=0;j<2;j++) {
582   - vv = 4.0*(j+v0)*(j+v0);
583   - px = 1.0;
584   - rp = 1.0;
585   - for (k=1;k<=kz;k++) {
586   - rp *= (-0.78125e-2)*(vv-pow(4.0*k-3.0,2.0))*
587   - (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*x2);
588   - px += rp;
589   - }
590   - qx = 1.0;
591   - rq = 1.0;
592   - for (k=1;k<=kz;k++) {
593   - rq *= (-0.78125e-2)*(vv-pow(4.0*k-1.0,2.0))*
594   - (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*x2);
595   - qx += rq;
596   - }
597   - qx *= 0.125*(vv-1.0)/x;
598   - xk = x-(0.5*(j+v0)+0.25)*M_PI;
599   - a0 = sqrt(M_2_PI/x);
600   - ck = cos(xk);
601   - sk = sin(xk);
602   -
603   - if (j == 0) {
604   - bjv0 = a0*(px*ck-qx*sk);
605   - byv0 = a0*(px*sk+qx*ck);
606   - }
607   - else if (j == 1) {
608   - bjv1 = a0*(px*ck-qx*sk);
609   - byv1 = a0*(px*sk+qx*ck);
610   - }
611   - }
612   - }
613   - jv[0] = bjv0;
614   - jv[1] = bjv1;
615   - djv[0] = v0*jv[0]/x-jv[1];
616   - djv[1] = -(1.0+v0)*jv[1]/x+jv[0];
617   - if ((n >= 2) && (n <= (int)(0.9*x))) {
618   - f0 = bjv0;
619   - f1 = bjv1;
620   - for (k=2;k<=n;k++) {
621   - f = 2.0*(k+v0-1.0)*f1/x-f0;
622   - jv[k] = f;
623   - f0 = f1;
624   - f1 = f;
625   - }
626   - }
627   - else if (n >= 2) {
628   - m = msta1(x,200);
629   - if (m < n) n = m;
630   - else m = msta2(x,n,15);
631   - f2 = 0.0;
632   - f1 = 1.0e-100;
633   - for (k=m;k>=0;k--) {
634   - f = 2.0*(v0+k+1.0)*f1/x-f2;
635   - if (k <= n) jv[k] = f;
636   - f2 = f1;
637   - f1 = f;
638   - }
639   - if (fabs(bjv0) > fabs(bjv1)) cs = bjv0/f;
640   - else cs = bjv1/f2;
641   - for (k=0;k<=n;k++) {
642   - jv[k] *= cs;
643   - }
644   - }
645   - for (k=2;k<=n;k++) {
646   - djv[k] = -(k+v0)*jv[k]/x+jv[k-1];
647   - }
648   - if (x <= 12.0) {
649   - if (v0 != 0.0) {
650   - for (l=0;l<2;l++) {
651   - vl = v0 +l;
652   - bjvl = 1.0;
653   - r = 1.0;
654   - for (k=1;k<=40;k++) {
655   - r *= -0.25*x2/(k*(k-vl));
656   - bjvl += r;
657   - if (fabs(r) < fabs(bjvl)*1e-15) break;
658   - }
659   - vg = 1.0-vl;
660   - b = pow(2.0/x,vl)/gamma(vg);
661   - if (l == 0) bju0 = bjvl*b;
662   - else bju1 = bjvl*b;
663   - }
664   - pv0 = M_PI*v0;
665   - pv1 = M_PI*(1.0+v0);
666   - byv0 = (bjv0*cos(pv0)-bju0)/sin(pv0);
667   - byv1 = (bjv1*cos(pv1)-bju1)/sin(pv1);
668   - }
669   - else {
670   - ec = log(0.5*x)+el;
671   - cs0 = 0.0;
672   - w0 = 0.0;
673   - r0 = 1.0;
674   - for (k=1;k<=30;k++) {
675   - w0 += 1.0/k;
676   - r0 *= -0.25*x2/(k*k);
677   - cs0 += r0*w0;
678   - }
679   - byv0 = M_2_PI*(ec*bjv0-cs0);
680   - cs1 = 1.0;
681   - w1 = 0.0;
682   - r1 = 1.0;
683   - for (k=1;k<=30;k++) {
684   - w1 += 1.0/k;
685   - r1 *= -0.25*x2/(k*(k+1));
686   - cs1 += r1*(2.0*w1+1.0/(k+1.0));
687   - }
688   - byv1 = M_2_PI*(ec*bjv1-1.0/x-0.25*x*cs1);
689   - }
690   - }
691   - yv[0] = byv0;
692   - yv[1] = byv1;
693   - for (k=2;k<=n;k++) {
694   - byvk = 2.0*(v0+k-1.0)*byv1/x-byv0;
695   - yv[k] = byvk;
696   - byv0 = byv1;
697   - byv1 = byvk;
698   - }
699   - dyv[0] = v0*yv[0]/x-yv[1];
700   - for (k=1;k<=n;k++) {
701   - dyv[k] = -(k+v0)*yv[k]/x+yv[k-1];
702   - }
703   - vm = n + v0;
704   - return 0;
705   -}
706   -
  1 +// bessjy.cpp -- computation of Bessel functions Jn, Yn and their
  2 +// derivatives. Algorithms and coefficient values from
  3 +// "Computation of Special Functions", Zhang and Jin, John
  4 +// Wiley and Sons, 1996.
  5 +//
  6 +// (C) 2003, C. Bond. All rights reserved.
  7 +//
  8 +// Note that 'math.h' provides (or should provide) values for:
  9 +// pi M_PI
  10 +// 2/pi M_2_PI
  11 +// pi/4 M_PI_4
  12 +// pi/2 M_PI_2
  13 +//
  14 +#define _USE_MATH_DEFINES
  15 +#include <math.h>
  16 +#include "bessel.h"
  17 +
  18 +double gamma(double x);
  19 +//
  20 +// INPUT:
  21 +// double x -- argument of Bessel function
  22 +//
  23 +// OUTPUT (via address pointers):
  24 +// double j0 -- Bessel function of 1st kind, 0th order
  25 +// double j1 -- Bessel function of 1st kind, 1st order
  26 +// double y0 -- Bessel function of 2nd kind, 0th order
  27 +// double y1 -- Bessel function of 2nd kind, 1st order
  28 +// double j0p -- derivative of Bessel function of 1st kind, 0th order
  29 +// double j1p -- derivative of Bessel function of 1st kind, 1st order
  30 +// double y0p -- derivative of Bessel function of 2nd kind, 0th order
  31 +// double y1p -- derivative of Bessel function of 2nd kind, 1st order
  32 +//
  33 +// RETURN:
  34 +// int error code: 0 = OK, 1 = error
  35 +//
  36 +// This algorithm computes the above functions using series expansions.
  37 +//
  38 +int bessjy01a(double x,double &j0,double &j1,double &y0,double &y1,
  39 + double &j0p,double &j1p,double &y0p,double &y1p)
  40 +{
  41 + double x2,r,ec,w0,w1,r0,r1,cs0,cs1;
  42 + double cu,p0,q0,p1,q1,t1,t2;
  43 + int k,kz;
  44 + static double a[] = {
  45 + -7.03125e-2,
  46 + 0.112152099609375,
  47 + -0.5725014209747314,
  48 + 6.074042001273483,
  49 + -1.100171402692467e2,
  50 + 3.038090510922384e3,
  51 + -1.188384262567832e5,
  52 + 6.252951493434797e6,
  53 + -4.259392165047669e8,
  54 + 3.646840080706556e10,
  55 + -3.833534661393944e12,
  56 + 4.854014686852901e14,
  57 + -7.286857349377656e16,
  58 + 1.279721941975975e19};
  59 + static double b[] = {
  60 + 7.32421875e-2,
  61 + -0.2271080017089844,
  62 + 1.727727502584457,
  63 + -2.438052969955606e1,
  64 + 5.513358961220206e2,
  65 + -1.825775547429318e4,
  66 + 8.328593040162893e5,
  67 + -5.006958953198893e7,
  68 + 3.836255180230433e9,
  69 + -3.649010818849833e11,
  70 + 4.218971570284096e13,
  71 + -5.827244631566907e15,
  72 + 9.476288099260110e17,
  73 + -1.792162323051699e20};
  74 + static double a1[] = {
  75 + 0.1171875,
  76 + -0.1441955566406250,
  77 + 0.6765925884246826,
  78 + -6.883914268109947,
  79 + 1.215978918765359e2,
  80 + -3.302272294480852e3,
  81 + 1.276412726461746e5,
  82 + -6.656367718817688e6,
  83 + 4.502786003050393e8,
  84 + -3.833857520742790e10,
  85 + 4.011838599133198e12,
  86 + -5.060568503314727e14,
  87 + 7.572616461117958e16,
  88 + -1.326257285320556e19};
  89 + static double b1[] = {
  90 + -0.1025390625,
  91 + 0.2775764465332031,
  92 + -1.993531733751297,
  93 + 2.724882731126854e1,
  94 + -6.038440767050702e2,
  95 + 1.971837591223663e4,
  96 + -8.902978767070678e5,
  97 + 5.310411010968522e7,
  98 + -4.043620325107754e9,
  99 + 3.827011346598605e11,
  100 + -4.406481417852278e13,
  101 + 6.065091351222699e15,
  102 + -9.833883876590679e17,
  103 + 1.855045211579828e20};
  104 +
  105 + if (x < 0.0) return 1;
  106 + if (x == 0.0) {
  107 + j0 = 1.0;
  108 + j1 = 0.0;
  109 + y0 = -1e308;
  110 + y1 = -1e308;
  111 + j0p = 0.0;
  112 + j1p = 0.5;
  113 + y0p = 1e308;
  114 + y1p = 1e308;
  115 + return 0;
  116 + }
  117 + x2 = x*x;
  118 + if (x <= 12.0) {
  119 + j0 = 1.0;
  120 + r = 1.0;
  121 + for (k=1;k<=30;k++) {
  122 + r *= -0.25*x2/(k*k);
  123 + j0 += r;
  124 + if (fabs(r) < fabs(j0)*1e-15) break;
  125 + }
  126 + j1 = 1.0;
  127 + r = 1.0;
  128 + for (k=1;k<=30;k++) {
  129 + r *= -0.25*x2/(k*(k+1));
  130 + j1 += r;
  131 + if (fabs(r) < fabs(j1)*1e-15) break;
  132 + }
  133 + j1 *= 0.5*x;
  134 + ec = log(0.5*x)+el;
  135 + cs0 = 0.0;
  136 + w0 = 0.0;
  137 + r0 = 1.0;
  138 + for (k=1;k<=30;k++) {
  139 + w0 += 1.0/k;
  140 + r0 *= -0.25*x2/(k*k);
  141 + r = r0 * w0;
  142 + cs0 += r;
  143 + if (fabs(r) < fabs(cs0)*1e-15) break;
  144 + }
  145 + y0 = M_2_PI*(ec*j0-cs0);
  146 + cs1 = 1.0;
  147 + w1 = 0.0;
  148 + r1 = 1.0;
  149 + for (k=1;k<=30;k++) {
  150 + w1 += 1.0/k;
  151 + r1 *= -0.25*x2/(k*(k+1));
  152 + r = r1*(2.0*w1+1.0/(k+1));
  153 + cs1 += r;
  154 + if (fabs(r) < fabs(cs1)*1e-15) break;
  155 + }
  156 + y1 = M_2_PI * (ec*j1-1.0/x-0.25*x*cs1);
  157 + }
  158 + else {
  159 + if (x >= 50.0) kz = 8; // Can be changed to 10
  160 + else if (x >= 35.0) kz = 10; // " " 12
  161 + else kz = 12; // " " 14
  162 + t1 = x-M_PI_4;
  163 + p0 = 1.0;
  164 + q0 = -0.125/x;
  165 + for (k=0;k<kz;k++) {
  166 + p0 += a[k]*pow(x,-2*k-2);
  167 + q0 += b[k]*pow(x,-2*k-3);
  168 + }
  169 + cu = sqrt(M_2_PI/x);
  170 + j0 = cu*(p0*cos(t1)-q0*sin(t1));
  171 + y0 = cu*(p0*sin(t1)+q0*cos(t1));
  172 + t2 = x-0.75*M_PI;
  173 + p1 = 1.0;
  174 + q1 = 0.375/x;
  175 + for (k=0;k<kz;k++) {
  176 + p1 += a1[k]*pow(x,-2*k-2);
  177 + q1 += b1[k]*pow(x,-2*k-3);
  178 + }
  179 + j1 = cu*(p1*cos(t2)-q1*sin(t2));
  180 + y1 = cu*(p1*sin(t2)+q1*cos(t2));
  181 + }
  182 + j0p = -j1;
  183 + j1p = j0-j1/x;
  184 + y0p = -y1;
  185 + y1p = y0-y1/x;
  186 + return 0;
  187 +}
  188 +//
  189 +// INPUT:
  190 +// double x -- argument of Bessel function
  191 +//
  192 +// OUTPUT:
  193 +// double j0 -- Bessel function of 1st kind, 0th order
  194 +// double j1 -- Bessel function of 1st kind, 1st order
  195 +// double y0 -- Bessel function of 2nd kind, 0th order
  196 +// double y1 -- Bessel function of 2nd kind, 1st order
  197 +// double j0p -- derivative of Bessel function of 1st kind, 0th order
  198 +// double j1p -- derivative of Bessel function of 1st kind, 1st order
  199 +// double y0p -- derivative of Bessel function of 2nd kind, 0th order
  200 +// double y1p -- derivative of Bessel function of 2nd kind, 1st order
  201 +//
  202 +// RETURN:
  203 +// int error code: 0 = OK, 1 = error
  204 +//
  205 +// This algorithm computes the functions using polynomial approximations.
  206 +//
  207 +int bessjy01b(double x,double &j0,double &j1,double &y0,double &y1,
  208 + double &j0p,double &j1p,double &y0p,double &y1p)
  209 +{
  210 + double t,t2,dtmp,a0,p0,q0,p1,q1,ta0,ta1;
  211 + if (x < 0.0) return 1;
  212 + if (x == 0.0) {
  213 + j0 = 1.0;
  214 + j1 = 0.0;
  215 + y0 = -1e308;
  216 + y1 = -1e308;
  217 + j0p = 0.0;
  218 + j1p = 0.5;
  219 + y0p = 1e308;
  220 + y1p = 1e308;
  221 + return 0;
  222 + }
  223 + if(x <= 4.0) {
  224 + t = x/4.0;
  225 + t2 = t*t;
  226 + j0 = ((((((-0.5014415e-3*t2+0.76771853e-2)*t2-0.0709253492)*t2+
  227 + 0.4443584263)*t2-1.7777560599)*t2+3.9999973021)*t2
  228 + -3.9999998721)*t2+1.0;
  229 + j1 = t*(((((((-0.1289769e-3*t2+0.22069155e-2)*t2-0.0236616773)*t2+
  230 + 0.1777582922)*t2-0.8888839649)*t2+2.6666660544)*t2-
  231 + 3.999999971)*t2+1.9999999998);
  232 + dtmp = (((((((-0.567433e-4*t2+0.859977e-3)*t2-0.94855882e-2)*t2+
  233 + 0.0772975809)*t2-0.4261737419)*t2+1.4216421221)*t2-
  234 + 2.3498519931)*t2+1.0766115157)*t2+0.3674669052;
  235 + y0 = M_2_PI*log(0.5*x)*j0+dtmp;
  236 + dtmp = (((((((0.6535773e-3*t2-0.0108175626)*t2+0.107657607)*t2-
  237 + 0.7268945577)*t2+3.1261399273)*t2-7.3980241381)*t2+
  238 + 6.8529236342)*t2+0.3932562018)*t2-0.6366197726;
  239 + y1 = M_2_PI*log(0.5*x)*j1+dtmp/x;
  240 + }
  241 + else {
  242 + t = 4.0/x;
  243 + t2 = t*t;
  244 + a0 = sqrt(M_2_PI/x);
  245 + p0 = ((((-0.9285e-5*t2+0.43506e-4)*t2-0.122226e-3)*t2+
  246 + 0.434725e-3)*t2-0.4394275e-2)*t2+0.999999997;
  247 + q0 = t*(((((0.8099e-5*t2-0.35614e-4)*t2+0.85844e-4)*t2-
  248 + 0.218024e-3)*t2+0.1144106e-2)*t2-0.031249995);
  249 + ta0 = x-M_PI_4;
  250 + j0 = a0*(p0*cos(ta0)-q0*sin(ta0));
  251 + y0 = a0*(p0*sin(ta0)+q0*cos(ta0));
  252 + p1 = ((((0.10632e-4*t2-0.50363e-4)*t2+0.145575e-3)*t2
  253 + -0.559487e-3)*t2+0.7323931e-2)*t2+1.000000004;
  254 + q1 = t*(((((-0.9173e-5*t2+0.40658e-4)*t2-0.99941e-4)*t2
  255 + +0.266891e-3)*t2-0.1601836e-2)*t2+0.093749994);
  256 + ta1 = x-0.75*M_PI;
  257 + j1 = a0*(p1*cos(ta1)-q1*sin(ta1));
  258 + y1 = a0*(p1*sin(ta1)+q1*cos(ta1));
  259 + }
  260 + j0p = -j1;
  261 + j1p = j0-j1/x;
  262 + y0p = -y1;
  263 + y1p = y0-y1/x;
  264 + return 0;
  265 +}
  266 +int msta1(double x,int mp)
  267 +{
  268 + double a0,f0,f1,f;
  269 + int i,n0,n1,nn;
  270 +
  271 + a0 = fabs(x);
  272 + n0 = (int)(1.1*a0)+1;
  273 + f0 = 0.5*log10(6.28*n0)-n0*log10(1.36*a0/n0)-mp;
  274 + n1 = n0+5;
  275 + f1 = 0.5*log10(6.28*n1)-n1*log10(1.36*a0/n1)-mp;
  276 + for (i=0;i<20;i++) {
  277 + nn = (int)(n1-(n1-n0)/(1.0-f0/f1));
  278 + f = 0.5*log10(6.28*nn)-nn*log10(1.36*a0/nn)-mp;
  279 + if (abs(nn-n1) < 1) break;
  280 + n0 = n1;
  281 + f0 = f1;
  282 + n1 = nn;
  283 + f1 = f;
  284 + }
  285 + return nn;
  286 +}
  287 +int msta2(double x,int n,int mp)
  288 +{
  289 + double a0,ejn,hmp,f0,f1,f,obj;
  290 + int i,n0,n1,nn;
  291 +
  292 + a0 = fabs(x);
  293 + hmp = 0.5*mp;
  294 + ejn = 0.5*log10(6.28*n)-n*log10(1.36*a0/n);
  295 + if (ejn <= hmp) {
  296 + obj = mp;
  297 + n0 = (int)(1.1*a0);
  298 + if (n0 < 1) n0 = 1;
  299 + }
  300 + else {
  301 + obj = hmp+ejn;
  302 + n0 = n;
  303 + }
  304 + f0 = 0.5*log10(6.28*n0)-n0*log10(1.36*a0/n0)-obj;
  305 + n1 = n0+5;
  306 + f1 = 0.5*log10(6.28*n1)-n1*log10(1.36*a0/n1)-obj;
  307 + for (i=0;i<20;i++) {
  308 + nn = (int)(n1-(n1-n0)/(1.0-f0/f1));
  309 + f = 0.5*log10(6.28*nn)-nn*log10(1.36*a0/nn)-obj;
  310 + if (abs(nn-n1) < 1) break;
  311 + n0 = n1;
  312 + f0 = f1;
  313 + n1 = nn;
  314 + f1 = f;
  315 + }
  316 + return nn+10;
  317 +}
  318 +//
  319 +// INPUT:
  320 +// double x -- argument of Bessel function of 1st and 2nd kind.
  321 +// int n -- order
  322 +//
  323 +// OUPUT:
  324 +//
  325 +// int nm -- highest order actually computed (nm <= n)
  326 +// double jn[] -- Bessel function of 1st kind, orders from 0 to nm
  327 +// double yn[] -- Bessel function of 2nd kind, orders from 0 to nm
  328 +// double j'n[]-- derivative of Bessel function of 1st kind,
  329 +// orders from 0 to nm
  330 +// double y'n[]-- derivative of Bessel function of 2nd kind,
  331 +// orders from 0 to nm
  332 +//
  333 +// Computes Bessel functions of all order up to 'n' using recurrence
  334 +// relations. If 'nm' < 'n' only 'nm' orders are returned.
  335 +//
  336 +int bessjyna(int n,double x,int &nm,double *jn,double *yn,
  337 + double *jnp,double *ynp)
  338 +{
  339 + double bj0,bj1,f,f0,f1,f2,cs;
  340 + int i,k,m,ecode;
  341 +
  342 + nm = n;
  343 + if ((x < 0.0) || (n < 0)) return 1;
  344 + if (x < 1e-15) {
  345 + for (i=0;i<=n;i++) {
  346 + jn[i] = 0.0;
  347 + yn[i] = -1e308;
  348 + jnp[i] = 0.0;
  349 + ynp[i] = 1e308;
  350 + }
  351 + jn[0] = 1.0;
  352 + jnp[1] = 0.5;
  353 + return 0;
  354 + }
  355 + ecode = bessjy01a(x,jn[0],jn[1],yn[0],yn[1],jnp[0],jnp[1],ynp[0],ynp[1]);
  356 + if (n < 2) return 0;
  357 + bj0 = jn[0];
  358 + bj1 = jn[1];
  359 + if (n < (int)0.9*x) {
  360 + for (k=2;k<=n;k++) {
  361 + jn[k] = 2.0*(k-1.0)*bj1/x-bj0;
  362 + bj0 = bj1;
  363 + bj1 = jn[k];
  364 + }
  365 + }
  366 + else {
  367 + m = msta1(x,200);
  368 + if (m < n) nm = m;
  369 + else m = msta2(x,n,15);
  370 + f2 = 0.0;
  371 + f1 = 1.0e-100;
  372 + for (k=m;k>=0;k--) {
  373 + f = 2.0*(k+1.0)/x*f1-f2;
  374 + if (k <= nm) jn[k] = f;
  375 + f2 = f1;
  376 + f1 = f;
  377 + }
  378 + if (fabs(bj0) > fabs(bj1)) cs = bj0/f;
  379 + else cs = bj1/f2;
  380 + for (k=0;k<=nm;k++) {
  381 + jn[k] *= cs;
  382 + }
  383 + }
  384 + for (k=2;k<=nm;k++) {
  385 + jnp[k] = jn[k-1]-k*jn[k]/x;
  386 + }
  387 + f0 = yn[0];
  388 + f1 = yn[1];
  389 + for (k=2;k<=nm;k++) {
  390 + f = 2.0*(k-1.0)*f1/x-f0;
  391 + yn[k] = f;
  392 + f0 = f1;
  393 + f1 = f;
  394 + }
  395 + for (k=2;k<=nm;k++) {
  396 + ynp[k] = yn[k-1]-k*yn[k]/x;
  397 + }
  398 + return 0;
  399 +}
  400 +//
  401 +// Same input and output conventions as above. Different recurrence
  402 +// relations used for 'x' < 300.
  403 +//
  404 +int bessjynb(int n,double x,int &nm,double *jn,double *yn,
  405 + double *jnp,double *ynp)
  406 +{
  407 + double t1,t2,f,f1,f2,bj0,bj1,bjk,by0,by1,cu,s0,su,sv;
  408 + double ec,bs,byk,p0,p1,q0,q1;
  409 + static double a[] = {
  410 + -0.7031250000000000e-1,
  411 + 0.1121520996093750,
  412 + -0.5725014209747314,
  413 + 6.074042001273483};
  414 + static double b[] = {
  415 + 0.7324218750000000e-1,
  416 + -0.2271080017089844,
  417 + 1.727727502584457,
  418 + -2.438052969955606e1};
  419 + static double a1[] = {
  420 + 0.1171875,
  421 + -0.1441955566406250,
  422 + 0.6765925884246826,
  423 + -6.883914268109947};
  424 + static double b1[] = {
  425 + -0.1025390625,
  426 + 0.2775764465332031,
  427 + -1.993531733751297,
  428 + 2.724882731126854e1};
  429 +
  430 + int i,k,m;
  431 + nm = n;
  432 + if ((x < 0.0) || (n < 0)) return 1;
  433 + if (x < 1e-15) {
  434 + for (i=0;i<=n;i++) {
  435 + jn[i] = 0.0;
  436 + yn[i] = -1e308;
  437 + jnp[i] = 0.0;
  438 + ynp[i] = 1e308;
  439 + }
  440 + jn[0] = 1.0;
  441 + jnp[1] = 0.5;
  442 + return 0;
  443 + }
  444 + if (x <= 300.0 || n > (int)(0.9*x)) {
  445 + if (n == 0) nm = 1;
  446 + m = msta1(x,200);
  447 + if (m < nm) nm = m;
  448 + else m = msta2(x,nm,15);
  449 + bs = 0.0;
  450 + su = 0.0;
  451 + sv = 0.0;
  452 + f2 = 0.0;
  453 + f1 = 1.0e-100;
  454 + for (k = m;k>=0;k--) {
  455 + f = 2.0*(k+1.0)/x*f1 - f2;
  456 + if (k <= nm) jn[k] = f;
  457 + if ((k == 2*(int)(k/2)) && (k != 0)) {
  458 + bs += 2.0*f;
  459 +// su += pow(-1,k>>1)*f/(double)k;
  460 + su += (-1)*((k & 2)-1)*f/(double)k;
  461 + }
  462 + else if (k > 1) {
  463 +// sv += pow(-1,k>>1)*k*f/(k*k-1.0);
  464 + sv += (-1)*((k & 2)-1)*(double)k*f/(k*k-1.0);
  465 + }
  466 + f2 = f1;
  467 + f1 = f;
  468 + }
  469 + s0 = bs+f;
  470 + for (k=0;k<=nm;k++) {
  471 + jn[k] /= s0;
  472 + }
  473 + ec = log(0.5*x) +0.5772156649015329;
  474 + by0 = M_2_PI*(ec*jn[0]-4.0*su/s0);
  475 + yn[0] = by0;
  476 + by1 = M_2_PI*((ec-1.0)*jn[1]-jn[0]/x-4.0*sv/s0);
  477 + yn[1] = by1;
  478 + }
  479 + else {
  480 + t1 = x-M_PI_4;
  481 + p0 = 1.0;
  482 + q0 = -0.125/x;
  483 + for (k=0;k<4;k++) {
  484 + p0 += a[k]*pow(x,-2*k-2);
  485 + q0 += b[k]*pow(x,-2*k-3);
  486 + }
  487 + cu = sqrt(M_2_PI/x);
  488 + bj0 = cu*(p0*cos(t1)-q0*sin(t1));
  489 + by0 = cu*(p0*sin(t1)+q0*cos(t1));
  490 + jn[0] = bj0;
  491 + yn[0] = by0;
  492 + t2 = x-0.75*M_PI;
  493 + p1 = 1.0;
  494 + q1 = 0.375/x;
  495 + for (k=0;k<4;k++) {
  496 + p1 += a1[k]*pow(x,-2*k-2);
  497 + q1 += b1[k]*pow(x,-2*k-3);
  498 + }
  499 + bj1 = cu*(p1*cos(t2)-q1*sin(t2));
  500 + by1 = cu*(p1*sin(t2)+q1*cos(t2));
  501 + jn[1] = bj1;
  502 + yn[1] = by1;
  503 + for (k=2;k<=nm;k++) {
  504 + bjk = 2.0*(k-1.0)*bj1/x-bj0;
  505 + jn[k] = bjk;
  506 + bj0 = bj1;
  507 + bj1 = bjk;
  508 + }
  509 + }
  510 + jnp[0] = -jn[1];
  511 + for (k=1;k<=nm;k++) {
  512 + jnp[k] = jn[k-1]-k*jn[k]/x;
  513 + }
  514 + for (k=2;k<=nm;k++) {
  515 + byk = 2.0*(k-1.0)*by1/x-by0;
  516 + yn[k] = byk;
  517 + by0 = by1;
  518 + by1 = byk;
  519 + }
  520 + ynp[0] = -yn[1];
  521 + for (k=1;k<=nm;k++) {
  522 + ynp[k] = yn[k-1]-k*yn[k]/x;
  523 + }
  524 + return 0;
  525 +
  526 +}
  527 +
  528 +// The following routine computes Bessel Jv(x) and Yv(x) for
  529 +// arbitrary positive order (v). For negative order, use:
  530 +//
  531 +// J-v(x) = Jv(x)cos(v pi) - Yv(x)sin(v pi)
  532 +// Y-v(x) = Jv(x)sin(v pi) + Yv(x)cos(v pi)
  533 +//
  534 +int bessjyv(double v,double x,double &vm,double *jv,double *yv,
  535 + double *djv,double *dyv)
  536 +{
  537 + double v0,vl,vg,vv,a,a0,r,x2,bjv0,bjv1,bjvl,f,f0,f1,f2;
  538 + double r0,r1,ck,cs,cs0,cs1,sk,qx,px,byv0,byv1,rp,xk,rq;
  539 + double b,ec,w0,w1,bju0,bju1,pv0,pv1,byvk;
  540 + int j,k,l,m,n,kz;
  541 +
  542 + x2 = x*x;
  543 + n = (int)v;
  544 + v0 = v-n;
  545 + if ((x < 0.0) || (v < 0.0)) return 1;
  546 + if (x < 1e-15) {
  547 + for (k=0;k<=n;k++) {
  548 + jv[k] = 0.0;
  549 + yv[k] = -1e308;
  550 + djv[k] = 0.0;
  551 + dyv[k] = 1e308;
  552 + if (v0 == 0.0) {
  553 + jv[0] = 1.0;
  554 + djv[1] = 0.5;
  555 + }
  556 + else djv[0] = 1e308;
  557 + }
  558 + vm = v;
  559 + return 0;
  560 + }
  561 + if (x <= 12.0) {
  562 + for (l=0;l<2;l++) {
  563 + vl = v0 + l;
  564 + bjvl = 1.0;
  565 + r = 1.0;
  566 + for (k=1;k<=40;k++) {
  567 + r *= -0.25*x2/(k*(k+vl));
  568 + bjvl += r;
  569 + if (fabs(r) < fabs(bjvl)*1e-15) break;
  570 + }
  571 + vg = 1.0 + vl;
  572 + a = pow(0.5*x,vl)/gamma(vg);
  573 + if (l == 0) bjv0 = bjvl*a;
  574 + else bjv1 = bjvl*a;
  575 + }
  576 + }
  577 + else {
  578 + if (x >= 50.0) kz = 8;
  579 + else if (x >= 35.0) kz = 10;
  580 + else kz = 11;
  581 + for (j=0;j<2;j++) {
  582 + vv = 4.0*(j+v0)*(j+v0);
  583 + px = 1.0;
  584 + rp = 1.0;
  585 + for (k=1;k<=kz;k++) {
  586 + rp *= (-0.78125e-2)*(vv-pow(4.0*k-3.0,2.0))*
  587 + (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*x2);
  588 + px += rp;
  589 + }
  590 + qx = 1.0;
  591 + rq = 1.0;
  592 + for (k=1;k<=kz;k++) {
  593 + rq *= (-0.78125e-2)*(vv-pow(4.0*k-1.0,2.0))*
  594 + (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*x2);
  595 + qx += rq;
  596 + }
  597 + qx *= 0.125*(vv-1.0)/x;
  598 + xk = x-(0.5*(j+v0)+0.25)*M_PI;
  599 + a0 = sqrt(M_2_PI/x);
  600 + ck = cos(xk);
  601 + sk = sin(xk);
  602 +
  603 + if (j == 0) {
  604 + bjv0 = a0*(px*ck-qx*sk);
  605 + byv0 = a0*(px*sk+qx*ck);
  606 + }
  607 + else if (j == 1) {
  608 + bjv1 = a0*(px*ck-qx*sk);
  609 + byv1 = a0*(px*sk+qx*ck);
  610 + }
  611 + }
  612 + }
  613 + jv[0] = bjv0;
  614 + jv[1] = bjv1;
  615 + djv[0] = v0*jv[0]/x-jv[1];
  616 + djv[1] = -(1.0+v0)*jv[1]/x+jv[0];
  617 + if ((n >= 2) && (n <= (int)(0.9*x))) {
  618 + f0 = bjv0;
  619 + f1 = bjv1;
  620 + for (k=2;k<=n;k++) {
  621 + f = 2.0*(k+v0-1.0)*f1/x-f0;
  622 + jv[k] = f;
  623 + f0 = f1;
  624 + f1 = f;
  625 + }
  626 + }
  627 + else if (n >= 2) {
  628 + m = msta1(x,200);
  629 + if (m < n) n = m;
  630 + else m = msta2(x,n,15);
  631 + f2 = 0.0;
  632 + f1 = 1.0e-100;
  633 + for (k=m;k>=0;k--) {
  634 + f = 2.0*(v0+k+1.0)*f1/x-f2;
  635 + if (k <= n) jv[k] = f;
  636 + f2 = f1;
  637 + f1 = f;
  638 + }
  639 + if (fabs(bjv0) > fabs(bjv1)) cs = bjv0/f;
  640 + else cs = bjv1/f2;
  641 + for (k=0;k<=n;k++) {
  642 + jv[k] *= cs;
  643 + }
  644 + }
  645 + for (k=2;k<=n;k++) {
  646 + djv[k] = -(k+v0)*jv[k]/x+jv[k-1];
  647 + }
  648 + if (x <= 12.0) {
  649 + if (v0 != 0.0) {
  650 + for (l=0;l<2;l++) {
  651 + vl = v0 +l;
  652 + bjvl = 1.0;
  653 + r = 1.0;
  654 + for (k=1;k<=40;k++) {
  655 + r *= -0.25*x2/(k*(k-vl));
  656 + bjvl += r;
  657 + if (fabs(r) < fabs(bjvl)*1e-15) break;
  658 + }
  659 + vg = 1.0-vl;
  660 + b = pow(2.0/x,vl)/gamma(vg);
  661 + if (l == 0) bju0 = bjvl*b;
  662 + else bju1 = bjvl*b;
  663 + }
  664 + pv0 = M_PI*v0;
  665 + pv1 = M_PI*(1.0+v0);
  666 + byv0 = (bjv0*cos(pv0)-bju0)/sin(pv0);
  667 + byv1 = (bjv1*cos(pv1)-bju1)/sin(pv1);
  668 + }
  669 + else {
  670 + ec = log(0.5*x)+el;
  671 + cs0 = 0.0;
  672 + w0 = 0.0;
  673 + r0 = 1.0;
  674 + for (k=1;k<=30;k++) {
  675 + w0 += 1.0/k;
  676 + r0 *= -0.25*x2/(k*k);
  677 + cs0 += r0*w0;
  678 + }
  679 + byv0 = M_2_PI*(ec*bjv0-cs0);
  680 + cs1 = 1.0;
  681 + w1 = 0.0;
  682 + r1 = 1.0;
  683 + for (k=1;k<=30;k++) {
  684 + w1 += 1.0/k;
  685 + r1 *= -0.25*x2/(k*(k+1));
  686 + cs1 += r1*(2.0*w1+1.0/(k+1.0));
  687 + }
  688 + byv1 = M_2_PI*(ec*bjv1-1.0/x-0.25*x*cs1);
  689 + }
  690 + }
  691 + yv[0] = byv0;
  692 + yv[1] = byv1;
  693 + for (k=2;k<=n;k++) {
  694 + byvk = 2.0*(v0+k-1.0)*byv1/x-byv0;
  695 + yv[k] = byvk;
  696 + byv0 = byv1;
  697 + byv1 = byvk;
  698 + }
  699 + dyv[0] = v0*yv[0]/x-yv[1];
  700 + for (k=1;k<=n;k++) {
  701 + dyv[k] = -(k+v0)*yv[k]/x+yv[k-1];
  702 + }
  703 + vm = n + v0;
  704 + return 0;
  705 +}
  706 +
... ...
CBESSIK.CPP renamed to cbessik.cpp
1   -// cbessik.cpp -- complex modified Bessel functions.
2   -// Algorithms and coefficient values from "Computation of Special
3   -// Functions", Zhang and Jin, John Wiley and Sons, 1996.
4   -//
5   -// (C) 2003, C. Bond. All rights reserved.
6   -//
7   -#include <complex>
8   -using namespace std;
9   -#include "bessel.h"
10   -
11   -static complex<double> cii(0.0,1.0);
12   -static complex<double> czero(0.0,0.0);
13   -static complex<double> cone(1.0,0.0);
14   -
15   -double gamma(double x);
16   -
17   -int cbessik01(complex<double>z,complex<double>&ci0,complex<double>&ci1,
18   - complex<double>&ck0,complex<double>&ck1,complex<double>&ci0p,
19   - complex<double>&ci1p,complex<double>&ck0p,complex<double>&ck1p)
20   -{
21   - complex<double> z1,z2,zr,zr2,cr,ca,cb,cs,ct,cw;
22   - double a0,w0;
23   - int k,kz;
24   - static double a[] = {
25   - 0.125,
26   - 7.03125e-2,
27   - 7.32421875e-2,
28   - 1.1215209960938e-1,
29   - 2.2710800170898e-1,
30   - 5.7250142097473e-1,
31   - 1.7277275025845,
32   - 6.0740420012735,
33   - 2.4380529699556e1,
34   - 1.1001714026925e2,
35   - 5.5133589612202e2,
36   - 3.0380905109224e3};
37   - static double b[] = {
38   - -0.375,
39   - -1.171875e-1,
40   - -1.025390625e-1,
41   - -1.4419555664063e-1,
42   - -2.7757644653320e-1,
43   - -6.7659258842468e-1,
44   - -1.9935317337513,
45   - -6.8839142681099,
46   - -2.7248827311269e1,
47   - -1.2159789187654e2,
48   - -6.0384407670507e2,
49   - -3.3022722944809e3};
50   - static double a1[] = {
51   - 0.125,
52   - 0.2109375,
53   - 1.0986328125,
54   - 1.1775970458984e1,
55   - 2.1461706161499e2,
56   - 5.9511522710323e3,
57   - 2.3347645606175e5,
58   - 1.2312234987631e7,
59   - 8.401390346421e08,
60   - 7.2031420482627e10};
61   -
62   - a0 = abs(z);
63   - z2 = z*z;
64   - z1 = z;
65   - if (a0 == 0.0) {
66   - ci0 = cone;
67   - ci1 = czero;
68   - ck0 = complex<double> (1e308,0);
69   - ck1 = complex<double> (1e308,0);
70   - ci0p = czero;
71   - ci1p = complex<double>(0.5,0.0);
72   - ck0p = complex<double>(-1e308,0);
73   - ck1p = complex<double>(-1e308,0);
74   - return 0;
75   - }
76   - if (real(z) < 0.0) z1 = -z;
77   - if (a0 <= 18.0) {
78   - ci0 = cone;
79   - cr = cone;
80   - for (k=1;k<=50;k++) {
81   - cr *= 0.25*z2/(double)(k*k);
82   - ci0 += cr;
83   - if (abs(cr/ci0) < eps) break;
84   - }
85   - ci1 = cone;
86   - cr = cone;
87   - for (k=1;k<=50;k++) {
88   - cr *= 0.25*z2/(double)(k*(k+1.0));
89   - ci1 += cr;
90   - if (abs(cr/ci1) < eps) break;
91   - }
92   - ci1 *= 0.5*z1;
93   - }
94   - else {
95   - if (a0 >= 50.0) kz = 7;
96   - else if (a0 >= 35.0) kz = 9;
97   - else kz = 12;
98   - ca = exp(z1)/sqrt(2.0*M_PI*z1);
99   - ci0 = cone;
100   - zr = 1.0/z1;
101   - for (k=0;k<kz;k++) {
102   - ci0 += a[k]*pow(zr,k+1.0);
103   - }
104   - ci0 *= ca;
105   - ci1 = cone;
106   - for (k=0;k<kz;k++) {
107   - ci1 += b[k]*pow(zr,k+1.0);
108   - }
109   - ci1 *= ca;
110   - }
111   - if (a0 <= 9.0) {
112   - cs = czero;
113   - ct = -log(0.5*z1)-el;
114   - w0 = 0.0;
115   - cr = cone;
116   - for (k=1;k<=50;k++) {
117   - w0 += 1.0/k;
118   - cr *= 0.25*z2/(double)(k*k);
119   - cs += cr*(w0+ct);
120   - if (abs((cs-cw)/cs) < eps) break;
121   - cw = cs;
122   - }
123   - ck0 = ct+cs;
124   - }
125   - else {
126   - cb = 0.5/z1;
127   - zr2 = 1.0/z2;
128   - ck0 = cone;
129   - for (k=0;k<10;k++) {
130   - ck0 += a1[k]*pow(zr2,k+1.0);
131   - }
132   - ck0 *= cb/ci0;
133   - }
134   - ck1 = (1.0/z1 - ci1*ck0)/ci0;
135   - if (real(z) < 0.0) {
136   - if (imag(z) < 0.0) {
137   - ck0 += cii*M_PI*ci0;
138   - ck1 = -ck1+cii*M_PI*ci1;
139   - }
140   - else if (imag(z) > 0.0) {
141   - ck0 -= cii*M_PI*ci0;
142   - ck1 = -ck1-cii*M_PI*ci1;
143   - }
144   - ci1 = -ci1;
145   - }
146   - ci0p = ci1;
147   - ci1p = ci0-1.0*ci1/z;
148   - ck0p = -ck1;
149   - ck1p = -ck0-1.0*ck1/z;
150   - return 0;
151   -}
152   -int cbessikna(int n,complex<double> z,int &nm,complex<double> *ci,
153   - complex<double> *ck,complex<double> *cip,complex<double> *ckp)
154   -{
155   - complex<double> ci0,ci1,ck0,ck1,ckk,cf,cf1,cf2,cs;
156   - double a0;
157   - int k,m,ecode;
158   - a0 = abs(z);
159   - nm = n;
160   - if (a0 < 1.0e-100) {
161   - for (k=0;k<=n;k++) {
162   - ci[k] = czero;
163   - ck[k] = complex<double>(-1e308,0);
164   - cip[k] = czero;
165   - ckp[k] = complex<double>(1e308,0);
166   - }
167   - ci[0] = cone;
168   - cip[1] = complex<double>(0.5,0.0);
169   - return 0;
170   - }
171   - ecode = cbessik01(z,ci[0],ci[1],ck[0],ck[1],cip[0],cip[1],ckp[0],ckp[1]);
172   - if (n < 2) return 0;
173   - ci0 = ci[0];
174   - ci1 = ci[1];
175   - ck0 = ck[0];
176   - ck1 = ck[1];
177   - m = msta1(a0,200);
178   - if (m < n) nm = m;
179   - else m = msta2(a0,n,15);
180   - cf2 = czero;
181   - cf1 = complex<double>(1.0e-100,0.0);
182   - for (k=m;k>=0;k--) {
183   - cf = 2.0*(k+1.0)*cf1/z+cf2;
184   - if (k <= nm) ci[k] = cf;
185   - cf2 = cf1;
186   - cf1 = cf;
187   - }
188   - cs = ci0/cf;
189   - for (k=0;k<=nm;k++) {
190   - ci[k] *= cs;
191   - }
192   - for (k=2;k<=nm;k++) {
193   - if (abs(ci[k-1]) > abs(ci[k-2])) {
194   - ckk = (1.0/z-ci[k]*ck[k-1])/ci[k-1];
195   - }
196   - else {
197   - ckk = (ci[k]*ck[k-2]+2.0*(k-1.0)/(z*z))/ci[k-2];
198   - }
199   - ck[k] = ckk;
200   - }
201   - for (k=2;k<=nm;k++) {
202   - cip[k] = ci[k-1]-(double)k*ci[k]/z;
203   - ckp[k] = -ck[k-1]-(double)k*ck[k]/z;
204   - }
205   - return 0;
206   -}
207   -int cbessiknb(int n,complex<double> z,int &nm,complex<double> *ci,
208   - complex<double> *ck,complex<double> *cip,complex<double> *ckp)
209   -{
210   - complex<double> z1,cbs,csk0,cf,cf0,cf1,ca0,cbkl;
211   - complex<double> cg,cg0,cg1,cs0,cs,cr;
212   - double a0,vt,fac;
213   - int k,kz,l,m;
214   -
215   - a0 = abs(z);
216   - nm = n;
217   - if (a0 < 1.0e-100) {
218   - for (k=0;k<=n;k++) {
219   - ci[k] = czero;
220   - ck[k] = complex<double>(1e308,0);
221   - cip[k] = czero;
222   - ckp[k] = complex<double>(-1e308,0);
223   - }
224   - ci[0] = complex<double>(1.0,0.0);
225   - cip[1] = complex<double>(0.5,0.0);
226   - return 0;
227   - }
228   - z1 = z;
229   - if (real(z) < 0.0) z1 = -z;
230   - if (n == 0) nm = 1;
231   - m = msta1(a0,200);
232   - if (m < nm) nm = m;
233   - else m = msta2(a0,nm,15);
234   - cbs = czero;
235   - csk0 = czero;
236   - cf0 = czero;
237   - cf1 = complex<double>(1.0e-100,0.0);
238   - for (k=m;k>=0;k--) {
239   - cf = 2.0*(k+1.0)*cf1/z1+cf0;
240   - if (k <=nm) ci[k] = cf;
241   - if ((k != 0) && (k == 2*(k>>1))) csk0 += 4.0*cf/(double)k;
242   - cbs += 2.0*cf;
243   - cf0 = cf1;
244   - cf1 = cf;
245   - }
246   - cs0 = exp(z1)/(cbs-cf);
247   - for (k=0;k<=nm;k++) {
248   - ci[k] *= cs0;
249   - }
250   - if (a0 <= 9.0) {
251   - ck[0] = -(log(0.5*z1)+el)*ci[0]+cs0*csk0;
252   - ck[1] = (1.0/z1-ci[1]*ck[0])/ci[0];
253   - }
254   - else {
255   - ca0 = sqrt(M_PI_2/z1)*exp(-z1);
256   - if (a0 >= 200.0) kz = 6;
257   - else if (a0 >= 80.0) kz = 8;
258   - else if (a0 >= 25.0) kz = 10;
259   - else kz = 16;
260   - for (l=0;l<2;l++) {
261   - cbkl = cone;
262   - vt = 4.0*l;
263   - cr = cone;
264   - for (k=1;k<=kz;k++) {
265   - cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1);
266   - cbkl += cr;
267   - }
268   - ck[l] = ca0*cbkl;
269   - }
270   - }
271   - cg0 = ck[0];
272   - cg1 = ck[1];
273   - for (k=2;k<=nm;k++) {
274   - cg = 2.0*(k-1.0)*cg1/z1+cg0;
275   - ck[k] = cg;
276   - cg0 = cg1;
277   - cg1 = cg;
278   - }
279   - if (real(z) < 0.0) {
280   - fac = 1.0;
281   - for (k=0;k<=nm;k++) {
282   - if (imag(z) < 0.0) {
283   - ck[k] = fac*ck[k]+cii*M_PI*ci[k];
284   - }
285   - else {
286   - ck[k] = fac*ck[k]-cii*M_PI*ci[k];
287   - }
288   - ci[k] *= fac;
289   - fac = -fac;
290   - }
291   - }
292   - cip[0] = ci[1];
293   - ckp[0] = -ck[1];
294   - for (k=1;k<=nm;k++) {
295   - cip[k] = ci[k-1]-(double)k*ci[k]/z;
296   - ckp[k] = -ck[k-1]-(double)k*ck[k]/z;
297   - }
298   - return 0;
299   -}
300   -int cbessikv(double v,complex<double>z,double &vm,complex<double> *civ,
301   - complex<double> *ckv,complex<double> *civp,complex<double> *ckvp)
302   -{
303   - complex<double> z1,z2,ca1,ca,cs,cr,ci0,cbi0,cf,cf1,cf2;
304   - complex<double> ct,cp,cbk0,ca2,cr1,cr2,csu,cws,cb;
305   - complex<double> cg0,cg1,cgk,cbk1,cvk;
306   - double a0,v0,v0p,v0n,vt,w0,piv,gap,gan;
307   - int m,n,k,kz;
308   -
309   - a0 = abs(z);
310   - z1 = z;
311   - z2 = z*z;
312   - n = (int)v;
313   - v0 = v-n;
314   - piv = M_PI*v0;
315   - vt = 4.0*v0*v0;
316   - if (n == 0) n = 1;
317   - if (a0 < 1e-100) {
318   - for (k=0;k<=n;k++) {
319   - civ[k] = czero;
320   - ckv[k] = complex<double>(-1e308,0);
321   - civp[k] = czero;
322   - ckvp[k] = complex<double>(1e308,0);
323   - }
324   - if (v0 == 0.0) {
325   - civ[0] = cone;
326   - civp[1] = complex<double> (0.5,0.0);
327   - }
328   - vm = v;
329   - return 0;
330   - }
331   - if (a0 >= 50.0) kz = 8;
332   - else if (a0 >= 35.0) kz = 10;
333   - else kz = 14;
334   - if (real(z) <= 0.0) z1 = -z;
335   - if (a0 < 18.0) {
336   - if (v0 == 0.0) {
337   - ca1 = cone;
338   - }
339   - else {
340   - v0p = 1.0+v0;
341   - gap = gamma(v0p);
342   - ca1 = pow(0.5*z1,v0)/gap;
343   - }
344   - ci0 = cone;
345   - cr = cone;
346   - for (k=1;k<=50;k++) {
347   - cr *= 0.25*z2/(k*(k+v0));
348   - ci0 += cr;
349   - if (abs(cr/ci0) < eps) break;
350   - }
351   - cbi0 = ci0*ca1;
352   - }
353   - else {
354   - ca = exp(z1)/sqrt(2.0*M_PI*z1);
355   - cs = cone;
356   - cr = cone;
357   - for (k=1;k<=kz;k++) {
358   - cr *= -0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1);
359   - cs += cr;
360   - }
361   - cbi0 = ca*cs;
362   - }
363   - m = msta1(a0,200);
364   - if (m < n) n = m;
365   - else m = msta2(a0,n,15);
366   - cf2 = czero;
367   - cf1 = complex<double>(1.0e-100,0.0);
368   - for (k=m;k>=0;k--) {
369   - cf = 2.0*(v0+k+1.0)*cf1/z1+cf2;
370   - if (k <= n) civ[k] = cf;
371   - cf2 = cf1;
372   - cf1 = cf;
373   - }
374   - cs = cbi0/cf;
375   - for (k=0;k<=n;k++) {
376   - civ[k] *= cs;
377   - }
378   - if (a0 <= 9.0) {
379   - if (v0 == 0.0) {
380   - ct = -log(0.5*z1)-el;
381   - cs = czero;
382   - w0 = 0.0;
383   - cr = cone;
384   - for (k=1;k<=50;k++) {
385   - w0 += 1.0/k;
386   - cr *= 0.25*z2/(double)(k*k);
387   - cp = cr*(w0+ct);
388   - cs += cp;
389   - if ((k >= 10) && (abs(cp/cs) < eps)) break;
390   - }
391   - cbk0 = ct+cs;
392   - }
393   - else {
394   - v0n = 1.0-v0;
395   - gan = gamma(v0n);
396   - ca2 = 1.0/(gan*pow(0.5*z1,v0));
397   - ca1 = pow(0.5*z1,v0)/gap;
398   - csu = ca2-ca1;
399   - cr1 = cone;
400   - cr2 = cone;
401   - cws = czero;
402   - for (k=1;k<=50;k++) {
403   - cr1 *= 0.25*z2/(k*(k-v0));
404   - cr2 *= 0.25*z2/(k*(k+v0));
405   - csu += ca2*cr1-ca1*cr2;
406   - if ((k >= 10) && (abs((cws-csu)/csu) < eps)) break;
407   - cws = csu;
408   - }
409   - cbk0 = csu*M_PI_2/sin(piv);
410   - }
411   - }
412   - else {
413   - cb = exp(-z1)*sqrt(M_PI_2/z1);
414   - cs = cone;
415   - cr = cone;
416   - for (k=1;k<=kz;k++) {
417   - cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1);
418   - cs += cr;
419   - }
420   - cbk0 = cb*cs;
421   - }
422   - cbk1 = (1.0/z1-civ[1]*cbk0)/civ[0];
423   - ckv[0] = cbk0;
424   - ckv[1] = cbk1;
425   - cg0 = cbk0;
426   - cg1 = cbk1;
427   - for (k=2;k<=n;k++) {
428   - cgk = 2.0*(v0+k-1.0)*cg1/z1+cg0;
429   - ckv[k] = cgk;
430   - cg0 = cg1;
431   - cg1 = cgk;
432   - }
433   - if (real(z) < 0.0) {
434   - for (k=0;k<=n;k++) {
435   - cvk = exp((k+v0)*M_PI*cii);
436   - if (imag(z) < 0.0) {
437   - ckv[k] = cvk*ckv[k]+M_PI*cii*civ[k];
438   - civ[k] /= cvk;
439   - }
440   - else if (imag(z) > 0.0) {
441   - ckv[k] = ckv[k]/cvk-M_PI*cii*civ[k];
442   - civ[k] *= cvk;
443   - }
444   - }
445   - }
446   - civp[0] = v0*civ[0]/z+civ[1];
447   - ckvp[0] = v0*ckv[0]/z-ckv[1];
448   - for (k=1;k<=n;k++) {
449   - civp[k] = -(k+v0)*civ[k]/z+civ[k-1];
450   - ckvp[k] = -(k+v0)*ckv[k]/z-ckv[k-1];
451   - }
452   - vm = n+v0;
453   - return 0;
454   -}
  1 +// cbessik.cpp -- complex modified Bessel functions.
  2 +// Algorithms and coefficient values from "Computation of Special
  3 +// Functions", Zhang and Jin, John Wiley and Sons, 1996.
  4 +//
  5 +// (C) 2003, C. Bond. All rights reserved.
  6 +//
  7 +#include <complex>
  8 +using namespace std;
  9 +#include "bessel.h"
  10 +
  11 +static complex<double> cii(0.0,1.0);
  12 +static complex<double> czero(0.0,0.0);
  13 +static complex<double> cone(1.0,0.0);
  14 +
  15 +double gamma(double x);
  16 +
  17 +int cbessik01(complex<double>z,complex<double>&ci0,complex<double>&ci1,
  18 + complex<double>&ck0,complex<double>&ck1,complex<double>&ci0p,
  19 + complex<double>&ci1p,complex<double>&ck0p,complex<double>&ck1p)
  20 +{
  21 + complex<double> z1,z2,zr,zr2,cr,ca,cb,cs,ct,cw;
  22 + double a0,w0;
  23 + int k,kz;
  24 + static double a[] = {
  25 + 0.125,
  26 + 7.03125e-2,
  27 + 7.32421875e-2,
  28 + 1.1215209960938e-1,
  29 + 2.2710800170898e-1,
  30 + 5.7250142097473e-1,
  31 + 1.7277275025845,
  32 + 6.0740420012735,
  33 + 2.4380529699556e1,
  34 + 1.1001714026925e2,
  35 + 5.5133589612202e2,
  36 + 3.0380905109224e3};
  37 + static double b[] = {
  38 + -0.375,
  39 + -1.171875e-1,
  40 + -1.025390625e-1,
  41 + -1.4419555664063e-1,
  42 + -2.7757644653320e-1,
  43 + -6.7659258842468e-1,
  44 + -1.9935317337513,
  45 + -6.8839142681099,
  46 + -2.7248827311269e1,
  47 + -1.2159789187654e2,
  48 + -6.0384407670507e2,
  49 + -3.3022722944809e3};
  50 + static double a1[] = {
  51 + 0.125,
  52 + 0.2109375,
  53 + 1.0986328125,
  54 + 1.1775970458984e1,
  55 + 2.1461706161499e2,
  56 + 5.9511522710323e3,
  57 + 2.3347645606175e5,
  58 + 1.2312234987631e7,
  59 + 8.401390346421e08,
  60 + 7.2031420482627e10};
  61 +
  62 + a0 = abs(z);
  63 + z2 = z*z;
  64 + z1 = z;
  65 + if (a0 == 0.0) {
  66 + ci0 = cone;
  67 + ci1 = czero;
  68 + ck0 = complex<double> (1e308,0);
  69 + ck1 = complex<double> (1e308,0);
  70 + ci0p = czero;
  71 + ci1p = complex<double>(0.5,0.0);
  72 + ck0p = complex<double>(-1e308,0);
  73 + ck1p = complex<double>(-1e308,0);
  74 + return 0;
  75 + }
  76 + if (real(z) < 0.0) z1 = -z;
  77 + if (a0 <= 18.0) {
  78 + ci0 = cone;
  79 + cr = cone;
  80 + for (k=1;k<=50;k++) {
  81 + cr *= 0.25*z2/(double)(k*k);
  82 + ci0 += cr;
  83 + if (abs(cr/ci0) < eps) break;
  84 + }
  85 + ci1 = cone;
  86 + cr = cone;
  87 + for (k=1;k<=50;k++) {
  88 + cr *= 0.25*z2/(double)(k*(k+1.0));
  89 + ci1 += cr;
  90 + if (abs(cr/ci1) < eps) break;
  91 + }
  92 + ci1 *= 0.5*z1;
  93 + }
  94 + else {
  95 + if (a0 >= 50.0) kz = 7;
  96 + else if (a0 >= 35.0) kz = 9;
  97 + else kz = 12;
  98 + ca = exp(z1)/sqrt(2.0*M_PI*z1);
  99 + ci0 = cone;
  100 + zr = 1.0/z1;
  101 + for (k=0;k<kz;k++) {
  102 + ci0 += a[k]*pow(zr,k+1.0);
  103 + }
  104 + ci0 *= ca;
  105 + ci1 = cone;
  106 + for (k=0;k<kz;k++) {
  107 + ci1 += b[k]*pow(zr,k+1.0);
  108 + }
  109 + ci1 *= ca;
  110 + }
  111 + if (a0 <= 9.0) {
  112 + cs = czero;
  113 + ct = -log(0.5*z1)-el;
  114 + w0 = 0.0;
  115 + cr = cone;
  116 + for (k=1;k<=50;k++) {
  117 + w0 += 1.0/k;
  118 + cr *= 0.25*z2/(double)(k*k);
  119 + cs += cr*(w0+ct);
  120 + if (abs((cs-cw)/cs) < eps) break;
  121 + cw = cs;
  122 + }
  123 + ck0 = ct+cs;
  124 + }
  125 + else {
  126 + cb = 0.5/z1;
  127 + zr2 = 1.0/z2;
  128 + ck0 = cone;
  129 + for (k=0;k<10;k++) {
  130 + ck0 += a1[k]*pow(zr2,k+1.0);
  131 + }
  132 + ck0 *= cb/ci0;
  133 + }
  134 + ck1 = (1.0/z1 - ci1*ck0)/ci0;
  135 + if (real(z) < 0.0) {
  136 + if (imag(z) < 0.0) {
  137 + ck0 += cii*M_PI*ci0;
  138 + ck1 = -ck1+cii*M_PI*ci1;
  139 + }
  140 + else if (imag(z) > 0.0) {
  141 + ck0 -= cii*M_PI*ci0;
  142 + ck1 = -ck1-cii*M_PI*ci1;
  143 + }
  144 + ci1 = -ci1;
  145 + }
  146 + ci0p = ci1;
  147 + ci1p = ci0-1.0*ci1/z;
  148 + ck0p = -ck1;
  149 + ck1p = -ck0-1.0*ck1/z;
  150 + return 0;
  151 +}
  152 +int cbessikna(int n,complex<double> z,int &nm,complex<double> *ci,
  153 + complex<double> *ck,complex<double> *cip,complex<double> *ckp)
  154 +{
  155 + complex<double> ci0,ci1,ck0,ck1,ckk,cf,cf1,cf2,cs;
  156 + double a0;
  157 + int k,m,ecode;
  158 + a0 = abs(z);
  159 + nm = n;
  160 + if (a0 < 1.0e-100) {
  161 + for (k=0;k<=n;k++) {
  162 + ci[k] = czero;
  163 + ck[k] = complex<double>(-1e308,0);
  164 + cip[k] = czero;
  165 + ckp[k] = complex<double>(1e308,0);
  166 + }
  167 + ci[0] = cone;
  168 + cip[1] = complex<double>(0.5,0.0);
  169 + return 0;
  170 + }
  171 + ecode = cbessik01(z,ci[0],ci[1],ck[0],ck[1],cip[0],cip[1],ckp[0],ckp[1]);
  172 + if (n < 2) return 0;
  173 + ci0 = ci[0];
  174 + ci1 = ci[1];
  175 + ck0 = ck[0];
  176 + ck1 = ck[1];
  177 + m = msta1(a0,200);
  178 + if (m < n) nm = m;
  179 + else m = msta2(a0,n,15);
  180 + cf2 = czero;
  181 + cf1 = complex<double>(1.0e-100,0.0);
  182 + for (k=m;k>=0;k--) {
  183 + cf = 2.0*(k+1.0)*cf1/z+cf2;
  184 + if (k <= nm) ci[k] = cf;
  185 + cf2 = cf1;
  186 + cf1 = cf;
  187 + }
  188 + cs = ci0/cf;
  189 + for (k=0;k<=nm;k++) {
  190 + ci[k] *= cs;
  191 + }
  192 + for (k=2;k<=nm;k++) {
  193 + if (abs(ci[k-1]) > abs(ci[k-2])) {
  194 + ckk = (1.0/z-ci[k]*ck[k-1])/ci[k-1];
  195 + }
  196 + else {
  197 + ckk = (ci[k]*ck[k-2]+2.0*(k-1.0)/(z*z))/ci[k-2];
  198 + }
  199 + ck[k] = ckk;
  200 + }
  201 + for (k=2;k<=nm;k++) {
  202 + cip[k] = ci[k-1]-(double)k*ci[k]/z;
  203 + ckp[k] = -ck[k-1]-(double)k*ck[k]/z;
  204 + }
  205 + return 0;
  206 +}
  207 +int cbessiknb(int n,complex<double> z,int &nm,complex<double> *ci,
  208 + complex<double> *ck,complex<double> *cip,complex<double> *ckp)
  209 +{
  210 + complex<double> z1,cbs,csk0,cf,cf0,cf1,ca0,cbkl;
  211 + complex<double> cg,cg0,cg1,cs0,cs,cr;
  212 + double a0,vt,fac;
  213 + int k,kz,l,m;
  214 +
  215 + a0 = abs(z);
  216 + nm = n;
  217 + if (a0 < 1.0e-100) {
  218 + for (k=0;k<=n;k++) {
  219 + ci[k] = czero;
  220 + ck[k] = complex<double>(1e308,0);
  221 + cip[k] = czero;
  222 + ckp[k] = complex<double>(-1e308,0);
  223 + }
  224 + ci[0] = complex<double>(1.0,0.0);
  225 + cip[1] = complex<double>(0.5,0.0);
  226 + return 0;
  227 + }
  228 + z1 = z;
  229 + if (real(z) < 0.0) z1 = -z;
  230 + if (n == 0) nm = 1;
  231 + m = msta1(a0,200);
  232 + if (m < nm) nm = m;
  233 + else m = msta2(a0,nm,15);
  234 + cbs = czero;
  235 + csk0 = czero;
  236 + cf0 = czero;
  237 + cf1 = complex<double>(1.0e-100,0.0);
  238 + for (k=m;k>=0;k--) {
  239 + cf = 2.0*(k+1.0)*cf1/z1+cf0;
  240 + if (k <=nm) ci[k] = cf;
  241 + if ((k != 0) && (k == 2*(k>>1))) csk0 += 4.0*cf/(double)k;
  242 + cbs += 2.0*cf;
  243 + cf0 = cf1;
  244 + cf1 = cf;
  245 + }
  246 + cs0 = exp(z1)/(cbs-cf);
  247 + for (k=0;k<=nm;k++) {
  248 + ci[k] *= cs0;
  249 + }
  250 + if (a0 <= 9.0) {
  251 + ck[0] = -(log(0.5*z1)+el)*ci[0]+cs0*csk0;
  252 + ck[1] = (1.0/z1-ci[1]*ck[0])/ci[0];
  253 + }
  254 + else {
  255 + ca0 = sqrt(M_PI_2/z1)*exp(-z1);
  256 + if (a0 >= 200.0) kz = 6;
  257 + else if (a0 >= 80.0) kz = 8;
  258 + else if (a0 >= 25.0) kz = 10;
  259 + else kz = 16;
  260 + for (l=0;l<2;l++) {
  261 + cbkl = cone;
  262 + vt = 4.0*l;
  263 + cr = cone;
  264 + for (k=1;k<=kz;k++) {
  265 + cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1);
  266 + cbkl += cr;
  267 + }
  268 + ck[l] = ca0*cbkl;
  269 + }
  270 + }
  271 + cg0 = ck[0];
  272 + cg1 = ck[1];
  273 + for (k=2;k<=nm;k++) {
  274 + cg = 2.0*(k-1.0)*cg1/z1+cg0;
  275 + ck[k] = cg;
  276 + cg0 = cg1;
  277 + cg1 = cg;
  278 + }
  279 + if (real(z) < 0.0) {
  280 + fac = 1.0;
  281 + for (k=0;k<=nm;k++) {
  282 + if (imag(z) < 0.0) {
  283 + ck[k] = fac*ck[k]+cii*M_PI*ci[k];
  284 + }
  285 + else {
  286 + ck[k] = fac*ck[k]-cii*M_PI*ci[k];
  287 + }
  288 + ci[k] *= fac;
  289 + fac = -fac;
  290 + }
  291 + }
  292 + cip[0] = ci[1];
  293 + ckp[0] = -ck[1];
  294 + for (k=1;k<=nm;k++) {
  295 + cip[k] = ci[k-1]-(double)k*ci[k]/z;
  296 + ckp[k] = -ck[k-1]-(double)k*ck[k]/z;
  297 + }
  298 + return 0;
  299 +}
  300 +int cbessikv(double v,complex<double>z,double &vm,complex<double> *civ,
  301 + complex<double> *ckv,complex<double> *civp,complex<double> *ckvp)
  302 +{
  303 + complex<double> z1,z2,ca1,ca,cs,cr,ci0,cbi0,cf,cf1,cf2;
  304 + complex<double> ct,cp,cbk0,ca2,cr1,cr2,csu,cws,cb;
  305 + complex<double> cg0,cg1,cgk,cbk1,cvk;
  306 + double a0,v0,v0p,v0n,vt,w0,piv,gap,gan;
  307 + int m,n,k,kz;
  308 +
  309 + a0 = abs(z);
  310 + z1 = z;
  311 + z2 = z*z;
  312 + n = (int)v;
  313 + v0 = v-n;
  314 + piv = M_PI*v0;
  315 + vt = 4.0*v0*v0;
  316 + if (n == 0) n = 1;
  317 + if (a0 < 1e-100) {
  318 + for (k=0;k<=n;k++) {
  319 + civ[k] = czero;
  320 + ckv[k] = complex<double>(-1e308,0);
  321 + civp[k] = czero;
  322 + ckvp[k] = complex<double>(1e308,0);
  323 + }
  324 + if (v0 == 0.0) {
  325 + civ[0] = cone;
  326 + civp[1] = complex<double> (0.5,0.0);
  327 + }
  328 + vm = v;
  329 + return 0;
  330 + }
  331 + if (a0 >= 50.0) kz = 8;
  332 + else if (a0 >= 35.0) kz = 10;
  333 + else kz = 14;
  334 + if (real(z) <= 0.0) z1 = -z;
  335 + if (a0 < 18.0) {
  336 + if (v0 == 0.0) {
  337 + ca1 = cone;
  338 + }
  339 + else {
  340 + v0p = 1.0+v0;
  341 + gap = gamma(v0p);
  342 + ca1 = pow(0.5*z1,v0)/gap;
  343 + }
  344 + ci0 = cone;
  345 + cr = cone;
  346 + for (k=1;k<=50;k++) {
  347 + cr *= 0.25*z2/(k*(k+v0));
  348 + ci0 += cr;
  349 + if (abs(cr/ci0) < eps) break;
  350 + }
  351 + cbi0 = ci0*ca1;
  352 + }
  353 + else {
  354 + ca = exp(z1)/sqrt(2.0*M_PI*z1);
  355 + cs = cone;
  356 + cr = cone;
  357 + for (k=1;k<=kz;k++) {
  358 + cr *= -0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1);
  359 + cs += cr;
  360 + }
  361 + cbi0 = ca*cs;
  362 + }
  363 + m = msta1(a0,200);
  364 + if (m < n) n = m;
  365 + else m = msta2(a0,n,15);
  366 + cf2 = czero;
  367 + cf1 = complex<double>(1.0e-100,0.0);
  368 + for (k=m;k>=0;k--) {
  369 + cf = 2.0*(v0+k+1.0)*cf1/z1+cf2;
  370 + if (k <= n) civ[k] = cf;
  371 + cf2 = cf1;
  372 + cf1 = cf;
  373 + }
  374 + cs = cbi0/cf;
  375 + for (k=0;k<=n;k++) {
  376 + civ[k] *= cs;
  377 + }
  378 + if (a0 <= 9.0) {
  379 + if (v0 == 0.0) {
  380 + ct = -log(0.5*z1)-el;
  381 + cs = czero;
  382 + w0 = 0.0;
  383 + cr = cone;
  384 + for (k=1;k<=50;k++) {
  385 + w0 += 1.0/k;
  386 + cr *= 0.25*z2/(double)(k*k);
  387 + cp = cr*(w0+ct);
  388 + cs += cp;
  389 + if ((k >= 10) && (abs(cp/cs) < eps)) break;
  390 + }
  391 + cbk0 = ct+cs;
  392 + }
  393 + else {
  394 + v0n = 1.0-v0;
  395 + gan = gamma(v0n);
  396 + ca2 = 1.0/(gan*pow(0.5*z1,v0));
  397 + ca1 = pow(0.5*z1,v0)/gap;
  398 + csu = ca2-ca1;
  399 + cr1 = cone;
  400 + cr2 = cone;
  401 + cws = czero;
  402 + for (k=1;k<=50;k++) {
  403 + cr1 *= 0.25*z2/(k*(k-v0));
  404 + cr2 *= 0.25*z2/(k*(k+v0));
  405 + csu += ca2*cr1-ca1*cr2;
  406 + if ((k >= 10) && (abs((cws-csu)/csu) < eps)) break;
  407 + cws = csu;
  408 + }
  409 + cbk0 = csu*M_PI_2/sin(piv);
  410 + }
  411 + }
  412 + else {
  413 + cb = exp(-z1)*sqrt(M_PI_2/z1);
  414 + cs = cone;
  415 + cr = cone;
  416 + for (k=1;k<=kz;k++) {
  417 + cr *= 0.125*(vt-pow(2.0*k-1.0,2.0))/((double)k*z1);
  418 + cs += cr;
  419 + }
  420 + cbk0 = cb*cs;
  421 + }
  422 + cbk1 = (1.0/z1-civ[1]*cbk0)/civ[0];
  423 + ckv[0] = cbk0;
  424 + ckv[1] = cbk1;
  425 + cg0 = cbk0;
  426 + cg1 = cbk1;
  427 + for (k=2;k<=n;k++) {
  428 + cgk = 2.0*(v0+k-1.0)*cg1/z1+cg0;
  429 + ckv[k] = cgk;
  430 + cg0 = cg1;
  431 + cg1 = cgk;
  432 + }
  433 + if (real(z) < 0.0) {
  434 + for (k=0;k<=n;k++) {
  435 + cvk = exp((k+v0)*M_PI*cii);
  436 + if (imag(z) < 0.0) {
  437 + ckv[k] = cvk*ckv[k]+M_PI*cii*civ[k];
  438 + civ[k] /= cvk;
  439 + }
  440 + else if (imag(z) > 0.0) {
  441 + ckv[k] = ckv[k]/cvk-M_PI*cii*civ[k];
  442 + civ[k] *= cvk;
  443 + }
  444 + }
  445 + }
  446 + civp[0] = v0*civ[0]/z+civ[1];
  447 + ckvp[0] = v0*ckv[0]/z-ckv[1];
  448 + for (k=1;k<=n;k++) {
  449 + civp[k] = -(k+v0)*civ[k]/z+civ[k-1];
  450 + ckvp[k] = -(k+v0)*ckv[k]/z-ckv[k-1];
  451 + }
  452 + vm = n+v0;
  453 + return 0;
  454 +}
... ...
CBESSJY.CPP renamed to cbessjy.cpp
1   -// cbessjy.cpp -- complex Bessel functions.
2   -// Algorithms and coefficient values from "Computation of Special
3   -// Functions", Zhang and Jin, John Wiley and Sons, 1996.
4   -//
5   -// (C) 2003, C. Bond. All rights reserved.
6   -//
7   -#include <complex>
8   -using namespace std;
9   -#include "bessel.h"
10   -double gamma(double);
11   -
12   -static complex<double> cii(0.0,1.0);
13   -static complex<double> cone(1.0,0.0);
14   -static complex<double> czero(0.0,0.0);
15   -
16   -int cbessjy01(complex<double> z,complex<double> &cj0,complex<double> &cj1,
17   - complex<double> &cy0,complex<double> &cy1,complex<double> &cj0p,
18   - complex<double> &cj1p,complex<double> &cy0p,complex<double> &cy1p)
19   -{
20   - complex<double> z1,z2,cr,cp,cs,cp0,cq0,cp1,cq1,ct1,ct2,cu;
21   - double a0,w0,w1;
22   - int k,kz;
23   -
24   - static double a[] = {
25   - -7.03125e-2,
26   - 0.112152099609375,
27   - -0.5725014209747314,
28   - 6.074042001273483,
29   - -1.100171402692467e2,
30   - 3.038090510922384e3,
31   - -1.188384262567832e5,
32   - 6.252951493434797e6,
33   - -4.259392165047669e8,
34   - 3.646840080706556e10,
35   - -3.833534661393944e12,
36   - 4.854014686852901e14,
37   - -7.286857349377656e16,
38   - 1.279721941975975e19};
39   - static double b[] = {
40   - 7.32421875e-2,
41   - -0.2271080017089844,
42   - 1.727727502584457,
43   - -2.438052969955606e1,
44   - 5.513358961220206e2,
45   - -1.825775547429318e4,
46   - 8.328593040162893e5,
47   - -5.006958953198893e7,
48   - 3.836255180230433e9,
49   - -3.649010818849833e11,
50   - 4.218971570284096e13,
51   - -5.827244631566907e15,
52   - 9.476288099260110e17,
53   - -1.792162323051699e20};
54   - static double a1[] = {
55   - 0.1171875,
56   - -0.1441955566406250,
57   - 0.6765925884246826,
58   - -6.883914268109947,
59   - 1.215978918765359e2,
60   - -3.302272294480852e3,
61   - 1.276412726461746e5,
62   - -6.656367718817688e6,
63   - 4.502786003050393e8,
64   - -3.833857520742790e10,
65   - 4.011838599133198e12,
66   - -5.060568503314727e14,
67   - 7.572616461117958e16,
68   - -1.326257285320556e19};
69   - static double b1[] = {
70   - -0.1025390625,
71   - 0.2775764465332031,
72   - -1.993531733751297,
73   - 2.724882731126854e1,
74   - -6.038440767050702e2,
75   - 1.971837591223663e4,
76   - -8.902978767070678e5,
77   - 5.310411010968522e7,
78   - -4.043620325107754e9,
79   - 3.827011346598605e11,
80   - -4.406481417852278e13,
81   - 6.065091351222699e15,
82   - -9.833883876590679e17,
83   - 1.855045211579828e20};
84   -
85   - a0 = abs(z);
86   - z2 = z*z;
87   - z1 = z;
88   - if (a0 == 0.0) {
89   - cj0 = cone;
90   - cj1 = czero;
91   - cy0 = complex<double>(-1e308,0);
92   - cy1 = complex<double>(-1e308,0);
93   - cj0p = czero;
94   - cj1p = complex<double>(0.5,0.0);
95   - cy0p = complex<double>(1e308,0);
96   - cy1p = complex<double>(1e308,0);
97   - return 0;
98   - }
99   - if (real(z) < 0.0) z1 = -z;
100   - if (a0 <= 12.0) {
101   - cj0 = cone;
102   - cr = cone;
103   - for (k=1;k<=40;k++) {
104   - cr *= -0.25*z2/(double)(k*k);
105   - cj0 += cr;
106   - if (abs(cr) < abs(cj0)*eps) break;
107   - }
108   - cj1 = cone;
109   - cr = cone;
110   - for (k=1;k<=40;k++) {
111   - cr *= -0.25*z2/(k*(k+1.0));
112   - cj1 += cr;
113   - if (abs(cr) < abs(cj1)*eps) break;
114   - }
115   - cj1 *= 0.5*z1;
116   - w0 = 0.0;
117   - cr = cone;
118   - cs = czero;
119   - for (k=1;k<=40;k++) {
120   - w0 += 1.0/k;
121   - cr *= -0.25*z2/(double)(k*k);
122   - cp = cr*w0;
123   - cs += cp;
124   - if (abs(cp) < abs(cs)*eps) break;
125   - }
126   - cy0 = M_2_PI*((log(0.5*z1)+el)*cj0-cs);
127   - w1 = 0.0;
128   - cr = cone;
129   - cs = cone;
130   - for (k=1;k<=40;k++) {
131   - w1 += 1.0/k;
132   - cr *= -0.25*z2/(k*(k+1.0));
133   - cp = cr*(2.0*w1+1.0/(k+1.0));
134   - cs += cp;
135   - if (abs(cp) < abs(cs)*eps) break;
136   - }
137   - cy1 = M_2_PI*((log(0.5*z1)+el)*cj1-1.0/z1-0.25*z1*cs);
138   - }
139   - else {
140   - if (a0 >= 50.0) kz = 8; // can be changed to 10
141   - else if (a0 >= 35.0) kz = 10; // " " " 12
142   - else kz = 12; // " " " 14
143   - ct1 = z1 - M_PI_4;
144   - cp0 = cone;
145   - for (k=0;k<kz;k++) {
146   - cp0 += a[k]*pow(z1,-2.0*k-2.0);
147   - }
148   - cq0 = -0.125/z1;
149   - for (k=0;k<kz;k++) {
150   - cq0 += b[k]*pow(z1,-2.0*k-3.0);
151   - }
152   - cu = sqrt(M_2_PI/z1);
153   - cj0 = cu*(cp0*cos(ct1)-cq0*sin(ct1));
154   - cy0 = cu*(cp0*sin(ct1)+cq0*cos(ct1));
155   - ct2 = z1 - 0.75*M_PI;
156   - cp1 = cone;
157   - for (k=0;k<kz;k++) {
158   - cp1 += a1[k]*pow(z1,-2.0*k-2.0);
159   - }
160   - cq1 = 0.375/z1;
161   - for (k=0;k<kz;k++) {
162   - cq1 += b1[k]*pow(z1,-2.0*k-3.0);
163   - }
164   - cj1 = cu*(cp1*cos(ct2)-cq1*sin(ct2));
165   - cy1 = cu*(cp1*sin(ct2)+cq1*cos(ct2));
166   - }
167   - if (real(z) < 0.0) {
168   - if (imag(z) < 0.0) {
169   - cy0 -= 2.0*cii*cj0;
170   - cy1 = -(cy1-2.0*cii*cj1);
171   - }
172   - else if (imag(z) > 0.0) {
173   - cy0 += 2.0*cii*cj0;
174   - cy1 = -(cy1+2.0*cii*cj1);
175   - }
176   - cj1 = -cj1;
177   - }
178   - cj0p = -cj1;
179   - cj1p = cj0-cj1/z;
180   - cy0p = -cy1;
181   - cy1p = cy0-cy1/z;
182   - return 0;
183   -}
184   -
185   -int cbessjyna(int n,complex<double> z,int &nm,complex<double> *cj,
186   - complex<double> *cy,complex<double> *cjp,complex<double> *cyp)
187   -{
188   - complex<double> cbj0,cbj1,cby0,cby1,cj0,cjk,cj1,cf,cf1,cf2;
189   - complex<double> cs,cg0,cg1,cyk,cyl1,cyl2,cylk,cp11,cp12,cp21,cp22;
190   - complex<double> ch0,ch1,ch2;
191   - double a0,yak,ya1,ya0,wa;
192   - int m,k,lb,lb0;
193   -
194   - if (n < 0) return 1;
195   - a0 = abs(z);
196   - nm = n;
197   - if (a0 < 1.0e-100) {
198   - for (k=0;k<=n;k++) {
199   - cj[k] = czero;
200   - cy[k] = complex<double> (-1e308,0);
201   - cjp[k] = czero;
202   - cyp[k] = complex<double>(1e308,0);
203   - }
204   - cj[0] = cone;
205   - cjp[1] = complex<double>(0.5,0.0);
206   - return 0;
207   - }
208   - cbessjy01(z,cj[0],cj[1],cy[0],cy[1],cjp[0],cjp[1],cyp[0],cyp[1]);
209   - cbj0 = cj[0];
210   - cbj1 = cj[1];
211   - cby0 = cy[0];
212   - cby1 = cy[1];
213   - if (n <= 1) return 0;
214   - if (n < (int)0.25*a0) {
215   - cj0 = cbj0;
216   - cj1 = cbj1;
217   - for (k=2;k<=n;k++) {
218   - cjk = 2.0*(k-1.0)*cj1/z-cj0;
219   - cj[k] = cjk;
220   - cj0 = cj1;
221   - cj1 = cjk;
222   - }
223   - }
224   - else {
225   - m = msta1(a0,200);
226   - if (m < n) nm = m;
227   - else m = msta2(a0,n,15);
228   - cf2 = czero;
229   - cf1 = complex<double> (1.0e-100,0.0);
230   - for (k=m;k>=0;k--) {
231   - cf = 2.0*(k+1.0)*cf1/z-cf2;
232   - if (k <=nm) cj[k] = cf;
233   - cf2 = cf1;
234   - cf1 = cf;
235   - }
236   - if (abs(cbj0) > abs(cbj1)) cs = cbj0/cf;
237   - else cs = cbj1/cf2;
238   - for (k=0;k<=nm;k++) {
239   - cj[k] *= cs;
240   - }
241   - }
242   - for (k=2;k<=nm;k++) {
243   - cjp[k] = cj[k-1]-(double)k*cj[k]/z;
244   - }
245   - ya0 = abs(cby0);
246   - lb = 0;
247   - cg0 = cby0;
248   - cg1 = cby1;
249   - for (k=2;k<=nm;k++) {
250   - cyk = 2.0*(k-1.0)*cg1/z-cg0;
251   - yak = abs(cyk);
252   - ya1 = abs(cg0);
253   - if ((yak < ya0) && (yak < ya1)) lb = k;
254   - cy[k] = cyk;
255   - cg0 = cg1;
256   - cg1 = cyk;
257   - }
258   - lb0 = 0;
259   - if ((lb > 4) && (imag(z) != 0.0)) {
260   - while (lb != lb0) {
261   - ch2 = cone;
262   - ch1 = czero;
263   - lb0 = lb;
264   - for (k=lb;k>=1;k--) {
265   - ch0 = 2.0*k*ch1/z-ch2;
266   - ch2 = ch1;
267   - ch1 = ch0;
268   - }
269   - cp12 = ch0;
270   - cp22 = ch2;
271   - ch2 = czero;
272   - ch1 = cone;
273   - for (k=lb;k>=1;k--) {
274   - ch0 = 2.0*k*ch1/z-ch2;
275   - ch2 = ch1;
276   - ch1 = ch0;
277   - }
278   - cp11 = ch0;
279   - cp21 = ch2;
280   - if (lb == nm)
281   - cj[lb+1] = 2.0*lb*cj[lb]/z-cj[lb-1];
282   - if (abs(cj[0]) > abs(cj[1])) {
283   - cy[lb+1] = (cj[lb+1]*cby0-2.0*cp11/(M_PI*z))/cj[0];
284   - cy[lb] = (cj[lb]*cby0+2.0*cp12/(M_PI*z))/cj[0];
285   - }
286   - else {
287   - cy[lb+1] = (cj[lb+1]*cby1-2.0*cp21/(M_PI*z))/cj[1];
288   - cy[lb] = (cj[lb]*cby1+2.0*cp22/(M_PI*z))/cj[1];
289   - }
290   - cyl2 = cy[lb+1];
291   - cyl1 = cy[lb];
292   - for (k=lb-1;k>=0;k--) {
293   - cylk = 2.0*(k+1.0)*cyl1/z-cyl2;
294   - cy[k] = cylk;
295   - cyl2 = cyl1;
296   - cyl1 = cylk;
297   - }
298   - cyl1 = cy[lb];
299   - cyl2 = cy[lb+1];
300   - for (k=lb+1;k<n;k++) {
301   - cylk = 2.0*k*cyl2/z-cyl1;
302   - cy[k+1] = cylk;
303   - cyl1 = cyl2;
304   - cyl2 = cylk;
305   - }
306   - for (k=2;k<=nm;k++) {
307   - wa = abs(cy[k]);
308   - if (wa < abs(cy[k-1])) lb = k;
309   - }
310   - }
311   - }
312   - for (k=2;k<=nm;k++) {
313   - cyp[k] = cy[k-1]-(double)k*cy[k]/z;
314   - }
315   - return 0;
316   -}
317   -
318   -int cbessjynb(int n,complex<double> z,int &nm,complex<double> *cj,
319   - complex<double> *cy,complex<double> *cjp,complex<double> *cyp)
320   -{
321   - complex<double> cf,cf0,cf1,cf2,cbs,csu,csv,cs0,ce;
322   - complex<double> ct1,cp0,cq0,cp1,cq1,cu,cbj0,cby0,cbj1,cby1;
323   - complex<double> cyy,cbjk,ct2;
324   - double a0,y0;
325   - int k,m;
326   - static double a[] = {
327   - -0.7031250000000000e-1,
328   - 0.1121520996093750,
329   - -0.5725014209747314,
330   - 6.074042001273483};
331   - static double b[] = {
332   - 0.7324218750000000e-1,
333   - -0.2271080017089844,
334   - 1.727727502584457,
335   - -2.438052969955606e1};
336   - static double a1[] = {
337   - 0.1171875,
338   - -0.1441955566406250,
339   - 0.6765925884246826,
340   - -6.883914268109947};
341   - static double b1[] = {
342   - -0.1025390625,
343   - 0.2775764465332031,
344   - -1.993531733751297,
345   - 2.724882731126854e1};
346   -
347   - y0 = abs(imag(z));
348   - a0 = abs(z);
349   - nm = n;
350   - if (a0 < 1.0e-100) {
351   - for (k=0;k<=n;k++) {
352   - cj[k] = czero;
353   - cy[k] = complex<double> (-1e308,0);
354   - cjp[k] = czero;
355   - cyp[k] = complex<double>(1e308,0);
356   - }
357   - cj[0] = cone;
358   - cjp[1] = complex<double>(0.5,0.0);
359   - return 0;
360   - }
361   - if ((a0 <= 300.0) || (n > (int)(0.25*a0))) {
362   - if (n == 0) nm = 1;
363   - m = msta1(a0,200);
364   - if (m < nm) nm = m;
365   - else m = msta2(a0,nm,15);
366   - cbs = czero;
367   - csu = czero;
368   - csv = czero;
369   - cf2 = czero;
370   - cf1 = complex<double> (1.0e-100,0.0);
371   - for (k=m;k>=0;k--) {
372   - cf = 2.0*(k+1.0)*cf1/z-cf2;
373   - if (k <= nm) cj[k] = cf;
374   - if (((k & 1) == 0) && (k != 0)) {
375   - if (y0 <= 1.0) {
376   - cbs += 2.0*cf;
377   - }
378   - else {
379   - cbs += (-1)*((k & 2)-1)*2.0*cf;
380   - }
381   - csu += (double)((-1)*((k & 2)-1))*cf/(double)k;
382   - }
383   - else if (k > 1) {
384   - csv += (double)((-1)*((k & 2)-1)*k)*cf/(double)(k*k-1.0);
385   - }
386   - cf2 = cf1;
387   - cf1 = cf;
388   - }
389   - if (y0 <= 1.0) cs0 = cbs+cf;
390   - else cs0 = (cbs+cf)/cos(z);
391   - for (k=0;k<=nm;k++) {
392   - cj[k] /= cs0;
393   - }
394   - ce = log(0.5*z)+el;
395   - cy[0] = M_2_PI*(ce*cj[0]-4.0*csu/cs0);
396   - cy[1] = M_2_PI*(-cj[0]/z+(ce-1.0)*cj[1]-4.0*csv/cs0);
397   - }
398   - else {
399   - ct1 = z-M_PI_4;
400   - cp0 = cone;
401   - for (k=0;k<4;k++) {
402   - cp0 += a[k]*pow(z,-2.0*k-2.0);
403   - }
404   - cq0 = -0.125/z;
405   - for (k=0;k<4;k++) {
406   - cq0 += b[k] *pow(z,-2.0*k-3.0);
407   - }
408   - cu = sqrt(M_2_PI/z);
409   - cbj0 = cu*(cp0*cos(ct1)-cq0*sin(ct1));
410   - cby0 = cu*(cp0*sin(ct1)+cq0*cos(ct1));
411   - cj[0] = cbj0;
412   - cy[0] = cby0;
413   - ct2 = z-0.75*M_PI;
414   - cp1 = cone;
415   - for (k=0;k<4;k++) {
416   - cp1 += a1[k]*pow(z,-2.0*k-2.0);
417   - }
418   - cq1 = 0.375/z;
419   - for (k=0;k<4;k++) {
420   - cq1 += b1[k]*pow(z,-2.0*k-3.0);
421   - }
422   - cbj1 = cu*(cp1*cos(ct2)-cq1*sin(ct2));
423   - cby1 = cu*(cp1*sin(ct2)+cq1*cos(ct2));
424   - cj[1] = cbj1;
425   - cy[1] = cby1;
426   - for (k=2;k<=n;k++) {
427   - cbjk = 2.0*(k-1.0)*cbj1/z-cbj0;
428   - cj[k] = cbjk;
429   - cbj0 = cbj1;
430   - cbj1 = cbjk;
431   - }
432   - }
433   - cjp[0] = -cj[1];
434   - for (k=1;k<=nm;k++) {
435   - cjp[k] = cj[k-1]-(double)k*cj[k]/z;
436   - }
437   - if (abs(cj[0]) > 1.0)
438   - cy[1] = (cj[1]*cy[0]-2.0/(M_PI*z))/cj[0];
439   - for (k=2;k<=nm;k++) {
440   - if (abs(cj[k-1]) >= abs(cj[k-2]))
441   - cyy = (cj[k]*cy[k-1]-2.0/(M_PI*z))/cj[k-1];
442   - else
443   - cyy = (cj[k]*cy[k-2]-4.0*(k-1.0)/(M_PI*z*z))/cj[k-2];
444   - cy[k] = cyy;
445   - }
446   - cyp[0] = -cy[1];
447   - for (k=1;k<=nm;k++) {
448   - cyp[k] = cy[k-1]-(double)k*cy[k]/z;
449   - }
450   -
451   - return 0;
452   -}
453   -
454   -int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
455   - complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp)
456   -{
457   - complex<double> z1,z2,zk,cjvl,cr,ca,cjv0,cjv1,cpz,crp;
458   - complex<double> cqz,crq,ca0,cck,csk,cyv0,cyv1,cju0,cju1,cb;
459   - complex<double> cs,cs0,cr0,cs1,cr1,cec,cf,cf0,cf1,cf2;
460   - complex<double> cfac0,cfac1,cg0,cg1,cyk,cp11,cp12,cp21,cp22;
461   - complex<double> ch0,ch1,ch2,cyl1,cyl2,cylk;
462   -
463   - double a0,v0,pv0,pv1,vl,ga,gb,vg,vv,w0,w1,ya0,yak,ya1,wa;
464   - int j,n,k,kz,l,lb,lb0,m;
465   -
466   - a0 = abs(z);
467   - z1 = z;
468   - z2 = z*z;
469   - n = (int)v;
470   -
471   -
472   - v0 = v-n;
473   -
474   - pv0 = M_PI*v0;
475   - pv1 = M_PI*(1.0+v0);
476   - if (a0 < 1.0e-100) {
477   - for (k=0;k<=n;k++) {
478   - cjv[k] = czero;
479   - cyv[k] = complex<double> (-1e308,0);
480   - cjvp[k] = czero;
481   - cyvp[k] = complex<double> (1e308,0);
482   -
483   - }
484   - if (v0 == 0.0) {
485   - cjv[0] = cone;
486   - cjvp[1] = complex<double> (0.5,0.0);
487   - }
488   - else {
489   - cjvp[0] = complex<double> (1e308,0);
490   - }
491   - vm = v;
492   - return 0;
493   - }
494   - if (real(z1) < 0.0) z1 = -z;
495   - if (a0 <= 12.0) {
496   - for (l=0;l<2;l++) {
497   - vl = v0+l;
498   - cjvl = cone;
499   - cr = cone;
500   - for (k=1;k<=40;k++) {
501   - cr *= -0.25*z2/(k*(k+vl));
502   - cjvl += cr;
503   - if (abs(cr) < abs(cjvl)*eps) break;
504   - }
505   - vg = 1.0 + vl;
506   - ga = gamma(vg);
507   - ca = pow(0.5*z1,vl)/ga;
508   - if (l == 0) cjv0 = cjvl*ca;
509   - else cjv1 = cjvl*ca;
510   - }
511   - }
512   - else {
513   - if (a0 >= 50.0) kz = 8;
514   - else if (a0 >= 35.0) kz = 10;
515   - else kz = 11;
516   - for (j=0;j<2;j++) {
517   - vv = 4.0*(j+v0)*(j+v0);
518   - cpz = cone;
519   - crp = cone;
520   - for (k=1;k<=kz;k++) {
521   - crp = -0.78125e-2*crp*(vv-pow(4.0*k-3.0,2.0))*
522   - (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*z2);
523   - cpz += crp;
524   - }
525   - cqz = cone;
526   - crq = cone;
527   - for (k=1;k<=kz;k++) {
528   - crq = -0.78125e-2*crq*(vv-pow(4.0*k-1.0,2.0))*
529   - (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*z2);
530   - cqz += crq;
531   - }
532   - cqz *= 0.125*(vv-1.0)/z1;
533   - zk = z1-(0.5*(j+v0)+0.25)*M_PI;
534   - ca0 = sqrt(M_2_PI/z1);
535   - cck = cos(zk);
536   - csk = sin(zk);
537   - if (j == 0) {
538   - cjv0 = ca0*(cpz*cck-cqz*csk);
539   - cyv0 = ca0*(cpz*csk+cqz+cck);
540   - }
541   - else {
542   - cjv1 = ca0*(cpz*cck-cqz*csk);
543   - cyv1 = ca0*(cpz*csk+cqz*cck);
544   - }
545   - }
546   - }
547   - if (a0 <= 12.0) {
548   - if (v0 != 0.0) {
549   - for (l=0;l<2;l++) {
550   - vl = v0+l;
551   - cjvl = cone;
552   - cr = cone;
553   - for (k=1;k<=40;k++) {
554   - cr *= -0.25*z2/(k*(k-vl));
555   - cjvl += cr;
556   - if (abs(cr) < abs(cjvl)*eps) break;
557   - }
558   - vg = 1.0-vl;
559   - gb = gamma(vg);
560   - cb = pow(2.0/z1,vl)/gb;
561   - if (l == 0) cju0 = cjvl*cb;
562   - else cju1 = cjvl*cb;
563   - }
564   - cyv0 = (cjv0*cos(pv0)-cju0)/sin(pv0);
565   - cyv1 = (cjv1*cos(pv1)-cju1)/sin(pv1);
566   - }
567   - else {
568   - cec = log(0.5*z1)+el;
569   - cs0 = czero;
570   - w0 = 0.0;
571   - cr0 = cone;
572   - for (k=1;k<=30;k++) {
573   - w0 += 1.0/k;
574   - cr0 *= -0.25*z2/(double)(k*k);
575   - cs0 += cr0*w0;
576   - }
577   - cyv0 = M_2_PI*(cec*cjv0-cs0);
578   - cs1 = cone;
579   - w1 = 0.0;
580   - cr1 = cone;
581   - for (k=1;k<=30;k++) {
582   - w1 += 1.0/k;
583   - cr1 *= -0.25*z2/(k*(k+1.0));
584   - cs1 += cr1*(2.0*w1+1.0/(k+1.0));
585   - }
586   - cyv1 = M_2_PI*(cec*cjv1-1.0/z1-0.25*z1*cs1);
587   - }
588   - }
589   - if (real(z) < 0.0) {
590   - cfac0 = exp(pv0*cii);
591   - cfac1 = exp(pv1*cii);
592   - if (imag(z) < 0.0) {
593   - cyv0 = cfac0*cyv0-2.0*cii*cos(pv0)*cjv0;
594   - cyv1 = cfac1*cyv1-2.0*cii*cos(pv1)*cjv1;
595   - cjv0 /= cfac0;
596   - cjv1 /= cfac1;
597   - }
598   - else if (imag(z) > 0.0) {
599   - cyv0 = cyv0/cfac0+2.0*cii*cos(pv0)*cjv0;
600   - cyv1 = cyv1/cfac1+2.0*cii*cos(pv1)*cjv1;
601   - cjv0 *= cfac0;
602   - cjv1 *= cfac1;
603   - }
604   - }
605   - cjv[0] = cjv0;
606   - cjv[1] = cjv1;
607   - if ((n >= 2) && (n <= (int)(0.25*a0))) {
608   - cf0 = cjv0;
609   - cf1 = cjv1;
610   - for (k=2;k<= n;k++) {
611   - cf = 2.0*(k+v0-1.0)*cf1/z-cf0;
612   - cjv[k] = cf;
613   - cf0 = cf1;
614   - cf1 = cf;
615   - }
616   - }
617   - else if (n >= 2) {
618   - m = msta1(a0,200);
619   - if (m < n) n = m;
620   - else m = msta2(a0,n,15);
621   - cf2 = czero;
622   - cf1 = complex<double>(1.0e-100,0.0);
623   - for (k=m;k>=0;k--) {
624   - cf = 2.0*(v0+k+1.0)*cf1/z-cf2;
625   - if (k <= n) cjv[k] = cf;
626   - cf2 = cf1;
627   - cf1 = cf;
628   - }
629   - if (abs(cjv0) > abs(cjv1)) cs = cjv0/cf;
630   - else cs = cjv1/cf2;
631   - for (k=0;k<=n;k++) {
632   - cjv[k] *= cs;
633   - }
634   - }
635   - cjvp[0] = v0*cjv[0]/z-cjv[1];
636   - for (k=1;k<=n;k++) {
637   - cjvp[k] = -(k+v0)*cjv[k]/z+cjv[k-1];
638   - }
639   - cyv[0] = cyv0;
640   - cyv[1] = cyv1;
641   - ya0 = abs(cyv0);
642   - lb = 0;
643   - cg0 = cyv0;
644   - cg1 = cyv1;
645   - for (k=2;k<=n;k++) {
646   - cyk = 2.0*(v0+k-1.0)*cg1/z-cg0;
647   - yak = abs(cyk);
648   - ya1 = abs(cg0);
649   - if ((yak < ya0) && (yak< ya1)) lb = k;
650   - cyv[k] = cyk;
651   - cg0 = cg1;
652   - cg1 = cyk;
653   - }
654   - lb0 = 0;
655   - if ((lb > 4) && (imag(z) != 0.0)) {
656   - while(lb != lb0) {
657   - ch2 = cone;
658   - ch1 = czero;
659   - lb0 = lb;
660   - for (k=lb;k>=1;k--) {
661   - ch0 = 2.0*(k+v0)*ch1/z-ch2;
662   - ch2 = ch1;
663   - ch1 = ch0;
664   - }
665   - cp12 = ch0;
666   - cp22 = ch2;
667   - ch2 = czero;
668   - ch1 = cone;
669   - for (k=lb;k>=1;k--) {
670   - ch0 = 2.0*(k+v0)*ch1/z-ch2;
671   - ch2 = ch1;
672   - ch1 = ch0;
673   - }
674   - cp11 = ch0;
675   - cp21 = ch2;
676   - if (lb == n)
677   - cjv[lb+1] = 2.0*(lb+v0)*cjv[lb]/z-cjv[lb-1];
678   - if (abs(cjv[0]) > abs(cjv[1])) {
679   - cyv[lb+1] = (cjv[lb+1]*cyv0-2.0*cp11/(M_PI*z))/cjv[0];
680   - cyv[lb] = (cjv[lb]*cyv0+2.0*cp12/(M_PI*z))/cjv[0];
681   - }
682   - else {
683   - cyv[lb+1] = (cjv[lb+1]*cyv1-2.0*cp21/(M_PI*z))/cjv[1];
684   - cyv[lb] = (cjv[lb]*cyv1+2.0*cp22/(M_PI*z))/cjv[1];
685   - }
686   - cyl2 = cyv[lb+1];
687   - cyl1 = cyv[lb];
688   - for (k=lb-1;k>=0;k--) {
689   - cylk = 2.0*(k+v0+1.0)*cyl1/z-cyl2;
690   - cyv[k] = cylk;
691   - cyl2 = cyl1;
692   - cyl1 = cylk;
693   - }
694   - cyl1 = cyv[lb];
695   - cyl2 = cyv[lb+1];
696   - for (k=lb+1;k<n;k++) {
697   - cylk = 2.0*(k+v0)*cyl2/z-cyl1;
698   - cyv[k+1] = cylk;
699   - cyl1 = cyl2;
700   - cyl2 = cylk;
701   - }
702   - for (k=2;k<=n;k++) {
703   - wa = abs(cyv[k]);
704   - if (wa < abs(cyv[k-1])) lb = k;
705   - }
706   - }
707   - }
708   - cyvp[0] = v0*cyv[0]/z-cyv[1];
709   - for (k=1;k<=n;k++) {
710   - cyvp[k] = cyv[k-1]-(k+v0)*cyv[k]/z;
711   - }
712   - vm = n+v0;
713   - return 0;
714   -}
715   -
716   -
  1 +// cbessjy.cpp -- complex Bessel functions.
  2 +// Algorithms and coefficient values from "Computation of Special
  3 +// Functions", Zhang and Jin, John Wiley and Sons, 1996.
  4 +//
  5 +// (C) 2003, C. Bond. All rights reserved.
  6 +//
  7 +#include <complex>
  8 +using namespace std;
  9 +#include "bessel.h"
  10 +double gamma(double);
  11 +
  12 +static complex<double> cii(0.0,1.0);
  13 +static complex<double> cone(1.0,0.0);
  14 +static complex<double> czero(0.0,0.0);
  15 +
  16 +int cbessjy01(complex<double> z,complex<double> &cj0,complex<double> &cj1,
  17 + complex<double> &cy0,complex<double> &cy1,complex<double> &cj0p,
  18 + complex<double> &cj1p,complex<double> &cy0p,complex<double> &cy1p)
  19 +{
  20 + complex<double> z1,z2,cr,cp,cs,cp0,cq0,cp1,cq1,ct1,ct2,cu;
  21 + double a0,w0,w1;
  22 + int k,kz;
  23 +
  24 + static double a[] = {
  25 + -7.03125e-2,
  26 + 0.112152099609375,
  27 + -0.5725014209747314,
  28 + 6.074042001273483,
  29 + -1.100171402692467e2,
  30 + 3.038090510922384e3,
  31 + -1.188384262567832e5,
  32 + 6.252951493434797e6,
  33 + -4.259392165047669e8,
  34 + 3.646840080706556e10,
  35 + -3.833534661393944e12,
  36 + 4.854014686852901e14,
  37 + -7.286857349377656e16,
  38 + 1.279721941975975e19};
  39 + static double b[] = {
  40 + 7.32421875e-2,
  41 + -0.2271080017089844,
  42 + 1.727727502584457,
  43 + -2.438052969955606e1,
  44 + 5.513358961220206e2,
  45 + -1.825775547429318e4,
  46 + 8.328593040162893e5,
  47 + -5.006958953198893e7,
  48 + 3.836255180230433e9,
  49 + -3.649010818849833e11,
  50 + 4.218971570284096e13,
  51 + -5.827244631566907e15,
  52 + 9.476288099260110e17,
  53 + -1.792162323051699e20};
  54 + static double a1[] = {
  55 + 0.1171875,
  56 + -0.1441955566406250,
  57 + 0.6765925884246826,
  58 + -6.883914268109947,
  59 + 1.215978918765359e2,
  60 + -3.302272294480852e3,
  61 + 1.276412726461746e5,
  62 + -6.656367718817688e6,
  63 + 4.502786003050393e8,
  64 + -3.833857520742790e10,
  65 + 4.011838599133198e12,
  66 + -5.060568503314727e14,
  67 + 7.572616461117958e16,
  68 + -1.326257285320556e19};
  69 + static double b1[] = {
  70 + -0.1025390625,
  71 + 0.2775764465332031,
  72 + -1.993531733751297,
  73 + 2.724882731126854e1,
  74 + -6.038440767050702e2,
  75 + 1.971837591223663e4,
  76 + -8.902978767070678e5,
  77 + 5.310411010968522e7,
  78 + -4.043620325107754e9,
  79 + 3.827011346598605e11,
  80 + -4.406481417852278e13,
  81 + 6.065091351222699e15,
  82 + -9.833883876590679e17,
  83 + 1.855045211579828e20};
  84 +
  85 + a0 = abs(z);
  86 + z2 = z*z;
  87 + z1 = z;
  88 + if (a0 == 0.0) {
  89 + cj0 = cone;
  90 + cj1 = czero;
  91 + cy0 = complex<double>(-1e308,0);
  92 + cy1 = complex<double>(-1e308,0);
  93 + cj0p = czero;
  94 + cj1p = complex<double>(0.5,0.0);
  95 + cy0p = complex<double>(1e308,0);
  96 + cy1p = complex<double>(1e308,0);
  97 + return 0;
  98 + }
  99 + if (real(z) < 0.0) z1 = -z;
  100 + if (a0 <= 12.0) {
  101 + cj0 = cone;
  102 + cr = cone;
  103 + for (k=1;k<=40;k++) {
  104 + cr *= -0.25*z2/(double)(k*k);
  105 + cj0 += cr;
  106 + if (abs(cr) < abs(cj0)*eps) break;
  107 + }
  108 + cj1 = cone;
  109 + cr = cone;
  110 + for (k=1;k<=40;k++) {
  111 + cr *= -0.25*z2/(k*(k+1.0));
  112 + cj1 += cr;
  113 + if (abs(cr) < abs(cj1)*eps) break;
  114 + }
  115 + cj1 *= 0.5*z1;
  116 + w0 = 0.0;
  117 + cr = cone;
  118 + cs = czero;
  119 + for (k=1;k<=40;k++) {
  120 + w0 += 1.0/k;
  121 + cr *= -0.25*z2/(double)(k*k);
  122 + cp = cr*w0;
  123 + cs += cp;
  124 + if (abs(cp) < abs(cs)*eps) break;
  125 + }
  126 + cy0 = M_2_PI*((log(0.5*z1)+el)*cj0-cs);
  127 + w1 = 0.0;
  128 + cr = cone;
  129 + cs = cone;
  130 + for (k=1;k<=40;k++) {
  131 + w1 += 1.0/k;
  132 + cr *= -0.25*z2/(k*(k+1.0));
  133 + cp = cr*(2.0*w1+1.0/(k+1.0));
  134 + cs += cp;
  135 + if (abs(cp) < abs(cs)*eps) break;
  136 + }
  137 + cy1 = M_2_PI*((log(0.5*z1)+el)*cj1-1.0/z1-0.25*z1*cs);
  138 + }
  139 + else {
  140 + if (a0 >= 50.0) kz = 8; // can be changed to 10
  141 + else if (a0 >= 35.0) kz = 10; // " " " 12
  142 + else kz = 12; // " " " 14
  143 + ct1 = z1 - M_PI_4;
  144 + cp0 = cone;
  145 + for (k=0;k<kz;k++) {
  146 + cp0 += a[k]*pow(z1,-2.0*k-2.0);
  147 + }
  148 + cq0 = -0.125/z1;
  149 + for (k=0;k<kz;k++) {
  150 + cq0 += b[k]*pow(z1,-2.0*k-3.0);
  151 + }
  152 + cu = sqrt(M_2_PI/z1);
  153 + cj0 = cu*(cp0*cos(ct1)-cq0*sin(ct1));
  154 + cy0 = cu*(cp0*sin(ct1)+cq0*cos(ct1));
  155 + ct2 = z1 - 0.75*M_PI;
  156 + cp1 = cone;
  157 + for (k=0;k<kz;k++) {
  158 + cp1 += a1[k]*pow(z1,-2.0*k-2.0);
  159 + }
  160 + cq1 = 0.375/z1;
  161 + for (k=0;k<kz;k++) {
  162 + cq1 += b1[k]*pow(z1,-2.0*k-3.0);
  163 + }
  164 + cj1 = cu*(cp1*cos(ct2)-cq1*sin(ct2));
  165 + cy1 = cu*(cp1*sin(ct2)+cq1*cos(ct2));
  166 + }
  167 + if (real(z) < 0.0) {
  168 + if (imag(z) < 0.0) {
  169 + cy0 -= 2.0*cii*cj0;
  170 + cy1 = -(cy1-2.0*cii*cj1);
  171 + }
  172 + else if (imag(z) > 0.0) {
  173 + cy0 += 2.0*cii*cj0;
  174 + cy1 = -(cy1+2.0*cii*cj1);
  175 + }
  176 + cj1 = -cj1;
  177 + }
  178 + cj0p = -cj1;
  179 + cj1p = cj0-cj1/z;
  180 + cy0p = -cy1;
  181 + cy1p = cy0-cy1/z;
  182 + return 0;
  183 +}
  184 +
  185 +int cbessjyna(int n,complex<double> z,int &nm,complex<double> *cj,
  186 + complex<double> *cy,complex<double> *cjp,complex<double> *cyp)
  187 +{
  188 + complex<double> cbj0,cbj1,cby0,cby1,cj0,cjk,cj1,cf,cf1,cf2;
  189 + complex<double> cs,cg0,cg1,cyk,cyl1,cyl2,cylk,cp11,cp12,cp21,cp22;
  190 + complex<double> ch0,ch1,ch2;
  191 + double a0,yak,ya1,ya0,wa;
  192 + int m,k,lb,lb0;
  193 +
  194 + if (n < 0) return 1;
  195 + a0 = abs(z);
  196 + nm = n;
  197 + if (a0 < 1.0e-100) {
  198 + for (k=0;k<=n;k++) {
  199 + cj[k] = czero;
  200 + cy[k] = complex<double> (-1e308,0);
  201 + cjp[k] = czero;
  202 + cyp[k] = complex<double>(1e308,0);
  203 + }
  204 + cj[0] = cone;
  205 + cjp[1] = complex<double>(0.5,0.0);
  206 + return 0;
  207 + }
  208 + cbessjy01(z,cj[0],cj[1],cy[0],cy[1],cjp[0],cjp[1],cyp[0],cyp[1]);
  209 + cbj0 = cj[0];
  210 + cbj1 = cj[1];
  211 + cby0 = cy[0];
  212 + cby1 = cy[1];
  213 + if (n <= 1) return 0;
  214 + if (n < (int)0.25*a0) {
  215 + cj0 = cbj0;
  216 + cj1 = cbj1;
  217 + for (k=2;k<=n;k++) {
  218 + cjk = 2.0*(k-1.0)*cj1/z-cj0;
  219 + cj[k] = cjk;
  220 + cj0 = cj1;
  221 + cj1 = cjk;
  222 + }
  223 + }
  224 + else {
  225 + m = msta1(a0,200);
  226 + if (m < n) nm = m;
  227 + else m = msta2(a0,n,15);
  228 + cf2 = czero;
  229 + cf1 = complex<double> (1.0e-100,0.0);
  230 + for (k=m;k>=0;k--) {
  231 + cf = 2.0*(k+1.0)*cf1/z-cf2;
  232 + if (k <=nm) cj[k] = cf;
  233 + cf2 = cf1;
  234 + cf1 = cf;
  235 + }
  236 + if (abs(cbj0) > abs(cbj1)) cs = cbj0/cf;
  237 + else cs = cbj1/cf2;
  238 + for (k=0;k<=nm;k++) {
  239 + cj[k] *= cs;
  240 + }
  241 + }
  242 + for (k=2;k<=nm;k++) {
  243 + cjp[k] = cj[k-1]-(double)k*cj[k]/z;
  244 + }
  245 + ya0 = abs(cby0);
  246 + lb = 0;
  247 + cg0 = cby0;
  248 + cg1 = cby1;
  249 + for (k=2;k<=nm;k++) {
  250 + cyk = 2.0*(k-1.0)*cg1/z-cg0;
  251 + yak = abs(cyk);
  252 + ya1 = abs(cg0);
  253 + if ((yak < ya0) && (yak < ya1)) lb = k;
  254 + cy[k] = cyk;
  255 + cg0 = cg1;
  256 + cg1 = cyk;
  257 + }
  258 + lb0 = 0;
  259 + if ((lb > 4) && (imag(z) != 0.0)) {
  260 + while (lb != lb0) {
  261 + ch2 = cone;
  262 + ch1 = czero;
  263 + lb0 = lb;
  264 + for (k=lb;k>=1;k--) {
  265 + ch0 = 2.0*k*ch1/z-ch2;
  266 + ch2 = ch1;
  267 + ch1 = ch0;
  268 + }
  269 + cp12 = ch0;
  270 + cp22 = ch2;
  271 + ch2 = czero;
  272 + ch1 = cone;
  273 + for (k=lb;k>=1;k--) {
  274 + ch0 = 2.0*k*ch1/z-ch2;
  275 + ch2 = ch1;
  276 + ch1 = ch0;
  277 + }
  278 + cp11 = ch0;
  279 + cp21 = ch2;
  280 + if (lb == nm)
  281 + cj[lb+1] = 2.0*lb*cj[lb]/z-cj[lb-1];
  282 + if (abs(cj[0]) > abs(cj[1])) {
  283 + cy[lb+1] = (cj[lb+1]*cby0-2.0*cp11/(M_PI*z))/cj[0];
  284 + cy[lb] = (cj[lb]*cby0+2.0*cp12/(M_PI*z))/cj[0];
  285 + }
  286 + else {
  287 + cy[lb+1] = (cj[lb+1]*cby1-2.0*cp21/(M_PI*z))/cj[1];
  288 + cy[lb] = (cj[lb]*cby1+2.0*cp22/(M_PI*z))/cj[1];
  289 + }
  290 + cyl2 = cy[lb+1];
  291 + cyl1 = cy[lb];
  292 + for (k=lb-1;k>=0;k--) {
  293 + cylk = 2.0*(k+1.0)*cyl1/z-cyl2;
  294 + cy[k] = cylk;
  295 + cyl2 = cyl1;
  296 + cyl1 = cylk;
  297 + }
  298 + cyl1 = cy[lb];
  299 + cyl2 = cy[lb+1];
  300 + for (k=lb+1;k<n;k++) {
  301 + cylk = 2.0*k*cyl2/z-cyl1;
  302 + cy[k+1] = cylk;
  303 + cyl1 = cyl2;
  304 + cyl2 = cylk;
  305 + }
  306 + for (k=2;k<=nm;k++) {
  307 + wa = abs(cy[k]);
  308 + if (wa < abs(cy[k-1])) lb = k;
  309 + }
  310 + }
  311 + }
  312 + for (k=2;k<=nm;k++) {
  313 + cyp[k] = cy[k-1]-(double)k*cy[k]/z;
  314 + }
  315 + return 0;
  316 +}
  317 +
  318 +int cbessjynb(int n,complex<double> z,int &nm,complex<double> *cj,
  319 + complex<double> *cy,complex<double> *cjp,complex<double> *cyp)
  320 +{
  321 + complex<double> cf,cf0,cf1,cf2,cbs,csu,csv,cs0,ce;
  322 + complex<double> ct1,cp0,cq0,cp1,cq1,cu,cbj0,cby0,cbj1,cby1;
  323 + complex<double> cyy,cbjk,ct2;
  324 + double a0,y0;
  325 + int k,m;
  326 + static double a[] = {
  327 + -0.7031250000000000e-1,
  328 + 0.1121520996093750,
  329 + -0.5725014209747314,
  330 + 6.074042001273483};
  331 + static double b[] = {
  332 + 0.7324218750000000e-1,
  333 + -0.2271080017089844,
  334 + 1.727727502584457,
  335 + -2.438052969955606e1};
  336 + static double a1[] = {
  337 + 0.1171875,
  338 + -0.1441955566406250,
  339 + 0.6765925884246826,
  340 + -6.883914268109947};
  341 + static double b1[] = {
  342 + -0.1025390625,
  343 + 0.2775764465332031,
  344 + -1.993531733751297,
  345 + 2.724882731126854e1};
  346 +
  347 + y0 = abs(imag(z));
  348 + a0 = abs(z);
  349 + nm = n;
  350 + if (a0 < 1.0e-100) {
  351 + for (k=0;k<=n;k++) {
  352 + cj[k] = czero;
  353 + cy[k] = complex<double> (-1e308,0);
  354 + cjp[k] = czero;
  355 + cyp[k] = complex<double>(1e308,0);
  356 + }
  357 + cj[0] = cone;
  358 + cjp[1] = complex<double>(0.5,0.0);
  359 + return 0;
  360 + }
  361 + if ((a0 <= 300.0) || (n > (int)(0.25*a0))) {
  362 + if (n == 0) nm = 1;
  363 + m = msta1(a0,200);
  364 + if (m < nm) nm = m;
  365 + else m = msta2(a0,nm,15);
  366 + cbs = czero;
  367 + csu = czero;
  368 + csv = czero;
  369 + cf2 = czero;
  370 + cf1 = complex<double> (1.0e-100,0.0);
  371 + for (k=m;k>=0;k--) {
  372 + cf = 2.0*(k+1.0)*cf1/z-cf2;
  373 + if (k <= nm) cj[k] = cf;
  374 + if (((k & 1) == 0) && (k != 0)) {
  375 + if (y0 <= 1.0) {
  376 + cbs += 2.0*cf;
  377 + }
  378 + else {
  379 + cbs += (-1)*((k & 2)-1)*2.0*cf;
  380 + }
  381 + csu += (double)((-1)*((k & 2)-1))*cf/(double)k;
  382 + }
  383 + else if (k > 1) {
  384 + csv += (double)((-1)*((k & 2)-1)*k)*cf/(double)(k*k-1.0);
  385 + }
  386 + cf2 = cf1;
  387 + cf1 = cf;
  388 + }
  389 + if (y0 <= 1.0) cs0 = cbs+cf;
  390 + else cs0 = (cbs+cf)/cos(z);
  391 + for (k=0;k<=nm;k++) {
  392 + cj[k] /= cs0;
  393 + }
  394 + ce = log(0.5*z)+el;
  395 + cy[0] = M_2_PI*(ce*cj[0]-4.0*csu/cs0);
  396 + cy[1] = M_2_PI*(-cj[0]/z+(ce-1.0)*cj[1]-4.0*csv/cs0);
  397 + }
  398 + else {
  399 + ct1 = z-M_PI_4;
  400 + cp0 = cone;
  401 + for (k=0;k<4;k++) {
  402 + cp0 += a[k]*pow(z,-2.0*k-2.0);
  403 + }
  404 + cq0 = -0.125/z;
  405 + for (k=0;k<4;k++) {
  406 + cq0 += b[k] *pow(z,-2.0*k-3.0);
  407 + }
  408 + cu = sqrt(M_2_PI/z);
  409 + cbj0 = cu*(cp0*cos(ct1)-cq0*sin(ct1));
  410 + cby0 = cu*(cp0*sin(ct1)+cq0*cos(ct1));
  411 + cj[0] = cbj0;
  412 + cy[0] = cby0;
  413 + ct2 = z-0.75*M_PI;
  414 + cp1 = cone;
  415 + for (k=0;k<4;k++) {
  416 + cp1 += a1[k]*pow(z,-2.0*k-2.0);
  417 + }
  418 + cq1 = 0.375/z;
  419 + for (k=0;k<4;k++) {
  420 + cq1 += b1[k]*pow(z,-2.0*k-3.0);
  421 + }
  422 + cbj1 = cu*(cp1*cos(ct2)-cq1*sin(ct2));
  423 + cby1 = cu*(cp1*sin(ct2)+cq1*cos(ct2));
  424 + cj[1] = cbj1;
  425 + cy[1] = cby1;
  426 + for (k=2;k<=n;k++) {
  427 + cbjk = 2.0*(k-1.0)*cbj1/z-cbj0;
  428 + cj[k] = cbjk;
  429 + cbj0 = cbj1;
  430 + cbj1 = cbjk;
  431 + }
  432 + }
  433 + cjp[0] = -cj[1];
  434 + for (k=1;k<=nm;k++) {
  435 + cjp[k] = cj[k-1]-(double)k*cj[k]/z;
  436 + }
  437 + if (abs(cj[0]) > 1.0)
  438 + cy[1] = (cj[1]*cy[0]-2.0/(M_PI*z))/cj[0];
  439 + for (k=2;k<=nm;k++) {
  440 + if (abs(cj[k-1]) >= abs(cj[k-2]))
  441 + cyy = (cj[k]*cy[k-1]-2.0/(M_PI*z))/cj[k-1];
  442 + else
  443 + cyy = (cj[k]*cy[k-2]-4.0*(k-1.0)/(M_PI*z*z))/cj[k-2];
  444 + cy[k] = cyy;
  445 + }
  446 + cyp[0] = -cy[1];
  447 + for (k=1;k<=nm;k++) {
  448 + cyp[k] = cy[k-1]-(double)k*cy[k]/z;
  449 + }
  450 +
  451 + return 0;
  452 +}
  453 +
  454 +int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
  455 + complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp)
  456 +{
  457 + complex<double> z1,z2,zk,cjvl,cr,ca,cjv0,cjv1,cpz,crp;
  458 + complex<double> cqz,crq,ca0,cck,csk,cyv0,cyv1,cju0,cju1,cb;
  459 + complex<double> cs,cs0,cr0,cs1,cr1,cec,cf,cf0,cf1,cf2;
  460 + complex<double> cfac0,cfac1,cg0,cg1,cyk,cp11,cp12,cp21,cp22;
  461 + complex<double> ch0,ch1,ch2,cyl1,cyl2,cylk;
  462 +
  463 + double a0,v0,pv0,pv1,vl,ga,gb,vg,vv,w0,w1,ya0,yak,ya1,wa;
  464 + int j,n,k,kz,l,lb,lb0,m;
  465 +
  466 + a0 = abs(z);
  467 + z1 = z;
  468 + z2 = z*z;
  469 + n = (int)v;
  470 +
  471 +
  472 + v0 = v-n;
  473 +
  474 + pv0 = M_PI*v0;
  475 + pv1 = M_PI*(1.0+v0);
  476 + if (a0 < 1.0e-100) {
  477 + for (k=0;k<=n;k++) {
  478 + cjv[k] = czero;
  479 + cyv[k] = complex<double> (-1e308,0);
  480 + cjvp[k] = czero;
  481 + cyvp[k] = complex<double> (1e308,0);
  482 +
  483 + }
  484 + if (v0 == 0.0) {
  485 + cjv[0] = cone;
  486 + cjvp[1] = complex<double> (0.5,0.0);
  487 + }
  488 + else {
  489 + cjvp[0] = complex<double> (1e308,0);
  490 + }
  491 + vm = v;
  492 + return 0;
  493 + }
  494 + if (real(z1) < 0.0) z1 = -z;
  495 + if (a0 <= 12.0) {
  496 + for (l=0;l<2;l++) {
  497 + vl = v0+l;
  498 + cjvl = cone;
  499 + cr = cone;
  500 + for (k=1;k<=40;k++) {
  501 + cr *= -0.25*z2/(k*(k+vl));
  502 + cjvl += cr;
  503 + if (abs(cr) < abs(cjvl)*eps) break;
  504 + }
  505 + vg = 1.0 + vl;
  506 + ga = gamma(vg);
  507 + ca = pow(0.5*z1,vl)/ga;
  508 + if (l == 0) cjv0 = cjvl*ca;
  509 + else cjv1 = cjvl*ca;
  510 + }
  511 + }
  512 + else {
  513 + if (a0 >= 50.0) kz = 8;
  514 + else if (a0 >= 35.0) kz = 10;
  515 + else kz = 11;
  516 + for (j=0;j<2;j++) {
  517 + vv = 4.0*(j+v0)*(j+v0);
  518 + cpz = cone;
  519 + crp = cone;
  520 + for (k=1;k<=kz;k++) {
  521 + crp = -0.78125e-2*crp*(vv-pow(4.0*k-3.0,2.0))*
  522 + (vv-pow(4.0*k-1.0,2.0))/(k*(2.0*k-1.0)*z2);
  523 + cpz += crp;
  524 + }
  525 + cqz = cone;
  526 + crq = cone;
  527 + for (k=1;k<=kz;k++) {
  528 + crq = -0.78125e-2*crq*(vv-pow(4.0*k-1.0,2.0))*
  529 + (vv-pow(4.0*k+1.0,2.0))/(k*(2.0*k+1.0)*z2);
  530 + cqz += crq;
  531 + }
  532 + cqz *= 0.125*(vv-1.0)/z1;
  533 + zk = z1-(0.5*(j+v0)+0.25)*M_PI;
  534 + ca0 = sqrt(M_2_PI/z1);
  535 + cck = cos(zk);
  536 + csk = sin(zk);
  537 + if (j == 0) {
  538 + cjv0 = ca0*(cpz*cck-cqz*csk);
  539 + cyv0 = ca0*(cpz*csk+cqz+cck);
  540 + }
  541 + else {
  542 + cjv1 = ca0*(cpz*cck-cqz*csk);
  543 + cyv1 = ca0*(cpz*csk+cqz*cck);
  544 + }
  545 + }
  546 + }
  547 + if (a0 <= 12.0) {
  548 + if (v0 != 0.0) {
  549 + for (l=0;l<2;l++) {
  550 + vl = v0+l;
  551 + cjvl = cone;
  552 + cr = cone;
  553 + for (k=1;k<=40;k++) {
  554 + cr *= -0.25*z2/(k*(k-vl));
  555 + cjvl += cr;
  556 + if (abs(cr) < abs(cjvl)*eps) break;
  557 + }
  558 + vg = 1.0-vl;
  559 + gb = gamma(vg);
  560 + cb = pow(2.0/z1,vl)/gb;
  561 + if (l == 0) cju0 = cjvl*cb;
  562 + else cju1 = cjvl*cb;
  563 + }
  564 + cyv0 = (cjv0*cos(pv0)-cju0)/sin(pv0);
  565 + cyv1 = (cjv1*cos(pv1)-cju1)/sin(pv1);
  566 + }
  567 + else {
  568 + cec = log(0.5*z1)+el;
  569 + cs0 = czero;
  570 + w0 = 0.0;
  571 + cr0 = cone;
  572 + for (k=1;k<=30;k++) {
  573 + w0 += 1.0/k;
  574 + cr0 *= -0.25*z2/(double)(k*k);
  575 + cs0 += cr0*w0;
  576 + }
  577 + cyv0 = M_2_PI*(cec*cjv0-cs0);
  578 + cs1 = cone;
  579 + w1 = 0.0;
  580 + cr1 = cone;
  581 + for (k=1;k<=30;k++) {
  582 + w1 += 1.0/k;
  583 + cr1 *= -0.25*z2/(k*(k+1.0));
  584 + cs1 += cr1*(2.0*w1+1.0/(k+1.0));
  585 + }
  586 + cyv1 = M_2_PI*(cec*cjv1-1.0/z1-0.25*z1*cs1);
  587 + }
  588 + }
  589 + if (real(z) < 0.0) {
  590 + cfac0 = exp(pv0*cii);
  591 + cfac1 = exp(pv1*cii);
  592 + if (imag(z) < 0.0) {
  593 + cyv0 = cfac0*cyv0-2.0*cii*cos(pv0)*cjv0;
  594 + cyv1 = cfac1*cyv1-2.0*cii*cos(pv1)*cjv1;
  595 + cjv0 /= cfac0;
  596 + cjv1 /= cfac1;
  597 + }
  598 + else if (imag(z) > 0.0) {
  599 + cyv0 = cyv0/cfac0+2.0*cii*cos(pv0)*cjv0;
  600 + cyv1 = cyv1/cfac1+2.0*cii*cos(pv1)*cjv1;
  601 + cjv0 *= cfac0;
  602 + cjv1 *= cfac1;
  603 + }
  604 + }
  605 + cjv[0] = cjv0;
  606 + cjv[1] = cjv1;
  607 + if ((n >= 2) && (n <= (int)(0.25*a0))) {
  608 + cf0 = cjv0;
  609 + cf1 = cjv1;
  610 + for (k=2;k<= n;k++) {
  611 + cf = 2.0*(k+v0-1.0)*cf1/z-cf0;
  612 + cjv[k] = cf;
  613 + cf0 = cf1;
  614 + cf1 = cf;
  615 + }
  616 + }
  617 + else if (n >= 2) {
  618 + m = msta1(a0,200);
  619 + if (m < n) n = m;
  620 + else m = msta2(a0,n,15);
  621 + cf2 = czero;
  622 + cf1 = complex<double>(1.0e-100,0.0);
  623 + for (k=m;k>=0;k--) {
  624 + cf = 2.0*(v0+k+1.0)*cf1/z-cf2;
  625 + if (k <= n) cjv[k] = cf;
  626 + cf2 = cf1;
  627 + cf1 = cf;
  628 + }
  629 + if (abs(cjv0) > abs(cjv1)) cs = cjv0/cf;
  630 + else cs = cjv1/cf2;
  631 + for (k=0;k<=n;k++) {
  632 + cjv[k] *= cs;
  633 + }
  634 + }
  635 + cjvp[0] = v0*cjv[0]/z-cjv[1];
  636 + for (k=1;k<=n;k++) {
  637 + cjvp[k] = -(k+v0)*cjv[k]/z+cjv[k-1];
  638 + }
  639 + cyv[0] = cyv0;
  640 + cyv[1] = cyv1;
  641 + ya0 = abs(cyv0);
  642 + lb = 0;
  643 + cg0 = cyv0;
  644 + cg1 = cyv1;
  645 + for (k=2;k<=n;k++) {
  646 + cyk = 2.0*(v0+k-1.0)*cg1/z-cg0;
  647 + yak = abs(cyk);
  648 + ya1 = abs(cg0);
  649 + if ((yak < ya0) && (yak< ya1)) lb = k;
  650 + cyv[k] = cyk;
  651 + cg0 = cg1;
  652 + cg1 = cyk;
  653 + }
  654 + lb0 = 0;
  655 + if ((lb > 4) && (imag(z) != 0.0)) {
  656 + while(lb != lb0) {
  657 + ch2 = cone;
  658 + ch1 = czero;
  659 + lb0 = lb;
  660 + for (k=lb;k>=1;k--) {
  661 + ch0 = 2.0*(k+v0)*ch1/z-ch2;
  662 + ch2 = ch1;
  663 + ch1 = ch0;
  664 + }
  665 + cp12 = ch0;
  666 + cp22 = ch2;
  667 + ch2 = czero;
  668 + ch1 = cone;
  669 + for (k=lb;k>=1;k--) {
  670 + ch0 = 2.0*(k+v0)*ch1/z-ch2;
  671 + ch2 = ch1;
  672 + ch1 = ch0;
  673 + }
  674 + cp11 = ch0;
  675 + cp21 = ch2;
  676 + if (lb == n)
  677 + cjv[lb+1] = 2.0*(lb+v0)*cjv[lb]/z-cjv[lb-1];
  678 + if (abs(cjv[0]) > abs(cjv[1])) {
  679 + cyv[lb+1] = (cjv[lb+1]*cyv0-2.0*cp11/(M_PI*z))/cjv[0];
  680 + cyv[lb] = (cjv[lb]*cyv0+2.0*cp12/(M_PI*z))/cjv[0];
  681 + }
  682 + else {
  683 + cyv[lb+1] = (cjv[lb+1]*cyv1-2.0*cp21/(M_PI*z))/cjv[1];
  684 + cyv[lb] = (cjv[lb]*cyv1+2.0*cp22/(M_PI*z))/cjv[1];
  685 + }
  686 + cyl2 = cyv[lb+1];
  687 + cyl1 = cyv[lb];
  688 + for (k=lb-1;k>=0;k--) {
  689 + cylk = 2.0*(k+v0+1.0)*cyl1/z-cyl2;
  690 + cyv[k] = cylk;
  691 + cyl2 = cyl1;
  692 + cyl1 = cylk;
  693 + }
  694 + cyl1 = cyv[lb];
  695 + cyl2 = cyv[lb+1];
  696 + for (k=lb+1;k<n;k++) {
  697 + cylk = 2.0*(k+v0)*cyl2/z-cyl1;
  698 + cyv[k+1] = cylk;
  699 + cyl1 = cyl2;
  700 + cyl2 = cylk;
  701 + }
  702 + for (k=2;k<=n;k++) {
  703 + wa = abs(cyv[k]);
  704 + if (wa < abs(cyv[k-1])) lb = k;
  705 + }
  706 + }
  707 + }
  708 + cyvp[0] = v0*cyv[0]/z-cyv[1];
  709 + for (k=1;k<=n;k++) {
  710 + cyvp[k] = cyv[k-1]-(k+v0)*cyv[k]/z;
  711 + }
  712 + vm = n+v0;
  713 + return 0;
  714 +}
  715 +
  716 +
... ...
cudaKK.h
1   -__device__ double g(double v0, double v1)
2   -{
3   - return (v0 + v1)*log(abs(v0+v1)) + (v0-v1)*log(abs(v0-v1));
4   -}
5   -
6   -__device__ double hfin(double v0, double v1, double dv)
7   -{
8   - double e = 0.001;
9   - double t0 = g(v0+e, v1-dv)/dv;
10   - double t1 = 2*g(v0+e, v1)/dv;
11   - double t2 = g(v0+e, v1+dv)/dv;
12   -
13   - return -1.0/PI * (t0 - t1 + t2);
14   -}
15   -
16   -__global__ void devKramersKronig(double* gpuN, double* gpuK, int numVals, double nuStart, double nuEnd, double nOffset)
17   -{
18   - int i = blockIdx.x * blockDim.x + threadIdx.x;
19   -
20   - if(i >= numVals) return;
21   - double nuDelta = (nuEnd - nuStart)/(numVals - 1);
22   -
23   - double nu = nuStart + i*nuDelta;
24   - double n = 0.0;
25   - double jNu;
26   - double jK;
27   - for(int j=1; j<numVals-1; j++)
28   - {
29   - jNu = nuStart + j*nuDelta;
30   - jK = gpuK[j];
31   - n += hfin(nu, jNu, nuDelta) * jK;
32   - }
33   - gpuN[i] = n + nOffset;
34   -
35   -
36   -}
37   -
38   -void cudaKramersKronig(double* cpuN, double* cpuK, int nVals, double nuStart, double nuEnd, double nOffset)
39   -{
40   - double* gpuK;
41   - HANDLE_ERROR(cudaMalloc(&gpuK, sizeof(double)*nVals));
42   - HANDLE_ERROR(cudaMemcpy(gpuK, cpuK, sizeof(double)*nVals, cudaMemcpyHostToDevice));
43   - double* gpuN;
44   - HANDLE_ERROR(cudaMalloc(&gpuN, sizeof(double)*nVals));
45   -
46   - dim3 block(BLOCK_SIZE*BLOCK_SIZE);
47   - dim3 grid(nVals/block.x + 1);
48   - devKramersKronig<<<grid, block>>>(gpuN, gpuK, nVals, nuStart, nuEnd, nOffset);
49   -
50   - HANDLE_ERROR(cudaMemcpy(cpuN, gpuN, sizeof(double)*nVals, cudaMemcpyDeviceToHost));
51   -
52   - //free resources
53   - HANDLE_ERROR(cudaFree(gpuK));
54   - HANDLE_ERROR(cudaFree(gpuN));
55   -}
56   -
57   -__global__ void devComputeSpectrum(double* I, double2* B, double* alpha, int Nl,
58   - int nSamples, double oThetaI, double oThetaO, double cThetaI, double cThetaO)
59   -{
60   - int i = blockIdx.x * blockDim.x + threadIdx.x;
61   -
62   - //compute the delta-theta value
63   - double dTheta = (oThetaO - oThetaI)/nSamples;
64   -
65   - //allocate space for the Legendre polynomials
66   - double Ptheta[2];
67   -
68   - double cosTheta, theta;
69   - cuDoubleComplex Us;
70   - cuDoubleComplex UsSample;
71   - cuDoubleComplex U;
72   - //cuComplex Ui;
73   - //Ui.x = 2*PI;
74   - //Ui.y = 0.0;
75   - cuDoubleComplex numer;
76   - numer.x = 0.0;
77   - cuDoubleComplex exp_numer;
78   - cuDoubleComplex iL;
79   - cuDoubleComplex imag;
80   - imag.x = 0.0; imag.y = 1.0;
81   - double realFac;
82   - cuDoubleComplex complexFac;
83   - double PlTheta;
84   - double Isum = 0.0;
85   - //float maxVal = 0;
86   - //float val;
87   - for(int iTheta = 0; iTheta < nSamples; iTheta++)
88   - {
89   - //calculate theta
90   - theta = iTheta * dTheta + oThetaI;
91   - cosTheta = cos(theta);
92   -
93   - //initialize the theta Legendre polynomial
94   - Ptheta[0] = 1.0;
95   - Ptheta[1] = cosTheta;
96   -
97   - //initialize the scattered field
98   - Us.x = Us.y = 0.0;
99   - iL.x = 1.0;
100   - iL.y = 0.0;
101   - for(int l = 0; l<Nl; l++)
102   - {
103   - //compute the theta legendre polynomial
104   - if(l == 0)
105   - PlTheta = Ptheta[0];
106   - else if(l == 1)
107   - PlTheta = Ptheta[1];
108   - else
109   - {
110   - PlTheta = ((2*l - 1)*cosTheta*Ptheta[1] - (l - 1)*Ptheta[0])/l;
111   - Ptheta[0] = Ptheta[1];
112   - Ptheta[1] = PlTheta;
113   - }
114   -
115   - //compute the real components of the scattered field
116   - realFac = alpha[l] * PlTheta;
117   -
118   - //compute the complex components of the scattered field
119   - numer.x = 0.0;
120   - numer.y = -(l*PI)/2.0;
121   - exp_numer = cExp(numer);
122   -
123   - complexFac = cMult(B[Nl * i + l], exp_numer);
124   - complexFac = cMult(complexFac, iL);
125   -
126   -
127   - //combine the real and complex components
128   - UsSample = cMult(complexFac, realFac);
129   - Us = cAdd(Us, UsSample);
130   -
131   - //increment the imaginary exponent i^l
132   - iL = cMult(iL, imag);
133   -
134   -
135   - }
136   -
137   - //sum the scattered and incident fields
138   - if(theta >= cThetaI && theta <= cThetaO)
139   - U = cAdd(Us, 2*PI);
140   - else
141   - U = Us;
142   - Isum += (U.x*U.x + U.y*U.y) * sin(theta) * 2 * PI * dTheta;
143   - }
144   -
145   - I[i] = Isum;
146   -}
147   -
148   -void cudaComputeSpectrum(double* cpuI, double* cpuB, double* cpuAlpha,
149   - int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples)
150   -{
151   - //copy everything to the GPU
152   - double2* gpuB;
153   - HANDLE_ERROR(cudaMalloc(&gpuB, sizeof(double2) * nLambda * Nl));
154   - HANDLE_ERROR(cudaMemcpy(gpuB, cpuB, sizeof(double2) * nLambda * Nl, cudaMemcpyHostToDevice));
155   -
156   - double* gpuAlpha;
157   - HANDLE_ERROR(cudaMalloc(&gpuAlpha, sizeof(double) * Nl));
158   - HANDLE_ERROR(cudaMemcpy(gpuAlpha, cpuAlpha, sizeof(double) * Nl, cudaMemcpyHostToDevice));
159   -
160   - double* gpuI;
161   - HANDLE_ERROR(cudaMalloc(&gpuI, sizeof(double) * nLambda));
162   -
163   -
164   - //call the kernel to compute the spectrum
165   - dim3 block(BLOCK_SIZE*BLOCK_SIZE);
166   - dim3 grid(nLambda/block.x + 1);
167   -
168   - //devComputeSpectrum
169   - devComputeSpectrum<<<grid, block>>>(gpuI, (double2*)gpuB, gpuAlpha, Nl,
170   - nSamples, oThetaI, oThetaO, cThetaI, cThetaO);
171   -
172   - HANDLE_ERROR(cudaMemcpy(cpuI, gpuI, sizeof(double) * nLambda, cudaMemcpyDeviceToHost));
173   -
174   - HANDLE_ERROR(cudaFree(gpuB));
175   - HANDLE_ERROR(cudaFree(gpuAlpha));
176   - HANDLE_ERROR(cudaFree(gpuI));
177   -
178   -
179   -
180   -
  1 +__device__ double g(double v0, double v1)
  2 +{
  3 + return (v0 + v1)*log(abs(v0+v1)) + (v0-v1)*log(abs(v0-v1));
  4 +}
  5 +
  6 +__device__ double hfin(double v0, double v1, double dv)
  7 +{
  8 + double e = 0.001;
  9 + double t0 = g(v0+e, v1-dv)/dv;
  10 + double t1 = 2*g(v0+e, v1)/dv;
  11 + double t2 = g(v0+e, v1+dv)/dv;
  12 +
  13 + return -1.0/PI * (t0 - t1 + t2);
  14 +}
  15 +
  16 +__global__ void devKramersKronig(double* gpuN, double* gpuK, int numVals, double nuStart, double nuEnd, double nOffset)
  17 +{
  18 + int i = blockIdx.x * blockDim.x + threadIdx.x;
  19 +
  20 + if(i >= numVals) return;
  21 + double nuDelta = (nuEnd - nuStart)/(numVals - 1);
  22 +
  23 + double nu = nuStart + i*nuDelta;
  24 + double n = 0.0;
  25 + double jNu;
  26 + double jK;
  27 + for(int j=1; j<numVals-1; j++)
  28 + {
  29 + jNu = nuStart + j*nuDelta;
  30 + jK = gpuK[j];
  31 + n += hfin(nu, jNu, nuDelta) * jK;
  32 + }
  33 + gpuN[i] = n + nOffset;
  34 +
  35 +
  36 +}
  37 +
  38 +void cudaKramersKronig(double* cpuN, double* cpuK, int nVals, double nuStart, double nuEnd, double nOffset)
  39 +{
  40 + double* gpuK;
  41 + HANDLE_ERROR(cudaMalloc(&gpuK, sizeof(double)*nVals));
  42 + HANDLE_ERROR(cudaMemcpy(gpuK, cpuK, sizeof(double)*nVals, cudaMemcpyHostToDevice));
  43 + double* gpuN;
  44 + HANDLE_ERROR(cudaMalloc(&gpuN, sizeof(double)*nVals));
  45 +
  46 + dim3 block(BLOCK_SIZE*BLOCK_SIZE);
  47 + dim3 grid(nVals/block.x + 1);
  48 + devKramersKronig<<<grid, block>>>(gpuN, gpuK, nVals, nuStart, nuEnd, nOffset);
  49 +
  50 + HANDLE_ERROR(cudaMemcpy(cpuN, gpuN, sizeof(double)*nVals, cudaMemcpyDeviceToHost));
  51 +
  52 + //free resources
  53 + HANDLE_ERROR(cudaFree(gpuK));
  54 + HANDLE_ERROR(cudaFree(gpuN));
  55 +}
  56 +
  57 +__global__ void devComputeSpectrum(double* I, double2* B, double* alpha, int Nl,
  58 + int nSamples, double oThetaI, double oThetaO, double cThetaI, double cThetaO)
  59 +{
  60 + int i = blockIdx.x * blockDim.x + threadIdx.x;
  61 +
  62 + //compute the delta-theta value
  63 + double dTheta = (oThetaO - oThetaI)/nSamples;
  64 +
  65 + //allocate space for the Legendre polynomials
  66 + double Ptheta[2];
  67 +
  68 + double cosTheta, theta;
  69 + cuDoubleComplex Us;
  70 + cuDoubleComplex UsSample;
  71 + cuDoubleComplex U;
  72 + //cuComplex Ui;
  73 + //Ui.x = 2*PI;
  74 + //Ui.y = 0.0;
  75 + cuDoubleComplex numer;
  76 + numer.x = 0.0;
  77 + cuDoubleComplex exp_numer;
  78 + cuDoubleComplex iL;
  79 + cuDoubleComplex imag;
  80 + imag.x = 0.0; imag.y = 1.0;
  81 + double realFac;
  82 + cuDoubleComplex complexFac;
  83 + double PlTheta;
  84 + double Isum = 0.0;
  85 + //float maxVal = 0;
  86 + //float val;
  87 + for(int iTheta = 0; iTheta < nSamples; iTheta++)
  88 + {
  89 + //calculate theta
  90 + theta = iTheta * dTheta + oThetaI;
  91 + cosTheta = cos(theta);
  92 +
  93 + //initialize the theta Legendre polynomial
  94 + Ptheta[0] = 1.0;
  95 + Ptheta[1] = cosTheta;
  96 +
  97 + //initialize the scattered field
  98 + Us.x = Us.y = 0.0;
  99 + iL.x = 1.0;
  100 + iL.y = 0.0;
  101 + for(int l = 0; l<Nl; l++)
  102 + {
  103 + //compute the theta legendre polynomial
  104 + if(l == 0)
  105 + PlTheta = Ptheta[0];
  106 + else if(l == 1)
  107 + PlTheta = Ptheta[1];
  108 + else
  109 + {
  110 + PlTheta = ((2*l - 1)*cosTheta*Ptheta[1] - (l - 1)*Ptheta[0])/l;
  111 + Ptheta[0] = Ptheta[1];
  112 + Ptheta[1] = PlTheta;
  113 + }
  114 +
  115 + //compute the real components of the scattered field
  116 + realFac = alpha[l] * PlTheta;
  117 +
  118 + //compute the complex components of the scattered field
  119 + numer.x = 0.0;
  120 + numer.y = -(l*PI)/2.0;
  121 + exp_numer = cExp(numer);
  122 +
  123 + complexFac = cMult(B[Nl * i + l], exp_numer);
  124 + complexFac = cMult(complexFac, iL);
  125 +
  126 +
  127 + //combine the real and complex components
  128 + UsSample = cMult(complexFac, realFac);
  129 + Us = cAdd(Us, UsSample);
  130 +
  131 + //increment the imaginary exponent i^l
  132 + iL = cMult(iL, imag);
  133 +
  134 +
  135 + }
  136 +
  137 + //sum the scattered and incident fields
  138 + if(theta >= cThetaI && theta <= cThetaO)
  139 + U = cAdd(Us, 2*PI);
  140 + else
  141 + U = Us;
  142 + Isum += (U.x*U.x + U.y*U.y) * sin(theta) * 2 * PI * dTheta;
  143 + }
  144 +
  145 + I[i] = Isum;
  146 +}
  147 +
  148 +void cudaComputeSpectrum(double* cpuI, double* cpuB, double* cpuAlpha,
  149 + int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples)
  150 +{
  151 + //copy everything to the GPU
  152 + double2* gpuB;
  153 + HANDLE_ERROR(cudaMalloc(&gpuB, sizeof(double2) * nLambda * Nl));
  154 + HANDLE_ERROR(cudaMemcpy(gpuB, cpuB, sizeof(double2) * nLambda * Nl, cudaMemcpyHostToDevice));
  155 +
  156 + double* gpuAlpha;
  157 + HANDLE_ERROR(cudaMalloc(&gpuAlpha, sizeof(double) * Nl));
  158 + HANDLE_ERROR(cudaMemcpy(gpuAlpha, cpuAlpha, sizeof(double) * Nl, cudaMemcpyHostToDevice));
  159 +
  160 + double* gpuI;
  161 + HANDLE_ERROR(cudaMalloc(&gpuI, sizeof(double) * nLambda));
  162 +
  163 +
  164 + //call the kernel to compute the spectrum
  165 + dim3 block(BLOCK_SIZE*BLOCK_SIZE);
  166 + dim3 grid(nLambda/block.x + 1);
  167 +
  168 + //devComputeSpectrum
  169 + devComputeSpectrum<<<grid, block>>>(gpuI, (double2*)gpuB, gpuAlpha, Nl,
  170 + nSamples, oThetaI, oThetaO, cThetaI, cThetaO);
  171 +
  172 + HANDLE_ERROR(cudaMemcpy(cpuI, gpuI, sizeof(double) * nLambda, cudaMemcpyDeviceToHost));
  173 +
  174 + HANDLE_ERROR(cudaFree(gpuB));
  175 + HANDLE_ERROR(cudaFree(gpuAlpha));
  176 + HANDLE_ERROR(cudaFree(gpuI));
  177 +
  178 +
  179 +
  180 +
181 181 }
182 182 \ No newline at end of file
... ...
cudaMain.cu
1   -#include "cuComplex.h"
2   -#include "cudaHandleError.h"
3   -
4   -
5   -#define PI 3.14159
6   -#define BLOCK_SIZE 16
7   -
8   -__device__ cuDoubleComplex cMult(cuDoubleComplex a, cuDoubleComplex b)
9   -{
10   - cuDoubleComplex result;
11   - result.x = a.x * b.x - a.y * b.y;
12   - result.y = a.x * b.y + a.y * b.x;
13   -
14   - return result;
15   -}
16   -
17   -__device__ cuDoubleComplex cMult(cuDoubleComplex a, float b)
18   -{
19   - cuDoubleComplex result;
20   - result.x = a.x * b;
21   - result.y = a.y * b;
22   -
23   - return result;
24   -}
25   -
26   -__device__ cuDoubleComplex cAdd(cuDoubleComplex a, cuDoubleComplex b)
27   -{
28   - cuDoubleComplex r;
29   - r.x = a.x + b.x;
30   - r.y = a.y + b.y;
31   -
32   - return r;
33   -}
34   -
35   -__device__ cuDoubleComplex cAdd(cuDoubleComplex a, float b)
36   -{
37   - cuDoubleComplex r;
38   - r.x = a.x + b;
39   - r.y = a.y;
40   -
41   - return r;
42   -}
43   -
44   -__device__ cuDoubleComplex cExp(cuDoubleComplex a)
45   -{
46   - cuDoubleComplex r;
47   -
48   - r.x = exp(a.x) * cos(a.y);
49   - r.y = exp(a.x) * sin(a.y);
50   -
51   - return r;
52   -}
53   -
54   -__device__ double cMag(cuDoubleComplex a)
55   -{
56   - double r = sqrt(a.x * a.x + a.y * a.y);
57   - return r;
58   -}
59   -
60   -#include "cudaKK.h"
61   -
  1 +#include "cuComplex.h"
  2 +#include "cudaHandleError.h"
  3 +
  4 +
  5 +#define PI 3.14159
  6 +#define BLOCK_SIZE 16
  7 +
  8 +__device__ cuDoubleComplex cMult(cuDoubleComplex a, cuDoubleComplex b)
  9 +{
  10 + cuDoubleComplex result;
  11 + result.x = a.x * b.x - a.y * b.y;
  12 + result.y = a.x * b.y + a.y * b.x;
  13 +
  14 + return result;
  15 +}
  16 +
  17 +__device__ cuDoubleComplex cMult(cuDoubleComplex a, float b)
  18 +{
  19 + cuDoubleComplex result;
  20 + result.x = a.x * b;
  21 + result.y = a.y * b;
  22 +
  23 + return result;
  24 +}
  25 +
  26 +__device__ cuDoubleComplex cAdd(cuDoubleComplex a, cuDoubleComplex b)
  27 +{
  28 + cuDoubleComplex r;
  29 + r.x = a.x + b.x;
  30 + r.y = a.y + b.y;
  31 +
  32 + return r;
  33 +}
  34 +
  35 +__device__ cuDoubleComplex cAdd(cuDoubleComplex a, float b)
  36 +{
  37 + cuDoubleComplex r;
  38 + r.x = a.x + b;
  39 + r.y = a.y;
  40 +
  41 + return r;
  42 +}
  43 +
  44 +__device__ cuDoubleComplex cExp(cuDoubleComplex a)
  45 +{
  46 + cuDoubleComplex r;
  47 +
  48 + r.x = exp(a.x) * cos(a.y);
  49 + r.y = exp(a.x) * sin(a.y);
  50 +
  51 + return r;
  52 +}
  53 +
  54 +__device__ double cMag(cuDoubleComplex a)
  55 +{
  56 + double r = sqrt(a.x * a.x + a.y * a.y);
  57 + return r;
  58 +}
  59 +
  60 +#include "cudaKK.h"
  61 +
... ...
eta_TolueneK.txt
1   -800 0.00237097091817457
2   -802 0.00227949941219620
3   -804 0.00221816388191892
4   -806 0.00217471041775780
5   -808 0.00215481795727275
6   -810 0.00213388387011066
7   -812 0.00209363211698535
8   -814 0.00202082763908315
9   -816 0.00193585066178408
10   -818 0.00188250850160370
11   -820 0.00184538369212481
12   -822 0.00183536653704965
13   -824 0.00185974183080381
14   -826 0.00190647188683237
15   -828 0.00199326404385590
16   -830 0.00213499888469032
17   -832 0.00233225842027966
18   -834 0.00257593995310952
19   -836 0.00287502014227382
20   -838 0.00318754088914534
21   -840 0.00349170996961850
22   -842 0.00366108155160527
23   -844 0.00362683356184450
24   -846 0.00340059748640139
25   -848 0.00305608088262669
26   -850 0.00270129337895778
27   -852 0.00239675724637807
28   -854 0.00217864428240924
29   -856 0.00203021645685105
30   -858 0.00193686140678899
31   -860 0.00187749764181973
32   -862 0.00185772044069943
33   -864 0.00188910883086452
34   -866 0.00195093483930895
35   -868 0.00204692017755064
36   -870 0.00215522059478817
37   -872 0.00226016367314688
38   -874 0.00224604514385606
39   -876 0.00210230179408609
40   -878 0.00199743674523776
41   -880 0.00199218269491360
42   -882 0.00208480862951801
43   -884 0.00228270137034088
44   -886 0.00262030644370857
45   -888 0.00319352984551477
46   -890 0.00421972378192706
47   -892 0.00602385856914103
48   -894 0.00840405009274333
49   -896 0.00900675480510885
50   -898 0.00696613165618276
51   -900 0.00499554830114596
52   -902 0.00383849939561442
53   -904 0.00320523678732641
54   -906 0.00285555041538049
55   -908 0.00266476454212409
56   -910 0.00254627716354120
57   -912 0.00245341529587653
58   -914 0.00236459307673934
59   -916 0.00229282344387905
60   -918 0.00223035979386559
61   -920 0.00221227947671869
62   -922 0.00224238729804433
63   -924 0.00235007654381494
64   -926 0.00256726325953723
65   -928 0.00284644035247116
66   -930 0.00294228033320561
67   -932 0.00275916688965430
68   -934 0.00258731026217053
69   -936 0.00255719587176405
70   -938 0.00262153336828821
71   -940 0.00273896371051358
72   -942 0.00287538936255749
73   -944 0.00299732885131251
74   -946 0.00309698674175826
75   -948 0.00316605202547143
76   -950 0.00320470876397792
77   -952 0.00323491311445059
78   -954 0.00329692599734166
79   -956 0.00338582912769461
80   -958 0.00350331602393855
81   -960 0.00365994789379712
82   -962 0.00382797968742639
83   -964 0.00395048819829240
84   -966 0.00399909330987952
85   -968 0.00397747867047571
86   -970 0.00393338530466517
87   -972 0.00391527408455760
88   -974 0.00393711464406835
89   -976 0.00402058186620085
90   -978 0.00414801626311813
91   -980 0.00426028437517640
92   -982 0.00424343298749414
93   -984 0.00411994903649494
94   -986 0.00399867235513141
95   -988 0.00388651104937391
96   -990 0.00379950457370988
97   -992 0.00373977952014182
98   -994 0.00373881240280082
99   -996 0.00379956481032446
100   -998 0.00393643103780800
101   -1000 0.00418426742600855
102   -1002 0.00448366832068703
103   -1004 0.00421395149528264
104   -1006 0.00400806256602511
105   -1008 0.00395963930728052
106   -1010 0.00399586579501438
107   -1012 0.00412453345420230
108   -1014 0.00435650139468447
109   -1016 0.00470823294497344
110   -1018 0.00525652222711324
111   -1020 0.00620034607293144
112   -1022 0.00761074657742514
113   -1024 0.00904862587038915
114   -1026 0.0128420613454482
115   -1028 0.0232054647758307
116   -1030 0.0401070318402723
117   -1032 0.0237662509507289
118   -1034 0.0150900768702586
119   -1036 0.0136209302389719
120   -1038 0.0140722804433677
121   -1040 0.0148520038780156
122   -1042 0.0150418759020717
123   -1044 0.0142741299011939
124   -1046 0.0127983598294137
125   -1048 0.0111020250322553
126   -1050 0.00953886802849649
127   -1052 0.00823573530792714
128   -1054 0.00722015941851439
129   -1056 0.00647199198407014
130   -1058 0.00595450625097980
131   -1060 0.00562081994003704
132   -1062 0.00547155564647798
133   -1064 0.00551163119086301
134   -1066 0.00577378575211103
135   -1068 0.00633217061275026
136   -1070 0.00731526451760166
137   -1072 0.00888941764012196
138   -1074 0.0111936669094970
139   -1076 0.0145627178352916
140   -1078 0.0198820542781815
141   -1080 0.0272101442099741
142   -1082 0.0294763996691438
143   -1084 0.0207090896497001
144   -1086 0.0127655286195192
145   -1088 0.00854004269533275
146   -1090 0.00635526613490286
147   -1092 0.00518140755178082
148   -1094 0.00455405026737381
149   -1096 0.00426268956025233
150   -1098 0.00423510235887238
151   -1100 0.00446505970250814
152   -1102 0.00496653746864136
153   -1104 0.00580707926483870
154   -1106 0.00666740083564581
155   -1108 0.00624732665593806
156   -1110 0.00479908163793379
157   -1112 0.00361121925654796
158   -1114 0.00287942570706319
159   -1116 0.00246148742161380
160   -1118 0.00222778888171568
161   -1120 0.00209650525411750
162   -1122 0.00202121838132918
163   -1124 0.00199323955812561
164   -1126 0.00200797851417853
165   -1128 0.00204812470413808
166   -1130 0.00209417368698948
167   -1132 0.00209849682757402
168   -1134 0.00210954008712956
169   -1136 0.00214927272221614
170   -1138 0.00221781253558492
171   -1140 0.00231654284254776
172   -1142 0.00241700276584513
173   -1144 0.00252090482583751
174   -1146 0.00265926205183231
175   -1148 0.00286652526484237
176   -1150 0.00313647720191737
177   -1152 0.00347416081610501
178   -1154 0.00387661923259805
179   -1156 0.00410043342018308
180   -1158 0.00394886198110498
181   -1160 0.00373148843650175
182   -1162 0.00350494607394550
183   -1164 0.00334022215869222
184   -1166 0.00324053812759405
185   -1168 0.00323728249115084
186   -1170 0.00337030363472976
187   -1172 0.00370331752537631
188   -1174 0.00446861428672600
189   -1176 0.00627098368325835
190   -1178 0.00931078620410600
191   -1180 0.00795027706068620
192   -1182 0.00505648215885331
193   -1184 0.00377716421438011
194   -1186 0.00319136495849046
195   -1188 0.00290137589052677
196   -1190 0.00275791558623964
197   -1192 0.00269226681474014
198   -1194 0.00266088014296474
199   -1196 0.00258817828799466
200   -1198 0.00241700923017517
201   -1200 0.00221558969693162
202   -1202 0.00211217407863773
203   -1204 0.00220182940076526
204   -1206 0.00261294695511882
205   -1208 0.00347974535374746
206   -1210 0.00437930056728570
207   -1212 0.00342648851242818
208   -1214 0.00227260060290268
209   -1216 0.00178258728885112
210   -1218 0.00154392622881232
211   -1220 0.00139698451678244
212   -1222 0.00129280677379398
213   -1224 0.00121946854787068
214   -1226 0.00117184455170345
215   -1228 0.00113722984861070
216   -1230 0.00111912311009601
217   -1232 0.00111390956612134
218   -1234 0.00112443805885795
219   -1236 0.00115660063219376
220   -1238 0.00121045559427169
221   -1240 0.00129274578774778
222   -1242 0.00140396276384137
223   -1244 0.00154410614148823
224   -1246 0.00169860381220359
225   -1248 0.00180840115780576
226   -1250 0.00177688982988028
227   -1252 0.00157601125295148
228   -1254 0.00138106340282942
229   -1256 0.00125620905206826
230   -1258 0.00118717226425611
231   -1260 0.00114496451549449
232   -1262 0.00111429933337465
233   -1264 0.00109740533980092
234   -1266 0.00108967549075875
235   -1268 0.00109315730663637
236   -1270 0.00110701272913057
237   -1272 0.00112547293050748
238   -1274 0.00114417070376777
239   -1276 0.00115549769406343
240   -1278 0.00115861723477586
241   -1280 0.00114576824540165
242   -1282 0.00112307423917382
243   -1284 0.00110803299150391
244   -1286 0.00109790695605719
245   -1288 0.00109710433202375
246   -1290 0.00110698710171340
247   -1292 0.00113245942678089
248   -1294 0.00117552067320688
249   -1296 0.00124267198974583
250   -1298 0.00132277561158489
251   -1300 0.00139217958266282
252   -1302 0.00142973694885209
253   -1304 0.00144188181676038
254   -1306 0.00147541483276765
255   -1308 0.00159956692209740
256   -1310 0.00186843894759088
257   -1312 0.00216486082449073
258   -1314 0.00211728875491887
259   -1316 0.00187507564071290
260   -1318 0.00171677440706927
261   -1320 0.00164837511625716
262   -1322 0.00163899782669962
263   -1324 0.00166410609076352
264   -1326 0.00171764577889364
265   -1328 0.00180479473401823
266   -1330 0.00194274885535529
267   -1332 0.00206022538770732
268   -1334 0.00196217286057273
269   -1336 0.00188492778401013
270   -1338 0.00187122231048589
271   -1340 0.00188921428962955
272   -1342 0.00193700700412885
273   -1344 0.00200313353323991
274   -1346 0.00208778115174581
275   -1348 0.00218066174704292
276   -1350 0.00226588109762249
277   -1352 0.00236276913468593
278   -1354 0.00248915903884931
279   -1356 0.00265547420500685
280   -1358 0.00284820286383517
281   -1360 0.00303211548157874
282   -1362 0.00319538643027851
283   -1364 0.00338011260813816
284   -1366 0.00363996415682390
285   -1368 0.00400265764738686
286   -1370 0.00448976968523854
287   -1372 0.00525773678870123
288   -1374 0.00662029687278425
289   -1376 0.00908376119233617
290   -1378 0.0123031513241818
291   -1380 0.0121671979448086
292   -1382 0.00940007546463800
293   -1384 0.00754318150864360
294   -1386 0.00640356392721685
295   -1388 0.00563257119321882
296   -1390 0.00511010869784208
297   -1392 0.00475789415695825
298   -1394 0.00452833517370964
299   -1396 0.00440186171426137
300   -1398 0.00433687786700866
301   -1400 0.00432317844214779
302   -1402 0.00436175400856741
303   -1404 0.00444654158141412
304   -1406 0.00458045165701961
305   -1408 0.00472070193080689
306   -1410 0.00484730108752061
307   -1412 0.00499169569971829
308   -1414 0.00517526500052341
309   -1416 0.00540856165680758
310   -1418 0.00569301961826355
311   -1420 0.00603609386579061
312   -1422 0.00639815529754280
313   -1424 0.00676704333943306
314   -1426 0.00709702523848474
315   -1428 0.00735286473751553
316   -1430 0.00758946104003622
317   -1432 0.00786781701959305
318   -1434 0.00830202970708910
319   -1436 0.00898232020613486
320   -1438 0.0100197835148382
321   -1440 0.0115095063570045
322   -1442 0.0133985990853930
323   -1444 0.0153768866835411
324   -1446 0.0171765347348967
325   -1448 0.0189361099169456
326   -1450 0.0208245294344141
327   -1452 0.0228039247538198
328   -1454 0.0246810508004892
329   -1456 0.0262618411626106
330   -1458 0.0273608063623162
331   -1460 0.0277930934742346
332   -1462 0.0274706237226478
333   -1464 0.0264211185824187
334   -1466 0.0247980788620200
335   -1468 0.0228296555480849
336   -1470 0.0207834609064780
337   -1472 0.0188724652439656
338   -1474 0.0171801988754876
339   -1476 0.0157920753997752
340   -1478 0.0147283011159520
341   -1480 0.0140030494767984
342   -1482 0.0137569248084170
343   -1484 0.0141879797029108
344   -1486 0.0159226244331294
345   -1488 0.0201940578220826
346   -1490 0.0260836787125339
347   -1492 0.0401202763896059
348   -1494 0.0761786772950870
349   -1496 0.108223079178941
350   -1498 0.0527249260725011
351   -1500 0.0271635520581988
352   -1502 0.0173322191403291
353   -1504 0.0124889207648925
354   -1506 0.00992131298532918
355   -1508 0.00839752655521901
356   -1510 0.00745176347821015
357   -1512 0.00688020881374870
358   -1514 0.00648533490268327
359   -1516 0.00628100243994201
360   -1518 0.00629379543847072
361   -1520 0.00670033315002658
362   -1522 0.00786453088070098
363   -1524 0.00861000109877936
364   -1526 0.00697026673858113
365   -1528 0.00565227380276001
366   -1530 0.00510003019871344
367   -1532 0.00487330093915990
368   -1534 0.00477643425469498
369   -1536 0.00467177280329912
370   -1538 0.00449022432901730
371   -1540 0.00423934685882746
372   -1542 0.00393426018189818
373   -1544 0.00365660104528498
374   -1546 0.00348923385240243
375   -1548 0.00342710802865492
376   -1550 0.00346898664460405
377   -1552 0.00338295466527580
378   -1554 0.00321378452613121
379   -1556 0.00313430635529189
380   -1558 0.00316907431392649
381   -1560 0.00330481737182376
382   -1562 0.00356172011440931
383   -1564 0.00388898354936485
384   -1566 0.00429638887941885
385   -1568 0.00472113284868973
386   -1570 0.00504929184964361
387   -1572 0.00519286093716334
388   -1574 0.00509202242388202
389   -1576 0.00481769783190026
390   -1578 0.00455543799934706
391   -1580 0.00435935962171553
392   -1582 0.00433990247775519
393   -1584 0.00460726311748136
394   -1586 0.00492003737038605
395   -1588 0.00490704034351103
396   -1590 0.00492753522146188
397   -1592 0.00518588888004375
398   -1594 0.00592543183304241
399   -1596 0.00720757954725413
400   -1598 0.00912890526935344
401   -1600 0.0130293680056744
402   -1602 0.0206809953186127
403   -1604 0.0299953585748135
404   -1606 0.0248157340286292
405   -1608 0.0127358449020555
406   -1610 0.00746783575970784
407   -1612 0.00537209761858949
408   -1614 0.00445129559785390
409   -1616 0.00405329276394375
410   -1618 0.00399146289131384
411   -1620 0.00409659649670941
412   -1622 0.00425086095548363
413   -1624 0.00425306230534309
414   -1626 0.00388013491422351
415   -1628 0.00322765310314340
416   -1630 0.00259805094537761
417   -1632 0.00208657181154715
418   -1634 0.00169843933990688
419   -1636 0.00141785441008406
420   -1638 0.00123234974672297
421   -1640 0.00109764310439106
422   -1642 0.000997096490971439
423   -1644 0.000923943814992787
424   -1646 0.000867694719207358
425   -1648 0.000857989573211860
426   -1650 0.000876925837508371
427   -1652 0.000900483600662835
428   -1654 0.000924599031590994
429   -1656 0.000943402878947833
430   -1658 0.000957189946759812
431   -1660 0.000919301596934912
432   -1662 0.000829980699381760
433   -1664 0.000741920416434289
434   -1666 0.000684454640853614
435   -1668 0.000660487010052916
436   -1670 0.000677329699540855
437   -1672 0.000733663772686657
438   -1674 0.000829672252398670
439   -1676 0.000923202402787059
440   -1678 0.000900896424649981
441   -1680 0.000787132461270056
442   -1682 0.000676995955481515
443   -1684 0.000611701232515841
444   -1686 0.000595044263899243
445   -1688 0.000601913444772076
446   -1690 0.000631185451917075
447   -1692 0.000675093910401457
448   -1694 0.000731422393886708
449   -1696 0.000808376337564176
450   -1698 0.000794279618925047
451   -1700 0.000709354504802398
452   -1702 0.000657251178127169
453   -1704 0.000631084077034609
454   -1706 0.000620630016846374
455   -1708 0.000614804872029308
456   -1710 0.000610379344278778
457   -1712 0.000608365704329393
458   -1714 0.000610177708447017
459   -1716 0.000628060629349526
460   -1718 0.000671390695691186
461   -1720 0.000748670745348075
462   -1722 0.000874314265691752
463   -1724 0.00104123844277088
464   -1726 0.00123749183518020
465   -1728 0.00147184752955714
466   -1730 0.00173223404858593
467   -1732 0.00197582318555127
468   -1734 0.00215543372945357
469   -1736 0.00220452603076912
470   -1738 0.00209119301342784
471   -1740 0.00185700091397871
472   -1742 0.00156445999707629
473   -1744 0.00127824303920924
474   -1746 0.00103830550711541
475   -1748 0.000858082809524967
476   -1750 0.000736720622233361
477   -1752 0.000665836151632355
478   -1754 0.000633014507978860
479   -1756 0.000636204186868655
480   -1758 0.000664560791933513
481   -1760 0.000700854142871225
482   -1762 0.000738249770728404
483   -1764 0.000779473476320026
484   -1766 0.000831332837575542
485   -1768 0.000887483745995595
486   -1770 0.000943100942235622
487   -1772 0.00100855983483948
488   -1774 0.00108815587341361
489   -1776 0.00117336763806935
490   -1778 0.00122720647155439
491   -1780 0.00120867298099444
492   -1782 0.00117346527655232
493   -1784 0.00119371865588136
494   -1786 0.00128533671400934
495   -1788 0.00142590894789679
496   -1790 0.00158054902116715
497   -1792 0.00179850758319075
498   -1794 0.00213331852757031
499   -1796 0.00258371206804431
500   -1798 0.00310651819625664
501   -1800 0.00358456135015573
502   -1802 0.00384535056234718
503   -1804 0.00377208677963125
504   -1806 0.00340950704775298
505   -1808 0.00292589878928829
506   -1810 0.00246230467854199
507   -1812 0.00209503276430901
508   -1814 0.00185262669472132
509   -1816 0.00171702079169156
510   -1818 0.00163886439352206
511   -1820 0.00157730777183400
512   -1822 0.00149679229624579
513   -1824 0.00138863730310920
514   -1826 0.00127743508882463
515   -1828 0.00118456389012839
516   -1830 0.00112905353317808
517   -1832 0.00108606377735617
518   -1834 0.00103086061641581
519   -1836 0.000984959950309749
520   -1838 0.000979289058512249
521   -1840 0.00102288594610930
522   -1842 0.00112067935890798
523   -1844 0.00128394592127716
524   -1846 0.00152723861251123
525   -1848 0.00188826636609761
526   -1850 0.00239227576491655
527   -1852 0.00300971905084921
528   -1854 0.00364059420885185
529   -1856 0.00414527688649222
530   -1858 0.00428418417776257
531   -1860 0.00397341781363892
532   -1862 0.00343437915842565
533   -1864 0.00294698351848267
534   -1866 0.00265685216170442
535   -1868 0.00257554798807387
536   -1870 0.00262362192114651
537   -1872 0.00267320615475132
538   -1874 0.00259670566832300
539   -1876 0.00235341832549094
540   -1878 0.00201352392982882
541   -1880 0.00167162491751218
542   -1882 0.00138756730843950
543   -1884 0.00117032979189392
544   -1886 0.00101120581308014
545   -1888 0.000892343360827370
546   -1890 0.000799797724248844
547   -1892 0.000722584304592367
548   -1894 0.000668205830350704
549   -1896 0.000645563701038960
550   -1898 0.000645767881929762
551   -1900 0.000633984361915526
552   -1902 0.000588098076669510
553   -1904 0.000535948959936282
554   -1906 0.000500979831672727
555   -1908 0.000480503614669823
556   -1910 0.000475812984522745
557   -1912 0.000486823903968232
558   -1914 0.000515195500000000
559   -1916 0.000562568109473544
560   -1918 0.000630427523781356
561   -1920 0.000723610116430462
562   -1922 0.000847642176098185
563   -1924 0.000992789644339751
564   -1926 0.00114429259972093
565   -1928 0.00131728542788928
566   -1930 0.00155893716312052
567   -1932 0.00190373075161683
568   -1934 0.00237556565013185
569   -1936 0.00298040121387223
570   -1938 0.00364293200808332
571   -1940 0.00416589638649938
572   -1942 0.00433944387091247
573   -1944 0.00420413532397440
574   -1946 0.00380161374653215
575   -1948 0.00327719918178656
576   -1950 0.00282576366330091
577   -1952 0.00253348765310892
578   -1954 0.00239437526824859
579   -1956 0.00234603768444204
580   -1958 0.00232574864667046
581   -1960 0.00220039532483667
582   -1962 0.00199445232375287
583   -1964 0.00170495488495039
584   -1966 0.00137875775323702
585   -1968 0.00109690552229723
586   -1970 0.000878128994624433
587   -1972 0.000721601368959039
588   -1974 0.000617419916987627
589   -1976 0.000562113218832075
590   -1978 0.000551026292591773
591   -1980 0.000575711660935202
592   -1982 0.000615370850112472
593   -1984 0.000626638864213787
594   -1986 0.000619344762051612
595   -1988 0.000644972987040071
596   -1990 0.000691941782910493
597   -1992 0.000694254646432683
598   -1994 0.000622443290799324
599   -1996 0.000495200120138662
600   -1998 0.000402620427801543
601   -2000 0.000357520428000267
602   -2002 0.000340715817783006
603   -2004 0.000340725563484929
604   -2006 0.000349587604938024
605   -2008 0.000357889528657337
606   -2010 0.000352782837535485
607   -2012 0.000327904929253038
608   -2014 0.000298699882098499
609   -2016 0.000271842376811093
610   -2018 0.000242333037716520
611   -2020 0.000218337240170542
612   -2022 0.000199194821720737
613   -2024 0.000183911806628813
614   -2026 0.000171888258235563
615   -2028 0.000164785282634461
616   -2030 0.000164391739593814
617   -2032 0.000169011600820695
618   -2034 0.000154127618321273
619   -2036 0.000133850562902313
620   -2038 0.000121768011512588
621   -2040 0.000114542173977814
622   -2042 0.000109960714942027
623   -2044 0.000107324747708015
624   -2046 0.000105319938271901
625   -2048 0.000104400109927128
626   -2050 0.000104560803595480
627   -2052 0.000105682984195988
628   -2054 0.000107138188290709
629   -2056 0.000109850938702712
630   -2058 0.000113964387835913
631   -2060 0.000119159665067584
632   -2062 0.000125394011284327
633   -2064 0.000135383120416356
634   -2066 0.000150829077064515
635   -2068 0.000163896208951784
636   -2070 0.000158538657020860
637   -2072 0.000143857048326539
638   -2074 0.000133838990991728
639   -2076 0.000126082674541763
640   -2078 0.000119111322229434
641   -2080 0.000113978504701401
642   -2082 0.000110907574969952
643   -2084 0.000108574694668308
644   -2086 0.000105750311657561
645   -2088 0.000102757884920459
646   -2090 0.000100315348970678
647   -2092 9.88998809699028e-05
648   -2094 9.84636051990861e-05
649   -2096 9.86736776470892e-05
650   -2098 9.86832304001427e-05
651   -2100 9.94847029581411e-05
652   -2102 0.000102501492433386
653   -2104 0.000108578252528750
654   -2106 0.000117598982731806
655   -2108 0.000128810423312497
656   -2110 0.000138078130156183
657   -2112 0.000139894738408702
658   -2114 0.000140372347283306
659   -2116 0.000147183990385426
660   -2118 0.000142580842940779
661   -2120 0.000126124302551768
662   -2122 0.000119111147897455
663   -2124 0.000117761941379516
664   -2126 0.000110386213471180
665   -2128 0.000100586367430428
666   -2130 9.65127771567695e-05
667   -2132 9.71593180254151e-05
668   -2134 0.000100588542105452
669   -2136 0.000104481772978239
670   -2138 0.000107041125533866
671   -2140 0.000108872498221666
672   -2142 0.000111489568147590
673   -2144 0.000115451529322482
674   -2146 0.000120558240114413
675   -2148 0.000126537781071288
676   -2150 0.000134733619506300
677   -2152 0.000148643632029954
678   -2154 0.000172040859828778
679   -2156 0.000210048660817435
680   -2158 0.000268125741557685
681   -2160 0.000351069215958102
682   -2162 0.000450344598032358
683   -2164 0.000489938528699291
684   -2166 0.000409492796412179
685   -2168 0.000304387639702614
686   -2170 0.000235891130206754
687   -2172 0.000200519075056806
688   -2174 0.000185710828669175
689   -2176 0.000182424899321747
690   -2178 0.000187448554282292
691   -2180 0.000203021437757415
692   -2182 0.000231533383222207
693   -2184 0.000266979354976650
694   -2186 0.000274670338797065
695   -2188 0.000249531305296574
696   -2190 0.000224075465024111
697   -2192 0.000200276630934979
698   -2194 0.000177273244376758
699   -2196 0.000160285923199765
700   -2198 0.000150581068702164
701   -2200 0.000148630566016007
702   -2202 0.000159418644068291
703   -2204 0.000190928483551684
704   -2206 0.000246685640401459
705   -2208 0.000270254541506430
706   -2210 0.000222823187679136
707   -2212 0.000183299674920404
708   -2214 0.000159208446689860
709   -2216 0.000141367831176120
710   -2218 0.000133886240444937
711   -2220 0.000133377867922854
712   -2222 0.000136687110101880
713   -2224 0.000141595068371183
714   -2226 0.000145519316291541
715   -2228 0.000148458736825531
716   -2230 0.000153316938474443
717   -2232 0.000163253960273079
718   -2234 0.000178923069609914
719   -2236 0.000194257120755014
720   -2238 0.000196450490452201
721   -2240 0.000188281502894665
722   -2242 0.000182547056123856
723   -2244 0.000184193400303698
724   -2246 0.000192794200162931
725   -2248 0.000207468879582850
726   -2250 0.000228635659533982
727   -2252 0.000256821954754517
728   -2254 0.000293238050530334
729   -2256 0.000339843587945316
730   -2258 0.000394697192716897
731   -2260 0.000433841600455809
732   -2262 0.000418808222045475
733   -2264 0.000365652480977041
734   -2266 0.000317992842743265
735   -2268 0.000289251978678528
736   -2270 0.000276323460348606
737   -2272 0.000276007776761593
738   -2274 0.000285194711508216
739   -2276 0.000305840459677383
740   -2278 0.000341614672459952
741   -2280 0.000378323694871339
742   -2282 0.000375183465200990
743   -2284 0.000372499291886178
744   -2286 0.000379130457959152
745   -2288 0.000369071052928138
746   -2290 0.000344203099796142
747   -2292 0.000313724278864159
748   -2294 0.000283180068926335
749   -2296 0.000260398235921227
750   -2298 0.000248364444837745
751   -2300 0.000246962256014277
752   -2302 0.000257337196851115
753   -2304 0.000282117167464228
754   -2306 0.000327011660272884
755   -2308 0.000402901410624785
756   -2310 0.000515678907419335
757   -2312 0.000613221545587734
758   -2314 0.000587317319167494
759   -2316 0.000479703817387008
760   -2318 0.000387543339108333
761   -2320 0.000331935579008350
762   -2322 0.000305882244139694
763   -2324 0.000301743073919341
764   -2326 0.000318021837096887
765   -2328 0.000360763254301904
766   -2330 0.000442864766710211
767   -2332 0.000580146273004247
768   -2334 0.000746878008138738
769   -2336 0.000778905767997363
770   -2338 0.000655878707879373
771   -2340 0.000549860316308082
772   -2342 0.000474310426764780
773   -2344 0.000414796574428013
774   -2346 0.000384139069758195
775   -2348 0.000382158356339707
776   -2350 0.000402158338733409
777   -2352 0.000435516153586227
778   -2354 0.000472182760873504
779   -2356 0.000515961034751272
780   -2358 0.000592576004516974
781   -2360 0.000693206523120231
782   -2362 0.000643638218785556
783   -2364 0.000478341631402279
784   -2366 0.000369914098808752
785   -2368 0.000314093467617302
786   -2370 0.000287309303030045
787   -2372 0.000274524402561852
788   -2374 0.000270061869985669
789   -2376 0.000271829601590763
790   -2378 0.000279194809335497
791   -2380 0.000294905061876556
792   -2382 0.000319347534507768
793   -2384 0.000350241467027989
794   -2386 0.000391786089197638
795   -2388 0.000432288381112108
796   -2390 0.000431894838874137
797   -2392 0.000400306861211915
798   -2394 0.000373780803138032
799   -2396 0.000355410966982535
800   -2398 0.000347151739593354
801   -2400 0.000350924151462325
802   -2402 0.000365706536144189
803   -2404 0.000389705426960732
804   -2406 0.000421334803876133
805   -2408 0.000459934423654906
806   -2410 0.000500616815279102
807   -2412 0.000525702627325844
808   -2414 0.000513223543953278
809   -2416 0.000478247500654749
810   -2418 0.000439595749420076
811   -2420 0.000399407179067621
812   -2422 0.000365631853681067
813   -2424 0.000342099304419797
814   -2426 0.000327643185447820
815   -2428 0.000319852482413628
816   -2430 0.000318090248146717
817   -2432 0.000318226888962093
818   -2434 0.000307017564256603
819   -2436 0.000284561022911212
820   -2438 0.000265983112770141
821   -2440 0.000252937611403322
822   -2442 0.000242679401171322
823   -2444 0.000236093051616947
824   -2446 0.000233130690914760
825   -2448 0.000233167378896135
826   -2450 0.000235415965609999
827   -2452 0.000239364304311204
828   -2454 0.000244209499641596
829   -2456 0.000248579466181052
830   -2458 0.000251144773278908
831   -2460 0.000252431049719579
832   -2462 0.000253691712617762
833   -2464 0.000255788005476147
834   -2466 0.000256434321853842
835   -2468 0.000251072591655402
836   -2470 0.000241597521259849
837   -2472 0.000234162117014666
838   -2474 0.000229676856991507
839   -2476 0.000227592143774873
840   -2478 0.000226834091088810
841   -2480 0.000227168703547583
842   -2482 0.000228588584217583
843   -2484 0.000231746296813716
844   -2486 0.000236823965966075
845   -2488 0.000241600139160114
846   -2490 0.000244394482975018
847   -2492 0.000244248137929474
848   -2494 0.000245127828260994
849   -2496 0.000251434891521320
850   -2498 0.000247993851620619
851   -2500 0.000232735996433491
852   -2502 0.000222497793867323
853   -2504 0.000221589422451279
854   -2506 0.000232579945681551
855   -2508 0.000250427153657126
856   -2510 0.000252498000507853
857   -2512 0.000232189718802120
858   -2514 0.000211050185590214
859   -2516 0.000198391157226399
860   -2518 0.000193635707688150
861   -2520 0.000193341820452081
862   -2522 0.000193371593068733
863   -2524 0.000189643081211288
864   -2526 0.000181794690676754
865   -2528 0.000178838464388285
866   -2530 0.000183501803348288
867   -2532 0.000194837096053966
868   -2534 0.000211327514566071
869   -2536 0.000231393834808824
870   -2538 0.000255837394665623
871   -2540 0.000275709996672117
872   -2542 0.000266055047783776
873   -2544 0.000243859757637041
874   -2546 0.000235285437161138
875   -2548 0.000236304976186297
876   -2550 0.000232544359689715
877   -2552 0.000218806075082454
878   -2554 0.000204743746363893
879   -2556 0.000196655427865349
880   -2558 0.000191976123078746
881   -2560 0.000186392842736032
882   -2562 0.000182465243677096
883   -2564 0.000182341770175991
884   -2566 0.000186622668096877
885   -2568 0.000194771585308041
886   -2570 0.000207509200230819
887   -2572 0.000227536779149540
888   -2574 0.000256126025913237
889   -2576 0.000293783533966409
890   -2578 0.000344606705405512
891   -2580 0.000421000900491490
892   -2582 0.000539940417278290
893   -2584 0.000691325137774485
894   -2586 0.000768064347900480
895   -2588 0.000684349300000000
896   -2590 0.000536495643153772
897   -2592 0.000418107936641488
898   -2594 0.000348162932430616
899   -2596 0.000316562063243598
900   -2598 0.000311605992448936
901   -2600 0.000329718943031756
902   -2602 0.000370011429187919
903   -2604 0.000412184734144213
904   -2606 0.000402481978671523
905   -2608 0.000368470211663778
906   -2610 0.000353398410510846
907   -2612 0.000328281593188018
908   -2614 0.000295400882956194
909   -2616 0.000275902521470556
910   -2618 0.000268299167514448
911   -2620 0.000267511791747167
912   -2622 0.000270974116559811
913   -2624 0.000277238419508473
914   -2626 0.000286763887252883
915   -2628 0.000300107477286003
916   -2630 0.000316524811935304
917   -2632 0.000327263381122722
918   -2634 0.000305877054698251
919   -2636 0.000269148133708810
920   -2638 0.000248172907618610
921   -2640 0.000239823700606054
922   -2642 0.000238746030638882
923   -2644 0.000239868631298371
924   -2646 0.000237697572301885
925   -2648 0.000231658620506580
926   -2650 0.000224559727594560
927   -2652 0.000220154792342943
928   -2654 0.000220025182909045
929   -2656 0.000220821585838385
930   -2658 0.000219097069889182
931   -2660 0.000213668868513552
932   -2662 0.000206551642880241
933   -2664 0.000200132874030954
934   -2666 0.000198263371264169
935   -2668 0.000204157476079366
936   -2670 0.000219581959345431
937   -2672 0.000228529275997830
938   -2674 0.000212671171569940
939   -2676 0.000198554340066309
940   -2678 0.000193733620852842
941   -2680 0.000194427317307389
942   -2682 0.000197546011671515
943   -2684 0.000200581527813713
944   -2686 0.000203985348880727
945   -2688 0.000208935024070450
946   -2690 0.000213885837983080
947   -2692 0.000215780646355564
948   -2694 0.000215167439140776
949   -2696 0.000214895725221701
950   -2698 0.000217360387387823
951   -2700 0.000222623944199778
952   -2702 0.000229950531867105
953   -2704 0.000237779651458241
954   -2706 0.000247270953949545
955   -2708 0.000260083526905394
956   -2710 0.000275286056335416
957   -2712 0.000293138008774478
958   -2714 0.000315098638979930
959   -2716 0.000342140022611386
960   -2718 0.000376355762584957
961   -2720 0.000422618703820090
962   -2722 0.000488803228667163
963   -2724 0.000585387059813060
964   -2726 0.000728318801443707
965   -2728 0.000938827018235910
966   -2730 0.00123037571269695
967   -2732 0.00155229568740433
968   -2734 0.00172266995984292
969   -2736 0.00158429227183195
970   -2738 0.00126235409603059
971   -2740 0.000954219558161654
972   -2742 0.000733284051680574
973   -2744 0.000590574186925838
974   -2746 0.000500913503228797
975   -2748 0.000444283569806984
976   -2750 0.000408552058896459
977   -2752 0.000386442879562956
978   -2754 0.000373264157615818
979   -2756 0.000366670327661857
980   -2758 0.000363876514149830
981   -2760 0.000361532536949891
982   -2762 0.000363675314741141
983   -2764 0.000366718711717702
984   -2766 0.000373487709343178
985   -2768 0.000385907143020104
986   -2770 0.000398462101615587
987   -2772 0.000413801469177668
988   -2774 0.000425659990486031
989   -2776 0.000436402382617843
990   -2778 0.000446662734946199
991   -2780 0.000455121187378285
992   -2782 0.000464083631949392
993   -2784 0.000471837814603525
994   -2786 0.000485996560282024
995   -2788 0.000502172804216709
996   -2790 0.000522830212064553
997   -2792 0.000548289451554969
998   -2794 0.000579634288120943
999   -2796 0.000611379237870225
1000   -2798 0.000641158616950349
1001   -2800 0.000672247209660977
1002   -2802 0.000711615716417748
1003   -2804 0.000756204442404881
1004   -2806 0.000806513382136127
1005   -2808 0.000854383801707436
1006   -2810 0.000899046135928726
1007   -2812 0.000920533253907859
1008   -2814 0.000922946174823163
1009   -2816 0.000938823165339874
1010   -2818 0.000975854382639431
1011   -2820 0.00103794809306155
1012   -2822 0.00111441105526966
1013   -2824 0.00117124310275486
1014   -2826 0.00120584112843460
1015   -2828 0.00126141309789025
1016   -2830 0.00134778284367920
1017   -2832 0.00146199663837007
1018   -2834 0.00159718851386329
1019   -2836 0.00175330338362696
1020   -2838 0.00193523559724759
1021   -2840 0.00214829304268432
1022   -2842 0.00239693861672905
1023   -2844 0.00270947510257679
1024   -2846 0.00308962037090872
1025   -2848 0.00355940585209848
1026   -2850 0.00412210422108316
1027   -2852 0.00476891854151234
1028   -2854 0.00547214050611261
1029   -2856 0.00617409172881556
1030   -2858 0.00678722786702444
1031   -2860 0.00723807939551757
1032   -2862 0.00752048939258356
1033   -2864 0.00769405118384194
1034   -2866 0.00780672387589873
1035   -2868 0.00789211778455793
1036   -2870 0.00795935754077555
1037   -2872 0.00799733164350610
1038   -2874 0.00795934759033912
1039   -2876 0.00778684233057949
1040   -2878 0.00748513477927108
1041   -2880 0.00712782450019760
1042   -2882 0.00674716793892496
1043   -2884 0.00636559086703165
1044   -2886 0.00600252759803496
1045   -2888 0.00568003469443299
1046   -2890 0.00541869257628554
1047   -2892 0.00523149924308805
1048   -2894 0.00513859281992941
1049   -2896 0.00514912231818864
1050   -2898 0.00528298553786387
1051   -2900 0.00554846488279469
1052   -2902 0.00596670745150011
1053   -2904 0.00656025912947429
1054   -2906 0.00737309118502326
1055   -2908 0.00844343143196328
1056   -2910 0.00980783562233305
1057   -2912 0.0114361820721680
1058   -2914 0.0132043723140582
1059   -2916 0.0148639399258050
1060   -2918 0.0160322637171387
1061   -2920 0.0163848402191419
1062   -2922 0.0159315596024990
1063   -2924 0.0149712224125917
1064   -2926 0.0138179195741240
1065   -2928 0.0126830001717222
1066   -2930 0.0117051760061400
1067   -2932 0.0109454119425227
1068   -2934 0.0104094926683649
1069   -2936 0.0100777464854532
1070   -2938 0.00991576239015874
1071   -2940 0.00989092758914217
1072   -2942 0.00995253861794336
1073   -2944 0.0100558436016283
1074   -2946 0.0101466649820268
1075   -2948 0.0101700911447294
1076   -2950 0.0100970420129300
1077   -2952 0.00995445488065370
1078   -2954 0.00977184847019253
1079   -2956 0.00956031409076577
1080   -2958 0.00931672833064324
1081   -2960 0.00900841342025127
1082   -2962 0.00860452512496009
1083   -2964 0.00819173199579369
1084   -2966 0.00793188379052879
1085   -2968 0.00787856977180025
1086   -2970 0.00795406658370171
1087   -2972 0.00807021356855313
1088   -2974 0.00817433984043233
1089   -2976 0.00825003493744345
1090   -2978 0.00828855603001654
1091   -2980 0.00828386290179407
1092   -2982 0.00816950979044141
1093   -2984 0.00795147116279175
1094   -2986 0.00771875813248752
1095   -2988 0.00752177579743462
1096   -2990 0.00739482968641806
1097   -2992 0.00735495102785436
1098   -2994 0.00742400805444368
1099   -2996 0.00762947734762659
1100   -2998 0.00800350176450487
1101   -3000 0.00849881078288103
1102   -3002 0.00896624168638865
1103   -3004 0.00925040248900867
1104   -3006 0.00945455630611128
1105   -3008 0.00976581762927042
1106   -3010 0.0103150719126273
1107   -3012 0.0112091641279662
1108   -3014 0.0125665741882334
1109   -3016 0.0144920310150755
1110   -3018 0.0171523311364697
1111   -3020 0.0206588071576588
1112   -3022 0.0247927573582982
1113   -3024 0.0285338257471566
1114   -3026 0.0305737428191527
1115   -3028 0.0304197730378849
1116   -3030 0.0285285708945381
1117   -3032 0.0254626182993726
1118   -3034 0.0218417847555673
1119   -3036 0.0183214780469989
1120   -3038 0.0154367262434714
1121   -3040 0.0134174271105468
1122   -3042 0.0121814306436623
1123   -3044 0.0114802419869786
1124   -3046 0.0111082334096508
1125   -3048 0.0110364952795097
1126   -3050 0.0112341213861221
1127   -3052 0.0116521403194674
1128   -3054 0.0121679353995795
1129   -3056 0.0126492093791370
1130   -3058 0.0130640240273400
1131   -3060 0.0134217837485980
1132   -3062 0.0136027351521215
1133   -3064 0.0133566760196114
1134   -3066 0.0124957830807641
1135   -3068 0.0111185801076637
1136   -3070 0.00962312187980008
1137   -3072 0.00840019013916095
1138   -3074 0.00762785975903174
1139   -3076 0.00731431659052294
1140   -3078 0.00742769361429674
1141   -3080 0.00800169947155848
1142   -3082 0.00909924810606661
1143   -3084 0.0105612984915747
1144   -3086 0.0115953458981882
1145   -3088 0.0108915516715014
1146   -3090 0.00855348266587572
1147   -3092 0.00625766310903960
1148   -3094 0.00474250996240750
1149   -3096 0.00389487972553113
1150   -3098 0.00350242093033435
1151   -3100 0.00342566123955596
1152   -3102 0.00354245491578370
1153   -3104 0.00366329979669444
1154   -3106 0.00351255659174282
1155   -3108 0.00307160622386024
1156   -3110 0.00262319086310484
1157   -3112 0.00230238895472291
1158   -3114 0.00208330628877116
1159   -3116 0.00190296000440166
1160   -3118 0.00170124594674715
1161   -3120 0.00147221774746264
1162   -3122 0.00126680203340060
1163   -3124 0.00110221512874358
1164   -3126 0.000972843085744223
1165   -3128 0.000865976217229730
1166   -3130 0.000787123046176519
1167   -3132 0.000725569824317256
1168   -3134 0.000678619961272403
1169   -3136 0.000643376054198741
1170   -3138 0.000613508276940799
1171   -3140 0.000585754400051242
1172   -3142 0.000561171104171409
1173   -3144 0.000538801514536514
1174   -3146 0.000520080512301793
1175   -3148 0.000505696831504068
1176   -3150 0.000493470880103411
1177   -3152 0.000480268222246598
1178   -3154 0.000470385004364871
1179   -3156 0.000459220112914975
1180   -3158 0.000450945450269378
1181   -3160 0.000450827328828143
1182   -3162 0.000455120896574839
1183   -3164 0.000465883832863404
1184   -3166 0.000478798660924222
1185   -3168 0.000482832083650923
1186   -3170 0.000455625596338195
1187   -3172 0.000403338720059331
1188   -3174 0.000360438306588196
1189   -3176 0.000332520864586029
1190   -3178 0.000313938694862586
1191   -3180 0.000300705768353348
1192   -3182 0.000290665831960273
1193   -3184 0.000282478444260369
1194   -3186 0.000275747274780963
1195   -3188 0.000269274452306063
1196   -3190 0.000262630704721266
1197   -3192 0.000255445037852355
1198   -3194 0.000248377973867383
1199   -3196 0.000241977580841794
1200   -3198 0.000236251689540068
1201   -3200 0.000230923454004864
1202   -3202 0.000226049100105626
1203   -3204 0.000221226160126354
1204   -3206 0.000214716060376866
1205   -3208 0.000206517982920749
1206   -3210 0.000198104526951019
1207   -3212 0.000190353242003341
1208   -3214 0.000183841618071712
1209   -3216 0.000178536526886377
1210   -3218 0.000173732996508941
1211   -3220 0.000169365792718528
1212   -3222 0.000165299675350027
1213   -3224 0.000161252739783070
1214   -3226 0.000157550287906591
1215   -3228 0.000154290860671044
1216   -3230 0.000151403187559336
1217   -3232 0.000148762116611554
1218   -3234 0.000146608972658800
1219   -3236 0.000144929084687115
1220   -3238 0.000143621190469325
1221   -3240 0.000142423755040669
1222   -3242 0.000141225309365069
1223   -3244 0.000139879705280103
1224   -3246 0.000138120388481842
1225   -3248 0.000136557609027687
1226   -3250 0.000135029965649156
1227   -3252 0.000133891483928728
1228   -3254 0.000133096425324259
1229   -3256 0.000132368577771128
1230   -3258 0.000131178881840028
1231   -3260 0.000129611032335659
1232   -3262 0.000128050800000000
1233   -3264 0.000126496752229370
1234   -3266 0.000125487476864466
1235   -3268 0.000124918363511663
1236   -3270 0.000124282902673504
1237   -3272 0.000123524889665480
1238   -3274 0.000122442491776109
1239   -3276 0.000121443655497364
1240   -3278 0.000120760252331750
1241   -3280 0.000120133235127335
1242   -3282 0.000119422774440518
1243   -3284 0.000118787091342885
1244   -3286 0.000118050006014353
1245   -3288 0.000117490615311207
1246   -3290 0.000116940876538515
1247   -3292 0.000116411722780357
1248   -3294 0.000116040811167173
1249   -3296 0.000115834700717885
1250   -3298 0.000116085966839459
1251   -3300 0.000116986523436758
1252   -3302 0.000118267730379294
1253   -3304 0.000119505403103670
1254   -3306 0.000120364280297837
1255   -3308 0.000119982615737227
1256   -3310 0.000118961448074642
1257   -3312 0.000117873723711904
1258   -3314 0.000117091085003690
1259   -3316 0.000116576391297391
1260   -3318 0.000116630812029799
1261   -3320 0.000116648622872189
1262   -3322 0.000116640410140475
1263   -3324 0.000116601640984688
1264   -3326 0.000116254038453171
1265   -3328 0.000115188264691018
1266   -3330 0.000113811841076524
1267   -3332 0.000111681446514179
1268   -3334 0.000108818040972509
1269   -3336 0.000105958252604406
1270   -3338 0.000103151741537451
1271   -3340 0.000100395217441575
1272   -3342 9.80332064093372e-05
1273   -3344 9.53544349575209e-05
1274   -3346 9.25223256784850e-05
1275   -3348 9.00829101787277e-05
1276   -3350 8.83163531062304e-05
1277   -3352 8.72118771260860e-05
1278   -3354 8.64440098119140e-05
1279   -3356 8.60520504254794e-05
1280   -3358 8.61965597139509e-05
1281   -3360 8.70019144324470e-05
1282   -3362 8.83318478317726e-05
1283   -3364 9.00079714359512e-05
1284   -3366 9.23139048671722e-05
1285   -3368 9.50882502511675e-05
1286   -3370 9.78832163580005e-05
1287   -3372 0.000100096171211192
1288   -3374 0.000102179086616863
1289   -3376 0.000103749608742208
1290   -3378 0.000105213237160669
1291   -3380 0.000106688938713341
1292   -3382 0.000107853667399164
1293   -3384 0.000108503663896066
1294   -3386 0.000108465998629706
1295   -3388 0.000107522134166390
1296   -3390 0.000105586354148376
1297   -3392 0.000103099282581304
1298   -3394 0.000100324257650923
1299   -3396 9.74485799284953e-05
1300   -3398 9.51596059704078e-05
1301   -3400 9.35013107298140e-05
1302   -3402 9.21170196430098e-05
1303   -3404 9.07360614712649e-05
1304   -3406 8.91138931604199e-05
1305   -3408 8.74505590276362e-05
1306   -3410 8.56664975562433e-05
1307   -3412 8.43848055968202e-05
1308   -3414 8.35095737363273e-05
1309   -3416 8.28173663218536e-05
1310   -3418 8.25803390851867e-05
1311   -3420 8.34887031217918e-05
1312   -3422 8.50941717249168e-05
1313   -3424 8.76826565386191e-05
1314   -3426 9.18893425240818e-05
1315   -3428 9.72727573628125e-05
1316   -3430 0.000103498414055259
1317   -3432 0.000110175431772886
1318   -3434 0.000116489353052258
1319   -3436 0.000121652113320222
1320   -3438 0.000125199891677689
1321   -3440 0.000126017012084730
1322   -3442 0.000123363542579961
1323   -3444 0.000118359425974797
1324   -3446 0.000111284305442118
1325   -3448 0.000102049297013716
1326   -3450 9.29060570294263e-05
1327   -3452 8.56830126047782e-05
1328   -3454 8.03943044406067e-05
1329   -3456 7.64946805035534e-05
1330   -3458 7.35384095568400e-05
1331   -3460 7.15607792666279e-05
1332   -3462 7.00113147312602e-05
1333   -3464 6.86840886320734e-05
1334   -3466 6.76516046709459e-05
1335   -3468 6.66317002099573e-05
1336   -3470 6.58163245627029e-05
1337   -3472 6.48526803819241e-05
1338   -3474 6.41769150098627e-05
1339   -3476 6.33519637219242e-05
1340   -3478 6.21036964756407e-05
1341   -3480 6.07594134549892e-05
1342   -3482 5.99888706228529e-05
1343   -3484 5.95355056229478e-05
1344   -3486 5.98196476615315e-05
1345   -3488 6.07067305157839e-05
1346   -3490 6.20707024404776e-05
1347   -3492 6.35630004076309e-05
1348   -3494 6.39802692410745e-05
1349   -3496 6.36894878745265e-05
1350   -3498 6.27365377476382e-05
1351   -3500 6.17431130904710e-05
1352   -3502 6.13279727787810e-05
1353   -3504 6.13193515749704e-05
1354   -3506 6.24903413403870e-05
1355   -3508 6.43864144265415e-05
1356   -3510 6.71410924962580e-05
1357   -3512 7.03539058487688e-05
1358   -3514 7.47946182109209e-05
1359   -3516 7.95754496113107e-05
1360   -3518 8.34700851824913e-05
1361   -3520 8.39873348467991e-05
1362   -3522 8.07272560865977e-05
1363   -3524 7.56312308938946e-05
1364   -3526 7.10894728276635e-05
1365   -3528 6.81632208726418e-05
1366   -3530 6.64216930115337e-05
1367   -3532 6.58132280866232e-05
1368   -3534 6.67321753128692e-05
1369   -3536 6.94647085013537e-05
1370   -3538 7.44308734240544e-05
1371   -3540 8.16543395123198e-05
1372   -3542 9.03200858171377e-05
1373   -3544 9.85535954298993e-05
1374   -3546 0.000104547035052111
1375   -3548 0.000107433770750519
1376   -3550 0.000108038450708995
1377   -3552 0.000107166592996916
1378   -3554 0.000105178798896553
1379   -3556 0.000101095184756009
1380   -3558 9.50814999627662e-05
1381   -3560 8.82058228394490e-05
1382   -3562 8.18208514354733e-05
1383   -3564 7.68850700845907e-05
1384   -3566 7.38744666163043e-05
1385   -3568 7.27642291486909e-05
1386   -3570 7.33994731408140e-05
1387   -3572 7.56627166220080e-05
1388   -3574 7.96660140607364e-05
1389   -3576 8.51090055206606e-05
1390   -3578 9.29167699145132e-05
1391   -3580 0.000102526366929820
1392   -3582 0.000114877275226176
1393   -3584 0.000126190559302250
1394   -3586 0.000124628073841470
1395   -3588 0.000119415520864134
1396   -3590 0.000112006712936662
1397   -3592 0.000105579072932928
1398   -3594 0.000100691596209911
1399   -3596 9.80454508807073e-05
1400   -3598 9.79289585249404e-05
1401   -3600 9.76517090509766e-05
1402   -3602 9.63252158538093e-05
1403   -3604 9.47873503300014e-05
1404   -3606 9.40807594813255e-05
1405   -3608 9.38724750866359e-05
1406   -3610 9.46504942395723e-05
1407   -3612 9.80150733458878e-05
1408   -3614 0.000104630751802908
1409   -3616 0.000115783489148453
1410   -3618 0.000130667214647273
1411   -3620 0.000146477404898454
1412   -3622 0.000158530547818508
1413   -3624 0.000162318596543099
1414   -3626 0.000158125871191841
1415   -3628 0.000150672245587412
1416   -3630 0.000144549679683140
1417   -3632 0.000142051097385185
1418   -3634 0.000145529942933542
1419   -3636 0.000153343488815115
1420   -3638 0.000167576397035396
1421   -3640 0.000187305749491179
1422   -3642 0.000211282337261951
1423   -3644 0.000235521019158824
1424   -3646 0.000255526042383438
1425   -3648 0.000267309387292886
1426   -3650 0.000267620489558132
1427   -3652 0.000257281965913234
1428   -3654 0.000238427431722088
1429   -3656 0.000215910141107563
1430   -3658 0.000194198641163347
1431   -3660 0.000175915805990763
1432   -3662 0.000162335012119966
1433   -3664 0.000152841199834750
1434   -3666 0.000146981907091703
1435   -3668 0.000143997827610619
1436   -3670 0.000143648436802218
1437   -3672 0.000144734329787788
1438   -3674 0.000145900823579283
1439   -3676 0.000145536357339105
1440   -3678 0.000142791335633658
1441   -3680 0.000138712508096908
1442   -3682 0.000133854756804407
1443   -3684 0.000128953007630511
1444   -3686 0.000123724720918296
1445   -3688 0.000118053544364748
1446   -3690 0.000112538647366327
1447   -3692 0.000108762709162428
1448   -3694 0.000106869096858975
1449   -3696 0.000106178550226360
1450   -3698 0.000108026299705946
1451   -3700 0.000113499289845608
1452   -3702 0.000122346067036449
1453   -3704 0.000132017367154307
1454   -3706 0.000138204981263169
1455   -3708 0.000137812952692201
1456   -3710 0.000131957371338105
1457   -3712 0.000124911657013813
1458   -3714 0.000120086480186131
1459   -3716 0.000119368867384451
1460   -3718 0.000123023160227338
1461   -3720 0.000129681526292498
1462   -3722 0.000136685573712829
1463   -3724 0.000140355687154432
1464   -3726 0.000137643004943763
1465   -3728 0.000130059156127694
1466   -3730 0.000121898190215580
1467   -3732 0.000115279209639364
1468   -3734 0.000109785664308487
1469   -3736 0.000105299764060944
1470   -3738 0.000101063203615323
1471   -3740 9.68651180755000e-05
1472   -3742 9.31808749176699e-05
1473   -3744 9.10149507453584e-05
1474   -3746 8.98056206735940e-05
1475   -3748 8.93161375554986e-05
1476   -3750 8.95680290795053e-05
1477   -3752 9.07085327291721e-05
1478   -3754 9.23144122730348e-05
1479   -3756 9.51698234276085e-05
1480   -3758 9.88200437936328e-05
1481   -3760 0.000102897737658181
1482   -3762 0.000106541912714358
1483   -3764 0.000108638955977754
1484   -3766 0.000107125969211894
1485   -3768 0.000104745321090008
1486   -3770 0.000104907149891996
1487   -3772 0.000107524035997495
1488   -3774 0.000112565658169961
1489   -3776 0.000120128967951347
1490   -3778 0.000130377699611365
1491   -3780 0.000143388258757916
1492   -3782 0.000157827987118552
1493   -3784 0.000171336843948261
1494   -3786 0.000178285748324712
1495   -3788 0.000174781489954516
1496   -3790 0.000164121439128089
1497   -3792 0.000152610210570708
1498   -3794 0.000144162759638053
1499   -3796 0.000139239462639203
1500   -3798 0.000137792736182703
1501   -3800 0.000140104567703810
1502   -3802 0.000145422058851258
1503   -3804 0.000152835113748305
1504   -3806 0.000161127793420174
1505   -3808 0.000168581867788859
1506   -3810 0.000173330279437380
1507   -3812 0.000175195783104517
1508   -3814 0.000174404180004515
1509   -3816 0.000172977411115116
1510   -3818 0.000172632535041757
1511   -3820 0.000174761333878933
1512   -3822 0.000179015946250825
1513   -3824 0.000183474569007118
1514   -3826 0.000187609784690581
1515   -3828 0.000192418303544244
1516   -3830 0.000199638672160316
1517   -3832 0.000209346193913544
1518   -3834 0.000221078085152779
1519   -3836 0.000233276912915708
1520   -3838 0.000243302212259793
1521   -3840 0.000248219562860653
1522   -3842 0.000249318750764567
1523   -3844 0.000250161224209589
1524   -3846 0.000251130509086889
1525   -3848 0.000250954031996911
1526   -3850 0.000247448125111366
1527   -3852 0.000239298068537633
1528   -3854 0.000227630000846504
1529   -3856 0.000215807191993378
1530   -3858 0.000207046517196079
1531   -3860 0.000202157638401237
1532   -3862 0.000202101096220524
1533   -3864 0.000206089427126992
1534   -3866 0.000212972794266054
1535   -3868 0.000220069608188463
1536   -3870 0.000223160954785535
1537   -3872 0.000217701230702324
1538   -3874 0.000205680240569784
1539   -3876 0.000194071196201460
1540   -3878 0.000186624022776833
1541   -3880 0.000183260750499541
1542   -3882 0.000183370917787493
1543   -3884 0.000186002682616268
1544   -3886 0.000190704000843751
1545   -3888 0.000195753159488382
1546   -3890 0.000199899173040718
1547   -3892 0.000202664798143917
1548   -3894 0.000204320562044854
1549   -3896 0.000204971280265517
1550   -3898 0.000204184602522533
1551   -3900 0.000202879694728580
1552   -3902 0.000202091110448804
1553   -3904 0.000203200507821011
1554   -3906 0.000206777694070363
1555   -3908 0.000212730193424292
1556   -3910 0.000215758904170297
1557   -3912 0.000211571330269805
1558   -3914 0.000205958146733392
1559   -3916 0.000202885902366098
1560   -3918 0.000203859899346076
1561   -3920 0.000208043821414469
1562   -3922 0.000213749060271441
1563   -3924 0.000216258022232613
1564   -3926 0.000210993095532934
1565   -3928 0.000200360509814737
1566   -3930 0.000190403984953153
1567   -3932 0.000185294952858894
1568   -3934 0.000184723195717293
1569   -3936 0.000186124269760876
1570   -3938 0.000187274520079713
1571   -3940 0.000189148765118607
1572   -3942 0.000191266181204903
1573   -3944 0.000194823747520104
1574   -3946 0.000199962536960736
1575   -3948 0.000206117700447747
1576   -3950 0.000211964821297933
1577   -3952 0.000211771907916455
1578   -3954 0.000207210064931517
1579   -3956 0.000200358454677226
1580   -3958 0.000194986979879340
1581   -3960 0.000191410166101308
1582   -3962 0.000188811490516811
1583   -3964 0.000186954388139908
1584   -3966 0.000184972375095875
1585   -3968 0.000183218705269115
1586   -3970 0.000181796902747989
1587   -3972 0.000181759132648531
1588   -3974 0.000184824282283672
1589   -3976 0.000192623374739583
1590   -3978 0.000205576802325497
1591   -3980 0.000216734030830589
1592   -3982 0.000209196916619900
1593   -3984 0.000193026471982283
1594   -3986 0.000183362654697217
1595   -3988 0.000180228706844783
1596   -3990 0.000181565573496817
1597   -3992 0.000186254988451223
1598   -3994 0.000193691373041908
1599   -3996 0.000204148918879724
1600   -3998 0.000217163156382698
  1 +800 0.00237097091817457
  2 +802 0.00227949941219620
  3 +804 0.00221816388191892
  4 +806 0.00217471041775780
  5 +808 0.00215481795727275
  6 +810 0.00213388387011066
  7 +812 0.00209363211698535
  8 +814 0.00202082763908315
  9 +816 0.00193585066178408
  10 +818 0.00188250850160370
  11 +820 0.00184538369212481
  12 +822 0.00183536653704965
  13 +824 0.00185974183080381
  14 +826 0.00190647188683237
  15 +828 0.00199326404385590
  16 +830 0.00213499888469032
  17 +832 0.00233225842027966
  18 +834 0.00257593995310952
  19 +836 0.00287502014227382
  20 +838 0.00318754088914534
  21 +840 0.00349170996961850
  22 +842 0.00366108155160527
  23 +844 0.00362683356184450
  24 +846 0.00340059748640139
  25 +848 0.00305608088262669
  26 +850 0.00270129337895778
  27 +852 0.00239675724637807
  28 +854 0.00217864428240924
  29 +856 0.00203021645685105
  30 +858 0.00193686140678899
  31 +860 0.00187749764181973
  32 +862 0.00185772044069943
  33 +864 0.00188910883086452
  34 +866 0.00195093483930895
  35 +868 0.00204692017755064
  36 +870 0.00215522059478817
  37 +872 0.00226016367314688
  38 +874 0.00224604514385606
  39 +876 0.00210230179408609
  40 +878 0.00199743674523776
  41 +880 0.00199218269491360
  42 +882 0.00208480862951801
  43 +884 0.00228270137034088
  44 +886 0.00262030644370857
  45 +888 0.00319352984551477
  46 +890 0.00421972378192706
  47 +892 0.00602385856914103
  48 +894 0.00840405009274333
  49 +896 0.00900675480510885
  50 +898 0.00696613165618276
  51 +900 0.00499554830114596
  52 +902 0.00383849939561442
  53 +904 0.00320523678732641
  54 +906 0.00285555041538049
  55 +908 0.00266476454212409
  56 +910 0.00254627716354120
  57 +912 0.00245341529587653
  58 +914 0.00236459307673934
  59 +916 0.00229282344387905
  60 +918 0.00223035979386559
  61 +920 0.00221227947671869
  62 +922 0.00224238729804433
  63 +924 0.00235007654381494
  64 +926 0.00256726325953723
  65 +928 0.00284644035247116
  66 +930 0.00294228033320561
  67 +932 0.00275916688965430
  68 +934 0.00258731026217053
  69 +936 0.00255719587176405
  70 +938 0.00262153336828821
  71 +940 0.00273896371051358
  72 +942 0.00287538936255749
  73 +944 0.00299732885131251
  74 +946 0.00309698674175826
  75 +948 0.00316605202547143
  76 +950 0.00320470876397792
  77 +952 0.00323491311445059
  78 +954 0.00329692599734166
  79 +956 0.00338582912769461
  80 +958 0.00350331602393855
  81 +960 0.00365994789379712
  82 +962 0.00382797968742639
  83 +964 0.00395048819829240
  84 +966 0.00399909330987952
  85 +968 0.00397747867047571
  86 +970 0.00393338530466517
  87 +972 0.00391527408455760
  88 +974 0.00393711464406835
  89 +976 0.00402058186620085
  90 +978 0.00414801626311813
  91 +980 0.00426028437517640
  92 +982 0.00424343298749414
  93 +984 0.00411994903649494
  94 +986 0.00399867235513141
  95 +988 0.00388651104937391
  96 +990 0.00379950457370988
  97 +992 0.00373977952014182
  98 +994 0.00373881240280082
  99 +996 0.00379956481032446
  100 +998 0.00393643103780800
  101 +1000 0.00418426742600855
  102 +1002 0.00448366832068703
  103 +1004 0.00421395149528264
  104 +1006 0.00400806256602511
  105 +1008 0.00395963930728052
  106 +1010 0.00399586579501438
  107 +1012 0.00412453345420230
  108 +1014 0.00435650139468447
  109 +1016 0.00470823294497344
  110 +1018 0.00525652222711324
  111 +1020 0.00620034607293144
  112 +1022 0.00761074657742514
  113 +1024 0.00904862587038915
  114 +1026 0.0128420613454482
  115 +1028 0.0232054647758307
  116 +1030 0.0401070318402723
  117 +1032 0.0237662509507289
  118 +1034 0.0150900768702586
  119 +1036 0.0136209302389719
  120 +1038 0.0140722804433677
  121 +1040 0.0148520038780156
  122 +1042 0.0150418759020717
  123 +1044 0.0142741299011939
  124 +1046 0.0127983598294137
  125 +1048 0.0111020250322553
  126 +1050 0.00953886802849649
  127 +1052 0.00823573530792714
  128 +1054 0.00722015941851439
  129 +1056 0.00647199198407014
  130 +1058 0.00595450625097980
  131 +1060 0.00562081994003704
  132 +1062 0.00547155564647798
  133 +1064 0.00551163119086301
  134 +1066 0.00577378575211103
  135 +1068 0.00633217061275026
  136 +1070 0.00731526451760166
  137 +1072 0.00888941764012196
  138 +1074 0.0111936669094970
  139 +1076 0.0145627178352916
  140 +1078 0.0198820542781815
  141 +1080 0.0272101442099741
  142 +1082 0.0294763996691438
  143 +1084 0.0207090896497001
  144 +1086 0.0127655286195192
  145 +1088 0.00854004269533275
  146 +1090 0.00635526613490286
  147 +1092 0.00518140755178082
  148 +1094 0.00455405026737381
  149 +1096 0.00426268956025233
  150 +1098 0.00423510235887238
  151 +1100 0.00446505970250814
  152 +1102 0.00496653746864136
  153 +1104 0.00580707926483870
  154 +1106 0.00666740083564581
  155 +1108 0.00624732665593806
  156 +1110 0.00479908163793379
  157 +1112 0.00361121925654796
  158 +1114 0.00287942570706319
  159 +1116 0.00246148742161380
  160 +1118 0.00222778888171568
  161 +1120 0.00209650525411750
  162 +1122 0.00202121838132918
  163 +1124 0.00199323955812561
  164 +1126 0.00200797851417853
  165 +1128 0.00204812470413808
  166 +1130 0.00209417368698948
  167 +1132 0.00209849682757402
  168 +1134 0.00210954008712956
  169 +1136 0.00214927272221614
  170 +1138 0.00221781253558492
  171 +1140 0.00231654284254776
  172 +1142 0.00241700276584513
  173 +1144 0.00252090482583751
  174 +1146 0.00265926205183231
  175 +1148 0.00286652526484237
  176 +1150 0.00313647720191737
  177 +1152 0.00347416081610501
  178 +1154 0.00387661923259805
  179 +1156 0.00410043342018308
  180 +1158 0.00394886198110498
  181 +1160 0.00373148843650175
  182 +1162 0.00350494607394550
  183 +1164 0.00334022215869222
  184 +1166 0.00324053812759405
  185 +1168 0.00323728249115084
  186 +1170 0.00337030363472976
  187 +1172 0.00370331752537631
  188 +1174 0.00446861428672600
  189 +1176 0.00627098368325835
  190 +1178 0.00931078620410600
  191 +1180 0.00795027706068620
  192 +1182 0.00505648215885331
  193 +1184 0.00377716421438011
  194 +1186 0.00319136495849046
  195 +1188 0.00290137589052677
  196 +1190 0.00275791558623964
  197 +1192 0.00269226681474014
  198 +1194 0.00266088014296474
  199 +1196 0.00258817828799466
  200 +1198 0.00241700923017517
  201 +1200 0.00221558969693162
  202 +1202 0.00211217407863773
  203 +1204 0.00220182940076526
  204 +1206 0.00261294695511882
  205 +1208 0.00347974535374746
  206 +1210 0.00437930056728570
  207 +1212 0.00342648851242818
  208 +1214 0.00227260060290268
  209 +1216 0.00178258728885112
  210 +1218 0.00154392622881232
  211 +1220 0.00139698451678244
  212 +1222 0.00129280677379398
  213 +1224 0.00121946854787068
  214 +1226 0.00117184455170345
  215 +1228 0.00113722984861070
  216 +1230 0.00111912311009601
  217 +1232 0.00111390956612134
  218 +1234 0.00112443805885795
  219 +1236 0.00115660063219376
  220 +1238 0.00121045559427169
  221 +1240 0.00129274578774778
  222 +1242 0.00140396276384137
  223 +1244 0.00154410614148823
  224 +1246 0.00169860381220359
  225 +1248 0.00180840115780576
  226 +1250 0.00177688982988028
  227 +1252 0.00157601125295148
  228 +1254 0.00138106340282942
  229 +1256 0.00125620905206826
  230 +1258 0.00118717226425611
  231 +1260 0.00114496451549449
  232 +1262 0.00111429933337465
  233 +1264 0.00109740533980092
  234 +1266 0.00108967549075875
  235 +1268 0.00109315730663637
  236 +1270 0.00110701272913057
  237 +1272 0.00112547293050748
  238 +1274 0.00114417070376777
  239 +1276 0.00115549769406343
  240 +1278 0.00115861723477586
  241 +1280 0.00114576824540165
  242 +1282 0.00112307423917382
  243 +1284 0.00110803299150391
  244 +1286 0.00109790695605719
  245 +1288 0.00109710433202375
  246 +1290 0.00110698710171340
  247 +1292 0.00113245942678089
  248 +1294 0.00117552067320688
  249 +1296 0.00124267198974583
  250 +1298 0.00132277561158489
  251 +1300 0.00139217958266282
  252 +1302 0.00142973694885209
  253 +1304 0.00144188181676038
  254 +1306 0.00147541483276765
  255 +1308 0.00159956692209740
  256 +1310 0.00186843894759088
  257 +1312 0.00216486082449073
  258 +1314 0.00211728875491887
  259 +1316 0.00187507564071290
  260 +1318 0.00171677440706927
  261 +1320 0.00164837511625716
  262 +1322 0.00163899782669962
  263 +1324 0.00166410609076352
  264 +1326 0.00171764577889364
  265 +1328 0.00180479473401823
  266 +1330 0.00194274885535529
  267 +1332 0.00206022538770732
  268 +1334 0.00196217286057273
  269 +1336 0.00188492778401013
  270 +1338 0.00187122231048589
  271 +1340 0.00188921428962955
  272 +1342 0.00193700700412885
  273 +1344 0.00200313353323991
  274 +1346 0.00208778115174581
  275 +1348 0.00218066174704292
  276 +1350 0.00226588109762249
  277 +1352 0.00236276913468593
  278 +1354 0.00248915903884931
  279 +1356 0.00265547420500685
  280 +1358 0.00284820286383517
  281 +1360 0.00303211548157874
  282 +1362 0.00319538643027851
  283 +1364 0.00338011260813816
  284 +1366 0.00363996415682390
  285 +1368 0.00400265764738686
  286 +1370 0.00448976968523854
  287 +1372 0.00525773678870123
  288 +1374 0.00662029687278425
  289 +1376 0.00908376119233617
  290 +1378 0.0123031513241818
  291 +1380 0.0121671979448086
  292 +1382 0.00940007546463800
  293 +1384 0.00754318150864360
  294 +1386 0.00640356392721685
  295 +1388 0.00563257119321882
  296 +1390 0.00511010869784208
  297 +1392 0.00475789415695825
  298 +1394 0.00452833517370964
  299 +1396 0.00440186171426137
  300 +1398 0.00433687786700866
  301 +1400 0.00432317844214779
  302 +1402 0.00436175400856741
  303 +1404 0.00444654158141412
  304 +1406 0.00458045165701961
  305 +1408 0.00472070193080689
  306 +1410 0.00484730108752061
  307 +1412 0.00499169569971829
  308 +1414 0.00517526500052341
  309 +1416 0.00540856165680758
  310 +1418 0.00569301961826355
  311 +1420 0.00603609386579061
  312 +1422 0.00639815529754280
  313 +1424 0.00676704333943306
  314 +1426 0.00709702523848474
  315 +1428 0.00735286473751553
  316 +1430 0.00758946104003622
  317 +1432 0.00786781701959305
  318 +1434 0.00830202970708910
  319 +1436 0.00898232020613486
  320 +1438 0.0100197835148382
  321 +1440 0.0115095063570045
  322 +1442 0.0133985990853930
  323 +1444 0.0153768866835411
  324 +1446 0.0171765347348967
  325 +1448 0.0189361099169456
  326 +1450 0.0208245294344141
  327 +1452 0.0228039247538198
  328 +1454 0.0246810508004892
  329 +1456 0.0262618411626106
  330 +1458 0.0273608063623162
  331 +1460 0.0277930934742346
  332 +1462 0.0274706237226478
  333 +1464 0.0264211185824187
  334 +1466 0.0247980788620200
  335 +1468 0.0228296555480849
  336 +1470 0.0207834609064780
  337 +1472 0.0188724652439656
  338 +1474 0.0171801988754876
  339 +1476 0.0157920753997752
  340 +1478 0.0147283011159520
  341 +1480 0.0140030494767984
  342 +1482 0.0137569248084170
  343 +1484 0.0141879797029108
  344 +1486 0.0159226244331294
  345 +1488 0.0201940578220826
  346 +1490 0.0260836787125339
  347 +1492 0.0401202763896059
  348 +1494 0.0761786772950870
  349 +1496 0.108223079178941
  350 +1498 0.0527249260725011
  351 +1500 0.0271635520581988
  352 +1502 0.0173322191403291
  353 +1504 0.0124889207648925
  354 +1506 0.00992131298532918
  355 +1508 0.00839752655521901
  356 +1510 0.00745176347821015
  357 +1512 0.00688020881374870
  358 +1514 0.00648533490268327
  359 +1516 0.00628100243994201
  360 +1518 0.00629379543847072
  361 +1520 0.00670033315002658
  362 +1522 0.00786453088070098
  363 +1524 0.00861000109877936
  364 +1526 0.00697026673858113
  365 +1528 0.00565227380276001
  366 +1530 0.00510003019871344
  367 +1532 0.00487330093915990
  368 +1534 0.00477643425469498
  369 +1536 0.00467177280329912
  370 +1538 0.00449022432901730
  371 +1540 0.00423934685882746
  372 +1542 0.00393426018189818
  373 +1544 0.00365660104528498
  374 +1546 0.00348923385240243
  375 +1548 0.00342710802865492
  376 +1550 0.00346898664460405
  377 +1552 0.00338295466527580
  378 +1554 0.00321378452613121
  379 +1556 0.00313430635529189
  380 +1558 0.00316907431392649
  381 +1560 0.00330481737182376
  382 +1562 0.00356172011440931
  383 +1564 0.00388898354936485
  384 +1566 0.00429638887941885
  385 +1568 0.00472113284868973
  386 +1570 0.00504929184964361
  387 +1572 0.00519286093716334
  388 +1574 0.00509202242388202
  389 +1576 0.00481769783190026
  390 +1578 0.00455543799934706
  391 +1580 0.00435935962171553
  392 +1582 0.00433990247775519
  393 +1584 0.00460726311748136
  394 +1586 0.00492003737038605
  395 +1588 0.00490704034351103
  396 +1590 0.00492753522146188
  397 +1592 0.00518588888004375
  398 +1594 0.00592543183304241
  399 +1596 0.00720757954725413
  400 +1598 0.00912890526935344
  401 +1600 0.0130293680056744
  402 +1602 0.0206809953186127
  403 +1604 0.0299953585748135
  404 +1606 0.0248157340286292
  405 +1608 0.0127358449020555
  406 +1610 0.00746783575970784
  407 +1612 0.00537209761858949
  408 +1614 0.00445129559785390
  409 +1616 0.00405329276394375
  410 +1618 0.00399146289131384
  411 +1620 0.00409659649670941
  412 +1622 0.00425086095548363
  413 +1624 0.00425306230534309
  414 +1626 0.00388013491422351
  415 +1628 0.00322765310314340
  416 +1630 0.00259805094537761
  417 +1632 0.00208657181154715
  418 +1634 0.00169843933990688
  419 +1636 0.00141785441008406
  420 +1638 0.00123234974672297
  421 +1640 0.00109764310439106
  422 +1642 0.000997096490971439
  423 +1644 0.000923943814992787
  424 +1646 0.000867694719207358
  425 +1648 0.000857989573211860
  426 +1650 0.000876925837508371
  427 +1652 0.000900483600662835
  428 +1654 0.000924599031590994
  429 +1656 0.000943402878947833
  430 +1658 0.000957189946759812
  431 +1660 0.000919301596934912
  432 +1662 0.000829980699381760
  433 +1664 0.000741920416434289
  434 +1666 0.000684454640853614
  435 +1668 0.000660487010052916
  436 +1670 0.000677329699540855
  437 +1672 0.000733663772686657
  438 +1674 0.000829672252398670
  439 +1676 0.000923202402787059
  440 +1678 0.000900896424649981
  441 +1680 0.000787132461270056
  442 +1682 0.000676995955481515
  443 +1684 0.000611701232515841
  444 +1686 0.000595044263899243
  445 +1688 0.000601913444772076
  446 +1690 0.000631185451917075
  447 +1692 0.000675093910401457
  448 +1694 0.000731422393886708
  449 +1696 0.000808376337564176
  450 +1698 0.000794279618925047
  451 +1700 0.000709354504802398
  452 +1702 0.000657251178127169
  453 +1704 0.000631084077034609
  454 +1706 0.000620630016846374
  455 +1708 0.000614804872029308
  456 +1710 0.000610379344278778
  457 +1712 0.000608365704329393
  458 +1714 0.000610177708447017
  459 +1716 0.000628060629349526
  460 +1718 0.000671390695691186
  461 +1720 0.000748670745348075
  462 +1722 0.000874314265691752
  463 +1724 0.00104123844277088
  464 +1726 0.00123749183518020
  465 +1728 0.00147184752955714
  466 +1730 0.00173223404858593
  467 +1732 0.00197582318555127
  468 +1734 0.00215543372945357
  469 +1736 0.00220452603076912
  470 +1738 0.00209119301342784
  471 +1740 0.00185700091397871
  472 +1742 0.00156445999707629
  473 +1744 0.00127824303920924
  474 +1746 0.00103830550711541
  475 +1748 0.000858082809524967
  476 +1750 0.000736720622233361
  477 +1752 0.000665836151632355
  478 +1754 0.000633014507978860
  479 +1756 0.000636204186868655
  480 +1758 0.000664560791933513
  481 +1760 0.000700854142871225
  482 +1762 0.000738249770728404
  483 +1764 0.000779473476320026
  484 +1766 0.000831332837575542
  485 +1768 0.000887483745995595
  486 +1770 0.000943100942235622
  487 +1772 0.00100855983483948
  488 +1774 0.00108815587341361
  489 +1776 0.00117336763806935
  490 +1778 0.00122720647155439
  491 +1780 0.00120867298099444
  492 +1782 0.00117346527655232
  493 +1784 0.00119371865588136
  494 +1786 0.00128533671400934
  495 +1788 0.00142590894789679
  496 +1790 0.00158054902116715
  497 +1792 0.00179850758319075
  498 +1794 0.00213331852757031
  499 +1796 0.00258371206804431
  500 +1798 0.00310651819625664
  501 +1800 0.00358456135015573
  502 +1802 0.00384535056234718
  503 +1804 0.00377208677963125
  504 +1806 0.00340950704775298
  505 +1808 0.00292589878928829
  506 +1810 0.00246230467854199
  507 +1812 0.00209503276430901
  508 +1814 0.00185262669472132
  509 +1816 0.00171702079169156
  510 +1818 0.00163886439352206
  511 +1820 0.00157730777183400
  512 +1822 0.00149679229624579
  513 +1824 0.00138863730310920
  514 +1826 0.00127743508882463
  515 +1828 0.00118456389012839
  516 +1830 0.00112905353317808
  517 +1832 0.00108606377735617
  518 +1834 0.00103086061641581
  519 +1836 0.000984959950309749
  520 +1838 0.000979289058512249
  521 +1840 0.00102288594610930
  522 +1842 0.00112067935890798
  523 +1844 0.00128394592127716
  524 +1846 0.00152723861251123
  525 +1848 0.00188826636609761
  526 +1850 0.00239227576491655
  527 +1852 0.00300971905084921
  528 +1854 0.00364059420885185
  529 +1856 0.00414527688649222
  530 +1858 0.00428418417776257
  531 +1860 0.00397341781363892
  532 +1862 0.00343437915842565
  533 +1864 0.00294698351848267
  534 +1866 0.00265685216170442
  535 +1868 0.00257554798807387
  536 +1870 0.00262362192114651
  537 +1872 0.00267320615475132
  538 +1874 0.00259670566832300
  539 +1876 0.00235341832549094
  540 +1878 0.00201352392982882
  541 +1880 0.00167162491751218
  542 +1882 0.00138756730843950
  543 +1884 0.00117032979189392
  544 +1886 0.00101120581308014
  545 +1888 0.000892343360827370
  546 +1890 0.000799797724248844
  547 +1892 0.000722584304592367
  548 +1894 0.000668205830350704
  549 +1896 0.000645563701038960
  550 +1898 0.000645767881929762
  551 +1900 0.000633984361915526
  552 +1902 0.000588098076669510
  553 +1904 0.000535948959936282
  554 +1906 0.000500979831672727
  555 +1908 0.000480503614669823
  556 +1910 0.000475812984522745
  557 +1912 0.000486823903968232
  558 +1914 0.000515195500000000
  559 +1916 0.000562568109473544
  560 +1918 0.000630427523781356
  561 +1920 0.000723610116430462
  562 +1922 0.000847642176098185
  563 +1924 0.000992789644339751
  564 +1926 0.00114429259972093
  565 +1928 0.00131728542788928
  566 +1930 0.00155893716312052
  567 +1932 0.00190373075161683
  568 +1934 0.00237556565013185
  569 +1936 0.00298040121387223
  570 +1938 0.00364293200808332
  571 +1940 0.00416589638649938
  572 +1942 0.00433944387091247
  573 +1944 0.00420413532397440
  574 +1946 0.00380161374653215
  575 +1948 0.00327719918178656
  576 +1950 0.00282576366330091
  577 +1952 0.00253348765310892
  578 +1954 0.00239437526824859
  579 +1956 0.00234603768444204
  580 +1958 0.00232574864667046
  581 +1960 0.00220039532483667
  582 +1962 0.00199445232375287
  583 +1964 0.00170495488495039
  584 +1966 0.00137875775323702
  585 +1968 0.00109690552229723
  586 +1970 0.000878128994624433
  587 +1972 0.000721601368959039
  588 +1974 0.000617419916987627
  589 +1976 0.000562113218832075
  590 +1978 0.000551026292591773
  591 +1980 0.000575711660935202
  592 +1982 0.000615370850112472
  593 +1984 0.000626638864213787
  594 +1986 0.000619344762051612
  595 +1988 0.000644972987040071
  596 +1990 0.000691941782910493
  597 +1992 0.000694254646432683
  598 +1994 0.000622443290799324
  599 +1996 0.000495200120138662
  600 +1998 0.000402620427801543
  601 +2000 0.000357520428000267
  602 +2002 0.000340715817783006
  603 +2004 0.000340725563484929
  604 +2006 0.000349587604938024
  605 +2008 0.000357889528657337
  606 +2010 0.000352782837535485
  607 +2012 0.000327904929253038
  608 +2014 0.000298699882098499
  609 +2016 0.000271842376811093
  610 +2018 0.000242333037716520
  611 +2020 0.000218337240170542
  612 +2022 0.000199194821720737
  613 +2024 0.000183911806628813
  614 +2026 0.000171888258235563
  615 +2028 0.000164785282634461
  616 +2030 0.000164391739593814
  617 +2032 0.000169011600820695
  618 +2034 0.000154127618321273
  619 +2036 0.000133850562902313
  620 +2038 0.000121768011512588
  621 +2040 0.000114542173977814
  622 +2042 0.000109960714942027
  623 +2044 0.000107324747708015
  624 +2046 0.000105319938271901
  625 +2048 0.000104400109927128
  626 +2050 0.000104560803595480
  627 +2052 0.000105682984195988
  628 +2054 0.000107138188290709
  629 +2056 0.000109850938702712
  630 +2058 0.000113964387835913
  631 +2060 0.000119159665067584
  632 +2062 0.000125394011284327
  633 +2064 0.000135383120416356
  634 +2066 0.000150829077064515
  635 +2068 0.000163896208951784
  636 +2070 0.000158538657020860
  637 +2072 0.000143857048326539
  638 +2074 0.000133838990991728
  639 +2076 0.000126082674541763
  640 +2078 0.000119111322229434
  641 +2080 0.000113978504701401
  642 +2082 0.000110907574969952
  643 +2084 0.000108574694668308
  644 +2086 0.000105750311657561
  645 +2088 0.000102757884920459
  646 +2090 0.000100315348970678
  647 +2092 9.88998809699028e-05
  648 +2094 9.84636051990861e-05
  649 +2096 9.86736776470892e-05
  650 +2098 9.86832304001427e-05
  651 +2100 9.94847029581411e-05
  652 +2102 0.000102501492433386
  653 +2104 0.000108578252528750
  654 +2106 0.000117598982731806
  655 +2108 0.000128810423312497
  656 +2110 0.000138078130156183
  657 +2112 0.000139894738408702
  658 +2114 0.000140372347283306
  659 +2116 0.000147183990385426
  660 +2118 0.000142580842940779
  661 +2120 0.000126124302551768
  662 +2122 0.000119111147897455
  663 +2124 0.000117761941379516
  664 +2126 0.000110386213471180
  665 +2128 0.000100586367430428
  666 +2130 9.65127771567695e-05
  667 +2132 9.71593180254151e-05
  668 +2134 0.000100588542105452
  669 +2136 0.000104481772978239
  670 +2138 0.000107041125533866
  671 +2140 0.000108872498221666
  672 +2142 0.000111489568147590
  673 +2144 0.000115451529322482
  674 +2146 0.000120558240114413
  675 +2148 0.000126537781071288
  676 +2150 0.000134733619506300
  677 +2152 0.000148643632029954
  678 +2154 0.000172040859828778
  679 +2156 0.000210048660817435
  680 +2158 0.000268125741557685
  681 +2160 0.000351069215958102
  682 +2162 0.000450344598032358
  683 +2164 0.000489938528699291
  684 +2166 0.000409492796412179
  685 +2168 0.000304387639702614
  686 +2170 0.000235891130206754
  687 +2172 0.000200519075056806
  688 +2174 0.000185710828669175
  689 +2176 0.000182424899321747
  690 +2178 0.000187448554282292
  691 +2180 0.000203021437757415
  692 +2182 0.000231533383222207
  693 +2184 0.000266979354976650
  694 +2186 0.000274670338797065
  695 +2188 0.000249531305296574
  696 +2190 0.000224075465024111
  697 +2192 0.000200276630934979
  698 +2194 0.000177273244376758
  699 +2196 0.000160285923199765
  700 +2198 0.000150581068702164
  701 +2200 0.000148630566016007
  702 +2202 0.000159418644068291
  703 +2204 0.000190928483551684
  704 +2206 0.000246685640401459
  705 +2208 0.000270254541506430
  706 +2210 0.000222823187679136
  707 +2212 0.000183299674920404
  708 +2214 0.000159208446689860
  709 +2216 0.000141367831176120
  710 +2218 0.000133886240444937
  711 +2220 0.000133377867922854
  712 +2222 0.000136687110101880
  713 +2224 0.000141595068371183
  714 +2226 0.000145519316291541
  715 +2228 0.000148458736825531
  716 +2230 0.000153316938474443
  717 +2232 0.000163253960273079
  718 +2234 0.000178923069609914
  719 +2236 0.000194257120755014
  720 +2238 0.000196450490452201
  721 +2240 0.000188281502894665
  722 +2242 0.000182547056123856
  723 +2244 0.000184193400303698
  724 +2246 0.000192794200162931
  725 +2248 0.000207468879582850
  726 +2250 0.000228635659533982
  727 +2252 0.000256821954754517
  728 +2254 0.000293238050530334
  729 +2256 0.000339843587945316
  730 +2258 0.000394697192716897
  731 +2260 0.000433841600455809
  732 +2262 0.000418808222045475
  733 +2264 0.000365652480977041
  734 +2266 0.000317992842743265
  735 +2268 0.000289251978678528
  736 +2270 0.000276323460348606
  737 +2272 0.000276007776761593
  738 +2274 0.000285194711508216
  739 +2276 0.000305840459677383
  740 +2278 0.000341614672459952
  741 +2280 0.000378323694871339
  742 +2282 0.000375183465200990
  743 +2284 0.000372499291886178
  744 +2286 0.000379130457959152
  745 +2288 0.000369071052928138
  746 +2290 0.000344203099796142
  747 +2292 0.000313724278864159
  748 +2294 0.000283180068926335
  749 +2296 0.000260398235921227
  750 +2298 0.000248364444837745
  751 +2300 0.000246962256014277
  752 +2302 0.000257337196851115
  753 +2304 0.000282117167464228
  754 +2306 0.000327011660272884
  755 +2308 0.000402901410624785
  756 +2310 0.000515678907419335
  757 +2312 0.000613221545587734
  758 +2314 0.000587317319167494
  759 +2316 0.000479703817387008
  760 +2318 0.000387543339108333
  761 +2320 0.000331935579008350
  762 +2322 0.000305882244139694
  763 +2324 0.000301743073919341
  764 +2326 0.000318021837096887
  765 +2328 0.000360763254301904
  766 +2330 0.000442864766710211
  767 +2332 0.000580146273004247
  768 +2334 0.000746878008138738
  769 +2336 0.000778905767997363
  770 +2338 0.000655878707879373
  771 +2340 0.000549860316308082
  772 +2342 0.000474310426764780
  773 +2344 0.000414796574428013
  774 +2346 0.000384139069758195
  775 +2348 0.000382158356339707
  776 +2350 0.000402158338733409
  777 +2352 0.000435516153586227
  778 +2354 0.000472182760873504
  779 +2356 0.000515961034751272
  780 +2358 0.000592576004516974
  781 +2360 0.000693206523120231
  782 +2362 0.000643638218785556
  783 +2364 0.000478341631402279
  784 +2366 0.000369914098808752
  785 +2368 0.000314093467617302
  786 +2370 0.000287309303030045
  787 +2372 0.000274524402561852
  788 +2374 0.000270061869985669
  789 +2376 0.000271829601590763
  790 +2378 0.000279194809335497
  791 +2380 0.000294905061876556
  792 +2382 0.000319347534507768
  793 +2384 0.000350241467027989
  794 +2386 0.000391786089197638
  795 +2388 0.000432288381112108
  796 +2390 0.000431894838874137
  797 +2392 0.000400306861211915
  798 +2394 0.000373780803138032
  799 +2396 0.000355410966982535
  800 +2398 0.000347151739593354
  801 +2400 0.000350924151462325
  802 +2402 0.000365706536144189
  803 +2404 0.000389705426960732
  804 +2406 0.000421334803876133
  805 +2408 0.000459934423654906
  806 +2410 0.000500616815279102
  807 +2412 0.000525702627325844
  808 +2414 0.000513223543953278
  809 +2416 0.000478247500654749
  810 +2418 0.000439595749420076
  811 +2420 0.000399407179067621
  812 +2422 0.000365631853681067
  813 +2424 0.000342099304419797
  814 +2426 0.000327643185447820
  815 +2428 0.000319852482413628
  816 +2430 0.000318090248146717
  817 +2432 0.000318226888962093
  818 +2434 0.000307017564256603
  819 +2436 0.000284561022911212
  820 +2438 0.000265983112770141
  821 +2440 0.000252937611403322
  822 +2442 0.000242679401171322
  823 +2444 0.000236093051616947
  824 +2446 0.000233130690914760
  825 +2448 0.000233167378896135
  826 +2450 0.000235415965609999
  827 +2452 0.000239364304311204
  828 +2454 0.000244209499641596
  829 +2456 0.000248579466181052
  830 +2458 0.000251144773278908
  831 +2460 0.000252431049719579
  832 +2462 0.000253691712617762
  833 +2464 0.000255788005476147
  834 +2466 0.000256434321853842
  835 +2468 0.000251072591655402
  836 +2470 0.000241597521259849
  837 +2472 0.000234162117014666
  838 +2474 0.000229676856991507
  839 +2476 0.000227592143774873
  840 +2478 0.000226834091088810
  841 +2480 0.000227168703547583
  842 +2482 0.000228588584217583
  843 +2484 0.000231746296813716
  844 +2486 0.000236823965966075
  845 +2488 0.000241600139160114
  846 +2490 0.000244394482975018
  847 +2492 0.000244248137929474
  848 +2494 0.000245127828260994
  849 +2496 0.000251434891521320
  850 +2498 0.000247993851620619
  851 +2500 0.000232735996433491
  852 +2502 0.000222497793867323
  853 +2504 0.000221589422451279
  854 +2506 0.000232579945681551
  855 +2508 0.000250427153657126
  856 +2510 0.000252498000507853
  857 +2512 0.000232189718802120
  858 +2514 0.000211050185590214
  859 +2516 0.000198391157226399
  860 +2518 0.000193635707688150
  861 +2520 0.000193341820452081
  862 +2522 0.000193371593068733
  863 +2524 0.000189643081211288
  864 +2526 0.000181794690676754
  865 +2528 0.000178838464388285
  866 +2530 0.000183501803348288
  867 +2532 0.000194837096053966
  868 +2534 0.000211327514566071
  869 +2536 0.000231393834808824
  870 +2538 0.000255837394665623
  871 +2540 0.000275709996672117
  872 +2542 0.000266055047783776
  873 +2544 0.000243859757637041
  874 +2546 0.000235285437161138
  875 +2548 0.000236304976186297
  876 +2550 0.000232544359689715
  877 +2552 0.000218806075082454
  878 +2554 0.000204743746363893
  879 +2556 0.000196655427865349
  880 +2558 0.000191976123078746
  881 +2560 0.000186392842736032
  882 +2562 0.000182465243677096
  883 +2564 0.000182341770175991
  884 +2566 0.000186622668096877
  885 +2568 0.000194771585308041
  886 +2570 0.000207509200230819
  887 +2572 0.000227536779149540
  888 +2574 0.000256126025913237
  889 +2576 0.000293783533966409
  890 +2578 0.000344606705405512
  891 +2580 0.000421000900491490
  892 +2582 0.000539940417278290
  893 +2584 0.000691325137774485
  894 +2586 0.000768064347900480
  895 +2588 0.000684349300000000
  896 +2590 0.000536495643153772
  897 +2592 0.000418107936641488
  898 +2594 0.000348162932430616
  899 +2596 0.000316562063243598
  900 +2598 0.000311605992448936
  901 +2600 0.000329718943031756
  902 +2602 0.000370011429187919
  903 +2604 0.000412184734144213
  904 +2606 0.000402481978671523
  905 +2608 0.000368470211663778
  906 +2610 0.000353398410510846
  907 +2612 0.000328281593188018
  908 +2614 0.000295400882956194
  909 +2616 0.000275902521470556
  910 +2618 0.000268299167514448
  911 +2620 0.000267511791747167
  912 +2622 0.000270974116559811
  913 +2624 0.000277238419508473
  914 +2626 0.000286763887252883
  915 +2628 0.000300107477286003
  916 +2630 0.000316524811935304
  917 +2632 0.000327263381122722
  918 +2634 0.000305877054698251
  919 +2636 0.000269148133708810
  920 +2638 0.000248172907618610
  921 +2640 0.000239823700606054
  922 +2642 0.000238746030638882
  923 +2644 0.000239868631298371
  924 +2646 0.000237697572301885
  925 +2648 0.000231658620506580
  926 +2650 0.000224559727594560
  927 +2652 0.000220154792342943
  928 +2654 0.000220025182909045
  929 +2656 0.000220821585838385
  930 +2658 0.000219097069889182
  931 +2660 0.000213668868513552
  932 +2662 0.000206551642880241
  933 +2664 0.000200132874030954
  934 +2666 0.000198263371264169
  935 +2668 0.000204157476079366
  936 +2670 0.000219581959345431
  937 +2672 0.000228529275997830
  938 +2674 0.000212671171569940
  939 +2676 0.000198554340066309
  940 +2678 0.000193733620852842
  941 +2680 0.000194427317307389
  942 +2682 0.000197546011671515
  943 +2684 0.000200581527813713
  944 +2686 0.000203985348880727
  945 +2688 0.000208935024070450
  946 +2690 0.000213885837983080
  947 +2692 0.000215780646355564
  948 +2694 0.000215167439140776
  949 +2696 0.000214895725221701
  950 +2698 0.000217360387387823
  951 +2700 0.000222623944199778
  952 +2702 0.000229950531867105
  953 +2704 0.000237779651458241
  954 +2706 0.000247270953949545
  955 +2708 0.000260083526905394
  956 +2710 0.000275286056335416
  957 +2712 0.000293138008774478
  958 +2714 0.000315098638979930
  959 +2716 0.000342140022611386
  960 +2718 0.000376355762584957
  961 +2720 0.000422618703820090
  962 +2722 0.000488803228667163
  963 +2724 0.000585387059813060
  964 +2726 0.000728318801443707
  965 +2728 0.000938827018235910
  966 +2730 0.00123037571269695
  967 +2732 0.00155229568740433
  968 +2734 0.00172266995984292
  969 +2736 0.00158429227183195
  970 +2738 0.00126235409603059
  971 +2740 0.000954219558161654
  972 +2742 0.000733284051680574
  973 +2744 0.000590574186925838
  974 +2746 0.000500913503228797
  975 +2748 0.000444283569806984
  976 +2750 0.000408552058896459
  977 +2752 0.000386442879562956
  978 +2754 0.000373264157615818
  979 +2756 0.000366670327661857
  980 +2758 0.000363876514149830
  981 +2760 0.000361532536949891
  982 +2762 0.000363675314741141
  983 +2764 0.000366718711717702
  984 +2766 0.000373487709343178
  985 +2768 0.000385907143020104
  986 +2770 0.000398462101615587
  987 +2772 0.000413801469177668
  988 +2774 0.000425659990486031
  989 +2776 0.000436402382617843
  990 +2778 0.000446662734946199
  991 +2780 0.000455121187378285
  992 +2782 0.000464083631949392
  993 +2784 0.000471837814603525
  994 +2786 0.000485996560282024
  995 +2788 0.000502172804216709
  996 +2790 0.000522830212064553
  997 +2792 0.000548289451554969
  998 +2794 0.000579634288120943
  999 +2796 0.000611379237870225
  1000 +2798 0.000641158616950349
  1001 +2800 0.000672247209660977
  1002 +2802 0.000711615716417748
  1003 +2804 0.000756204442404881
  1004 +2806 0.000806513382136127
  1005 +2808 0.000854383801707436
  1006 +2810 0.000899046135928726
  1007 +2812 0.000920533253907859
  1008 +2814 0.000922946174823163
  1009 +2816 0.000938823165339874
  1010 +2818 0.000975854382639431
  1011 +2820 0.00103794809306155
  1012 +2822 0.00111441105526966
  1013 +2824 0.00117124310275486
  1014 +2826 0.00120584112843460
  1015 +2828 0.00126141309789025
  1016 +2830 0.00134778284367920
  1017 +2832 0.00146199663837007
  1018 +2834 0.00159718851386329
  1019 +2836 0.00175330338362696
  1020 +2838 0.00193523559724759
  1021 +2840 0.00214829304268432
  1022 +2842 0.00239693861672905
  1023 +2844 0.00270947510257679
  1024 +2846 0.00308962037090872
  1025 +2848 0.00355940585209848
  1026 +2850 0.00412210422108316
  1027 +2852 0.00476891854151234
  1028 +2854 0.00547214050611261
  1029 +2856 0.00617409172881556
  1030 +2858 0.00678722786702444
  1031 +2860 0.00723807939551757
  1032 +2862 0.00752048939258356
  1033 +2864 0.00769405118384194
  1034 +2866 0.00780672387589873
  1035 +2868 0.00789211778455793
  1036 +2870 0.00795935754077555
  1037 +2872 0.00799733164350610
  1038 +2874 0.00795934759033912
  1039 +2876 0.00778684233057949
  1040 +2878 0.00748513477927108
  1041 +2880 0.00712782450019760
  1042 +2882 0.00674716793892496
  1043 +2884 0.00636559086703165
  1044 +2886 0.00600252759803496
  1045 +2888 0.00568003469443299
  1046 +2890 0.00541869257628554
  1047 +2892 0.00523149924308805
  1048 +2894 0.00513859281992941
  1049 +2896 0.00514912231818864
  1050 +2898 0.00528298553786387
  1051 +2900 0.00554846488279469
  1052 +2902 0.00596670745150011
  1053 +2904 0.00656025912947429
  1054 +2906 0.00737309118502326
  1055 +2908 0.00844343143196328
  1056 +2910 0.00980783562233305
  1057 +2912 0.0114361820721680
  1058 +2914 0.0132043723140582
  1059 +2916 0.0148639399258050
  1060 +2918 0.0160322637171387
  1061 +2920 0.0163848402191419
  1062 +2922 0.0159315596024990
  1063 +2924 0.0149712224125917
  1064 +2926 0.0138179195741240
  1065 +2928 0.0126830001717222
  1066 +2930 0.0117051760061400
  1067 +2932 0.0109454119425227
  1068 +2934 0.0104094926683649
  1069 +2936 0.0100777464854532
  1070 +2938 0.00991576239015874
  1071 +2940 0.00989092758914217
  1072 +2942 0.00995253861794336
  1073 +2944 0.0100558436016283
  1074 +2946 0.0101466649820268
  1075 +2948 0.0101700911447294
  1076 +2950 0.0100970420129300
  1077 +2952 0.00995445488065370
  1078 +2954 0.00977184847019253
  1079 +2956 0.00956031409076577
  1080 +2958 0.00931672833064324
  1081 +2960 0.00900841342025127
  1082 +2962 0.00860452512496009
  1083 +2964 0.00819173199579369
  1084 +2966 0.00793188379052879
  1085 +2968 0.00787856977180025
  1086 +2970 0.00795406658370171
  1087 +2972 0.00807021356855313
  1088 +2974 0.00817433984043233
  1089 +2976 0.00825003493744345
  1090 +2978 0.00828855603001654
  1091 +2980 0.00828386290179407
  1092 +2982 0.00816950979044141
  1093 +2984 0.00795147116279175
  1094 +2986 0.00771875813248752
  1095 +2988 0.00752177579743462
  1096 +2990 0.00739482968641806
  1097 +2992 0.00735495102785436
  1098 +2994 0.00742400805444368
  1099 +2996 0.00762947734762659
  1100 +2998 0.00800350176450487
  1101 +3000 0.00849881078288103
  1102 +3002 0.00896624168638865
  1103 +3004 0.00925040248900867
  1104 +3006 0.00945455630611128
  1105 +3008 0.00976581762927042
  1106 +3010 0.0103150719126273
  1107 +3012 0.0112091641279662
  1108 +3014 0.0125665741882334
  1109 +3016 0.0144920310150755
  1110 +3018 0.0171523311364697
  1111 +3020 0.0206588071576588
  1112 +3022 0.0247927573582982
  1113 +3024 0.0285338257471566
  1114 +3026 0.0305737428191527
  1115 +3028 0.0304197730378849
  1116 +3030 0.0285285708945381
  1117 +3032 0.0254626182993726
  1118 +3034 0.0218417847555673
  1119 +3036 0.0183214780469989
  1120 +3038 0.0154367262434714
  1121 +3040 0.0134174271105468
  1122 +3042 0.0121814306436623
  1123 +3044 0.0114802419869786
  1124 +3046 0.0111082334096508
  1125 +3048 0.0110364952795097
  1126 +3050 0.0112341213861221
  1127 +3052 0.0116521403194674
  1128 +3054 0.0121679353995795
  1129 +3056 0.0126492093791370
  1130 +3058 0.0130640240273400
  1131 +3060 0.0134217837485980
  1132 +3062 0.0136027351521215
  1133 +3064 0.0133566760196114
  1134 +3066 0.0124957830807641
  1135 +3068 0.0111185801076637
  1136 +3070 0.00962312187980008
  1137 +3072 0.00840019013916095
  1138 +3074 0.00762785975903174
  1139 +3076 0.00731431659052294
  1140 +3078 0.00742769361429674
  1141 +3080 0.00800169947155848
  1142 +3082 0.00909924810606661
  1143 +3084 0.0105612984915747
  1144 +3086 0.0115953458981882
  1145 +3088 0.0108915516715014
  1146 +3090 0.00855348266587572
  1147 +3092 0.00625766310903960
  1148 +3094 0.00474250996240750
  1149 +3096 0.00389487972553113
  1150 +3098 0.00350242093033435
  1151 +3100 0.00342566123955596
  1152 +3102 0.00354245491578370
  1153 +3104 0.00366329979669444
  1154 +3106 0.00351255659174282
  1155 +3108 0.00307160622386024
  1156 +3110 0.00262319086310484
  1157 +3112 0.00230238895472291
  1158 +3114 0.00208330628877116
  1159 +3116 0.00190296000440166
  1160 +3118 0.00170124594674715
  1161 +3120 0.00147221774746264
  1162 +3122 0.00126680203340060
  1163 +3124 0.00110221512874358
  1164 +3126 0.000972843085744223
  1165 +3128 0.000865976217229730
  1166 +3130 0.000787123046176519
  1167 +3132 0.000725569824317256
  1168 +3134 0.000678619961272403
  1169 +3136 0.000643376054198741
  1170 +3138 0.000613508276940799
  1171 +3140 0.000585754400051242
  1172 +3142 0.000561171104171409
  1173 +3144 0.000538801514536514
  1174 +3146 0.000520080512301793
  1175 +3148 0.000505696831504068
  1176 +3150 0.000493470880103411
  1177 +3152 0.000480268222246598
  1178 +3154 0.000470385004364871
  1179 +3156 0.000459220112914975
  1180 +3158 0.000450945450269378
  1181 +3160 0.000450827328828143
  1182 +3162 0.000455120896574839
  1183 +3164 0.000465883832863404
  1184 +3166 0.000478798660924222
  1185 +3168 0.000482832083650923
  1186 +3170 0.000455625596338195
  1187 +3172 0.000403338720059331
  1188 +3174 0.000360438306588196
  1189 +3176 0.000332520864586029
  1190 +3178 0.000313938694862586
  1191 +3180 0.000300705768353348
  1192 +3182 0.000290665831960273
  1193 +3184 0.000282478444260369
  1194 +3186 0.000275747274780963
  1195 +3188 0.000269274452306063
  1196 +3190 0.000262630704721266
  1197 +3192 0.000255445037852355
  1198 +3194 0.000248377973867383
  1199 +3196 0.000241977580841794
  1200 +3198 0.000236251689540068
  1201 +3200 0.000230923454004864
  1202 +3202 0.000226049100105626
  1203 +3204 0.000221226160126354
  1204 +3206 0.000214716060376866
  1205 +3208 0.000206517982920749
  1206 +3210 0.000198104526951019
  1207 +3212 0.000190353242003341
  1208 +3214 0.000183841618071712
  1209 +3216 0.000178536526886377
  1210 +3218 0.000173732996508941
  1211 +3220 0.000169365792718528
  1212 +3222 0.000165299675350027
  1213 +3224 0.000161252739783070
  1214 +3226 0.000157550287906591
  1215 +3228 0.000154290860671044
  1216 +3230 0.000151403187559336
  1217 +3232 0.000148762116611554
  1218 +3234 0.000146608972658800
  1219 +3236 0.000144929084687115
  1220 +3238 0.000143621190469325
  1221 +3240 0.000142423755040669
  1222 +3242 0.000141225309365069
  1223 +3244 0.000139879705280103
  1224 +3246 0.000138120388481842
  1225 +3248 0.000136557609027687
  1226 +3250 0.000135029965649156
  1227 +3252 0.000133891483928728
  1228 +3254 0.000133096425324259
  1229 +3256 0.000132368577771128
  1230 +3258 0.000131178881840028
  1231 +3260 0.000129611032335659
  1232 +3262 0.000128050800000000
  1233 +3264 0.000126496752229370
  1234 +3266 0.000125487476864466
  1235 +3268 0.000124918363511663
  1236 +3270 0.000124282902673504
  1237 +3272 0.000123524889665480
  1238 +3274 0.000122442491776109
  1239 +3276 0.000121443655497364
  1240 +3278 0.000120760252331750
  1241 +3280 0.000120133235127335
  1242 +3282 0.000119422774440518
  1243 +3284 0.000118787091342885
  1244 +3286 0.000118050006014353
  1245 +3288 0.000117490615311207
  1246 +3290 0.000116940876538515
  1247 +3292 0.000116411722780357
  1248 +3294 0.000116040811167173
  1249 +3296 0.000115834700717885
  1250 +3298 0.000116085966839459
  1251 +3300 0.000116986523436758
  1252 +3302 0.000118267730379294
  1253 +3304 0.000119505403103670
  1254 +3306 0.000120364280297837
  1255 +3308 0.000119982615737227
  1256 +3310 0.000118961448074642
  1257 +3312 0.000117873723711904
  1258 +3314 0.000117091085003690
  1259 +3316 0.000116576391297391
  1260 +3318 0.000116630812029799
  1261 +3320 0.000116648622872189
  1262 +3322 0.000116640410140475
  1263 +3324 0.000116601640984688
  1264 +3326 0.000116254038453171
  1265 +3328 0.000115188264691018
  1266 +3330 0.000113811841076524
  1267 +3332 0.000111681446514179
  1268 +3334 0.000108818040972509
  1269 +3336 0.000105958252604406
  1270 +3338 0.000103151741537451
  1271 +3340 0.000100395217441575
  1272 +3342 9.80332064093372e-05
  1273 +3344 9.53544349575209e-05
  1274 +3346 9.25223256784850e-05
  1275 +3348 9.00829101787277e-05
  1276 +3350 8.83163531062304e-05
  1277 +3352 8.72118771260860e-05
  1278 +3354 8.64440098119140e-05
  1279 +3356 8.60520504254794e-05
  1280 +3358 8.61965597139509e-05
  1281 +3360 8.70019144324470e-05
  1282 +3362 8.83318478317726e-05
  1283 +3364 9.00079714359512e-05
  1284 +3366 9.23139048671722e-05
  1285 +3368 9.50882502511675e-05
  1286 +3370 9.78832163580005e-05
  1287 +3372 0.000100096171211192
  1288 +3374 0.000102179086616863
  1289 +3376 0.000103749608742208
  1290 +3378 0.000105213237160669
  1291 +3380 0.000106688938713341
  1292 +3382 0.000107853667399164
  1293 +3384 0.000108503663896066
  1294 +3386 0.000108465998629706
  1295 +3388 0.000107522134166390
  1296 +3390 0.000105586354148376
  1297 +3392 0.000103099282581304
  1298 +3394 0.000100324257650923
  1299 +3396 9.74485799284953e-05
  1300 +3398 9.51596059704078e-05
  1301 +3400 9.35013107298140e-05
  1302 +3402 9.21170196430098e-05
  1303 +3404 9.07360614712649e-05
  1304 +3406 8.91138931604199e-05
  1305 +3408 8.74505590276362e-05
  1306 +3410 8.56664975562433e-05
  1307 +3412 8.43848055968202e-05
  1308 +3414 8.35095737363273e-05
  1309 +3416 8.28173663218536e-05
  1310 +3418 8.25803390851867e-05
  1311 +3420 8.34887031217918e-05
  1312 +3422 8.50941717249168e-05
  1313 +3424 8.76826565386191e-05
  1314 +3426 9.18893425240818e-05
  1315 +3428 9.72727573628125e-05
  1316 +3430 0.000103498414055259
  1317 +3432 0.000110175431772886
  1318 +3434 0.000116489353052258
  1319 +3436 0.000121652113320222
  1320 +3438 0.000125199891677689
  1321 +3440 0.000126017012084730
  1322 +3442 0.000123363542579961
  1323 +3444 0.000118359425974797
  1324 +3446 0.000111284305442118
  1325 +3448 0.000102049297013716
  1326 +3450 9.29060570294263e-05
  1327 +3452 8.56830126047782e-05
  1328 +3454 8.03943044406067e-05
  1329 +3456 7.64946805035534e-05
  1330 +3458 7.35384095568400e-05
  1331 +3460 7.15607792666279e-05
  1332 +3462 7.00113147312602e-05
  1333 +3464 6.86840886320734e-05
  1334 +3466 6.76516046709459e-05
  1335 +3468 6.66317002099573e-05
  1336 +3470 6.58163245627029e-05
  1337 +3472 6.48526803819241e-05
  1338 +3474 6.41769150098627e-05
  1339 +3476 6.33519637219242e-05
  1340 +3478 6.21036964756407e-05
  1341 +3480 6.07594134549892e-05
  1342 +3482 5.99888706228529e-05
  1343 +3484 5.95355056229478e-05
  1344 +3486 5.98196476615315e-05
  1345 +3488 6.07067305157839e-05
  1346 +3490 6.20707024404776e-05
  1347 +3492 6.35630004076309e-05
  1348 +3494 6.39802692410745e-05
  1349 +3496 6.36894878745265e-05
  1350 +3498 6.27365377476382e-05
  1351 +3500 6.17431130904710e-05
  1352 +3502 6.13279727787810e-05
  1353 +3504 6.13193515749704e-05
  1354 +3506 6.24903413403870e-05
  1355 +3508 6.43864144265415e-05
  1356 +3510 6.71410924962580e-05
  1357 +3512 7.03539058487688e-05
  1358 +3514 7.47946182109209e-05
  1359 +3516 7.95754496113107e-05
  1360 +3518 8.34700851824913e-05
  1361 +3520 8.39873348467991e-05
  1362 +3522 8.07272560865977e-05
  1363 +3524 7.56312308938946e-05
  1364 +3526 7.10894728276635e-05
  1365 +3528 6.81632208726418e-05
  1366 +3530 6.64216930115337e-05
  1367 +3532 6.58132280866232e-05
  1368 +3534 6.67321753128692e-05
  1369 +3536 6.94647085013537e-05
  1370 +3538 7.44308734240544e-05
  1371 +3540 8.16543395123198e-05
  1372 +3542 9.03200858171377e-05
  1373 +3544 9.85535954298993e-05
  1374 +3546 0.000104547035052111
  1375 +3548 0.000107433770750519
  1376 +3550 0.000108038450708995
  1377 +3552 0.000107166592996916
  1378 +3554 0.000105178798896553
  1379 +3556 0.000101095184756009
  1380 +3558 9.50814999627662e-05
  1381 +3560 8.82058228394490e-05
  1382 +3562 8.18208514354733e-05
  1383 +3564 7.68850700845907e-05
  1384 +3566 7.38744666163043e-05
  1385 +3568 7.27642291486909e-05
  1386 +3570 7.33994731408140e-05
  1387 +3572 7.56627166220080e-05
  1388 +3574 7.96660140607364e-05
  1389 +3576 8.51090055206606e-05
  1390 +3578 9.29167699145132e-05
  1391 +3580 0.000102526366929820
  1392 +3582 0.000114877275226176
  1393 +3584 0.000126190559302250
  1394 +3586 0.000124628073841470
  1395 +3588 0.000119415520864134
  1396 +3590 0.000112006712936662
  1397 +3592 0.000105579072932928
  1398 +3594 0.000100691596209911
  1399 +3596 9.80454508807073e-05
  1400 +3598 9.79289585249404e-05
  1401 +3600 9.76517090509766e-05
  1402 +3602 9.63252158538093e-05
  1403 +3604 9.47873503300014e-05
  1404 +3606 9.40807594813255e-05
  1405 +3608 9.38724750866359e-05
  1406 +3610 9.46504942395723e-05
  1407 +3612 9.80150733458878e-05
  1408 +3614 0.000104630751802908
  1409 +3616 0.000115783489148453
  1410 +3618 0.000130667214647273
  1411 +3620 0.000146477404898454
  1412 +3622 0.000158530547818508
  1413 +3624 0.000162318596543099
  1414 +3626 0.000158125871191841
  1415 +3628 0.000150672245587412
  1416 +3630 0.000144549679683140
  1417 +3632 0.000142051097385185
  1418 +3634 0.000145529942933542
  1419 +3636 0.000153343488815115
  1420 +3638 0.000167576397035396
  1421 +3640 0.000187305749491179
  1422 +3642 0.000211282337261951
  1423 +3644 0.000235521019158824
  1424 +3646 0.000255526042383438
  1425 +3648 0.000267309387292886
  1426 +3650 0.000267620489558132
  1427 +3652 0.000257281965913234
  1428 +3654 0.000238427431722088
  1429 +3656 0.000215910141107563
  1430 +3658 0.000194198641163347
  1431 +3660 0.000175915805990763
  1432 +3662 0.000162335012119966
  1433 +3664 0.000152841199834750
  1434 +3666 0.000146981907091703
  1435 +3668 0.000143997827610619
  1436 +3670 0.000143648436802218
  1437 +3672 0.000144734329787788
  1438 +3674 0.000145900823579283
  1439 +3676 0.000145536357339105
  1440 +3678 0.000142791335633658
  1441 +3680 0.000138712508096908
  1442 +3682 0.000133854756804407
  1443 +3684 0.000128953007630511
  1444 +3686 0.000123724720918296
  1445 +3688 0.000118053544364748
  1446 +3690 0.000112538647366327
  1447 +3692 0.000108762709162428
  1448 +3694 0.000106869096858975
  1449 +3696 0.000106178550226360
  1450 +3698 0.000108026299705946
  1451 +3700 0.000113499289845608
  1452 +3702 0.000122346067036449
  1453 +3704 0.000132017367154307
  1454 +3706 0.000138204981263169
  1455 +3708 0.000137812952692201
  1456 +3710 0.000131957371338105
  1457 +3712 0.000124911657013813
  1458 +3714 0.000120086480186131
  1459 +3716 0.000119368867384451
  1460 +3718 0.000123023160227338
  1461 +3720 0.000129681526292498
  1462 +3722 0.000136685573712829
  1463 +3724 0.000140355687154432
  1464 +3726 0.000137643004943763
  1465 +3728 0.000130059156127694
  1466 +3730 0.000121898190215580
  1467 +3732 0.000115279209639364
  1468 +3734 0.000109785664308487
  1469 +3736 0.000105299764060944
  1470 +3738 0.000101063203615323
  1471 +3740 9.68651180755000e-05
  1472 +3742 9.31808749176699e-05
  1473 +3744 9.10149507453584e-05
  1474 +3746 8.98056206735940e-05
  1475 +3748 8.93161375554986e-05
  1476 +3750 8.95680290795053e-05
  1477 +3752 9.07085327291721e-05
  1478 +3754 9.23144122730348e-05
  1479 +3756 9.51698234276085e-05
  1480 +3758 9.88200437936328e-05
  1481 +3760 0.000102897737658181
  1482 +3762 0.000106541912714358
  1483 +3764 0.000108638955977754
  1484 +3766 0.000107125969211894
  1485 +3768 0.000104745321090008
  1486 +3770 0.000104907149891996
  1487 +3772 0.000107524035997495
  1488 +3774 0.000112565658169961
  1489 +3776 0.000120128967951347
  1490 +3778 0.000130377699611365
  1491 +3780 0.000143388258757916
  1492 +3782 0.000157827987118552
  1493 +3784 0.000171336843948261
  1494 +3786 0.000178285748324712
  1495 +3788 0.000174781489954516
  1496 +3790 0.000164121439128089
  1497 +3792 0.000152610210570708
  1498 +3794 0.000144162759638053
  1499 +3796 0.000139239462639203
  1500 +3798 0.000137792736182703
  1501 +3800 0.000140104567703810
  1502 +3802 0.000145422058851258
  1503 +3804 0.000152835113748305
  1504 +3806 0.000161127793420174
  1505 +3808 0.000168581867788859
  1506 +3810 0.000173330279437380
  1507 +3812 0.000175195783104517
  1508 +3814 0.000174404180004515
  1509 +3816 0.000172977411115116
  1510 +3818 0.000172632535041757
  1511 +3820 0.000174761333878933
  1512 +3822 0.000179015946250825
  1513 +3824 0.000183474569007118
  1514 +3826 0.000187609784690581
  1515 +3828 0.000192418303544244
  1516 +3830 0.000199638672160316
  1517 +3832 0.000209346193913544
  1518 +3834 0.000221078085152779
  1519 +3836 0.000233276912915708
  1520 +3838 0.000243302212259793
  1521 +3840 0.000248219562860653
  1522 +3842 0.000249318750764567
  1523 +3844 0.000250161224209589
  1524 +3846 0.000251130509086889
  1525 +3848 0.000250954031996911
  1526 +3850 0.000247448125111366
  1527 +3852 0.000239298068537633
  1528 +3854 0.000227630000846504
  1529 +3856 0.000215807191993378
  1530 +3858 0.000207046517196079
  1531 +3860 0.000202157638401237
  1532 +3862 0.000202101096220524
  1533 +3864 0.000206089427126992
  1534 +3866 0.000212972794266054
  1535 +3868 0.000220069608188463
  1536 +3870 0.000223160954785535
  1537 +3872 0.000217701230702324
  1538 +3874 0.000205680240569784
  1539 +3876 0.000194071196201460
  1540 +3878 0.000186624022776833
  1541 +3880 0.000183260750499541
  1542 +3882 0.000183370917787493
  1543 +3884 0.000186002682616268
  1544 +3886 0.000190704000843751
  1545 +3888 0.000195753159488382
  1546 +3890 0.000199899173040718
  1547 +3892 0.000202664798143917
  1548 +3894 0.000204320562044854
  1549 +3896 0.000204971280265517
  1550 +3898 0.000204184602522533
  1551 +3900 0.000202879694728580
  1552 +3902 0.000202091110448804
  1553 +3904 0.000203200507821011
  1554 +3906 0.000206777694070363
  1555 +3908 0.000212730193424292
  1556 +3910 0.000215758904170297
  1557 +3912 0.000211571330269805
  1558 +3914 0.000205958146733392
  1559 +3916 0.000202885902366098
  1560 +3918 0.000203859899346076
  1561 +3920 0.000208043821414469
  1562 +3922 0.000213749060271441
  1563 +3924 0.000216258022232613
  1564 +3926 0.000210993095532934
  1565 +3928 0.000200360509814737
  1566 +3930 0.000190403984953153
  1567 +3932 0.000185294952858894
  1568 +3934 0.000184723195717293
  1569 +3936 0.000186124269760876
  1570 +3938 0.000187274520079713
  1571 +3940 0.000189148765118607
  1572 +3942 0.000191266181204903
  1573 +3944 0.000194823747520104
  1574 +3946 0.000199962536960736
  1575 +3948 0.000206117700447747
  1576 +3950 0.000211964821297933
  1577 +3952 0.000211771907916455
  1578 +3954 0.000207210064931517
  1579 +3956 0.000200358454677226
  1580 +3958 0.000194986979879340
  1581 +3960 0.000191410166101308
  1582 +3962 0.000188811490516811
  1583 +3964 0.000186954388139908
  1584 +3966 0.000184972375095875
  1585 +3968 0.000183218705269115
  1586 +3970 0.000181796902747989
  1587 +3972 0.000181759132648531
  1588 +3974 0.000184824282283672
  1589 +3976 0.000192623374739583
  1590 +3978 0.000205576802325497
  1591 +3980 0.000216734030830589
  1592 +3982 0.000209196916619900
  1593 +3984 0.000193026471982283
  1594 +3986 0.000183362654697217
  1595 +3988 0.000180228706844783
  1596 +3990 0.000181565573496817
  1597 +3992 0.000186254988451223
  1598 +3994 0.000193691373041908
  1599 +3996 0.000204148918879724
  1600 +3998 0.000217163156382698
1601 1601 4000 0.000231947733021415
1602 1602 \ No newline at end of file
... ...
eta_TolueneN.txt
1   -800 1.44120102496924
2   -802 1.44244952355793
3   -804 1.44362241452370
4   -806 1.44473157548162
5   -808 1.44576931343185
6   -810 1.44673515341541
7   -812 1.44763153740528
8   -814 1.44849997645288
9   -816 1.44937159368323
10   -818 1.45024511061741
11   -820 1.45109838059394
12   -822 1.45193180052550
13   -824 1.45274307737647
14   -826 1.45353862658166
15   -828 1.45431614422343
16   -830 1.45505783090997
17   -832 1.45575257351567
18   -834 1.45637393495922
19   -836 1.45689903981153
20   -838 1.45730768949019
21   -840 1.45754105585989
22   -842 1.45762277914234
23   -844 1.45763704972226
24   -846 1.45770974157519
25   -848 1.45792998369439
26   -850 1.45831194599516
27   -852 1.45879214084464
28   -854 1.45933254646700
29   -856 1.45988983429307
30   -858 1.46043988459777
31   -860 1.46098292821135
32   -862 1.46151723624776
33   -864 1.46203872496248
34   -866 1.46253192223325
35   -868 1.46297856786196
36   -870 1.46337643775072
37   -872 1.46369146339390
38   -874 1.46394643585616
39   -876 1.46431343981134
40   -878 1.46483594897202
41   -880 1.46543855156632
42   -882 1.46608462990801
43   -884 1.46677023178158
44   -886 1.46750898169590
45   -888 1.46831763414834
46   -890 1.46912802427779
47   -892 1.46954514029358
48   -894 1.46839331789610
49   -896 1.46522362501208
50   -898 1.46324102369024
51   -900 1.46324805165743
52   -902 1.46389477313103
53   -904 1.46460285834673
54   -906 1.46524189063531
55   -908 1.46578615865865
56   -910 1.46624870624222
57   -912 1.46665117759441
58   -914 1.46703266934571
59   -916 1.46740765502925
60   -918 1.46779668973951
61   -920 1.46820189802559
62   -922 1.46861141696830
63   -924 1.46901759517687
64   -926 1.46935992609941
65   -928 1.46951316452951
66   -930 1.46945198189589
67   -932 1.46950773718789
68   -934 1.46980252488385
69   -936 1.47016397014931
70   -938 1.47050527825284
71   -940 1.47079802225791
72   -942 1.47102956241248
73   -944 1.47121559715866
74   -946 1.47137193902005
75   -948 1.47152008803324
76   -950 1.47167672882319
77   -952 1.47187041329055
78   -954 1.47208448275609
79   -956 1.47229737949647
80   -958 1.47250268786501
81   -960 1.47267011513556
82   -962 1.47277605897765
83   -964 1.47281096169045
84   -966 1.47283377833869
85   -968 1.47288521062562
86   -970 1.47300680592029
87   -972 1.47318336590741
88   -974 1.47338081764773
89   -976 1.47357969584368
90   -978 1.47371821017195
91   -980 1.47375527316737
92   -982 1.47374243519460
93   -984 1.47381322933363
94   -986 1.47398487555170
95   -988 1.47420629302573
96   -990 1.47448130861459
97   -992 1.47481507770761
98   -994 1.47518229617302
99   -996 1.47557023171639
100   -998 1.47596326572828
101   -1000 1.47630080652934
102   -1002 1.47636823234471
103   -1004 1.47636996678396
104   -1006 1.47689524896944
105   -1008 1.47750032220134
106   -1010 1.47819158796836
107   -1012 1.47897505869564
108   -1014 1.47986167058547
109   -1016 1.48089513800264
110   -1018 1.48214271193312
111   -1020 1.48362438976875
112   -1022 1.48502767979268
113   -1024 1.48723564000764
114   -1026 1.49092289691198
115   -1028 1.49396375951509
116   -1030 1.47873935405011
117   -1032 1.46178488502145
118   -1034 1.46614728364263
119   -1036 1.46944972756204
120   -1038 1.47076139801307
121   -1040 1.47051860247504
122   -1042 1.46925108082617
123   -1044 1.46777888639623
124   -1046 1.46677062217283
125   -1048 1.46644104430282
126   -1050 1.46666085838594
127   -1052 1.46724995592262
128   -1054 1.46804818971542
129   -1056 1.46897681608261
130   -1058 1.46995585496974
131   -1060 1.47098590895262
132   -1062 1.47206714530921
133   -1064 1.47321734998274
134   -1066 1.47445175619764
135   -1068 1.47579194531028
136   -1070 1.47721681438477
137   -1072 1.47863578920406
138   -1074 1.47989036409651
139   -1076 1.48086017571181
140   -1078 1.48069474784801
141   -1080 1.47616731467815
142   -1082 1.46390771869497
143   -1084 1.45570223896581
144   -1086 1.45597971475891
145   -1088 1.45836941934247
146   -1090 1.46066235559752
147   -1092 1.46255873201846
148   -1094 1.46411051824312
149   -1096 1.46540793776881
150   -1098 1.46651204425965
151   -1100 1.46743001960627
152   -1102 1.46810891059625
153   -1104 1.46835826348699
154   -1106 1.46762316195694
155   -1108 1.46618573784309
156   -1110 1.46572358542781
157   -1112 1.46614920302751
158   -1114 1.46684472613418
159   -1116 1.46754366818093
160   -1118 1.46816766240122
161   -1120 1.46871860517754
162   -1122 1.46920770699094
163   -1124 1.46965073082635
164   -1126 1.47005259957817
165   -1128 1.47040212564529
166   -1130 1.47068773768668
167   -1132 1.47096001810126
168   -1134 1.47125261448772
169   -1136 1.47154891832636
170   -1138 1.47183699189280
171   -1140 1.47209800955853
172   -1142 1.47233456778191
173   -1144 1.47257573473017
174   -1146 1.47283356711807
175   -1148 1.47307259446091
176   -1150 1.47326381831914
177   -1152 1.47336996150258
178   -1154 1.47330710459724
179   -1156 1.47293509477181
180   -1158 1.47266594765858
181   -1160 1.47259707273045
182   -1162 1.47267982619196
183   -1164 1.47288581951866
184   -1166 1.47317564562733
185   -1168 1.47355761342796
186   -1170 1.47402209612147
187   -1172 1.47459197223784
188   -1174 1.47529073492465
189   -1176 1.47579201984062
190   -1178 1.47389452829121
191   -1180 1.46944888964386
192   -1182 1.46919538008765
193   -1184 1.46993706618235
194   -1186 1.47058584953654
195   -1188 1.47109418040909
196   -1190 1.47148385016616
197   -1192 1.47177356227783
198   -1194 1.47196611004565
199   -1196 1.47207728619391
200   -1198 1.47220096862104
201   -1200 1.47245042725556
202   -1202 1.47283662225685
203   -1204 1.47330431122777
204   -1206 1.47375342391676
205   -1208 1.47385318037376
206   -1210 1.47280027515132
207   -1212 1.47140252001622
208   -1214 1.47159489093342
209   -1216 1.47205516262945
210   -1218 1.47243159969193
211   -1220 1.47273916940180
212   -1222 1.47301272972689
213   -1224 1.47326393439881
214   -1226 1.47349889542765
215   -1228 1.47371659199003
216   -1230 1.47393059180901
217   -1232 1.47413378656172
218   -1234 1.47433469964923
219   -1236 1.47453039235071
220   -1238 1.47471647903353
221   -1240 1.47488491964895
222   -1242 1.47502851521336
223   -1244 1.47512495593972
224   -1246 1.47514408931247
225   -1248 1.47505892212860
226   -1250 1.47489972136187
227   -1252 1.47484106680061
228   -1254 1.47493923662727
229   -1256 1.47509846252746
230   -1258 1.47526567770392
231   -1260 1.47542057167793
232   -1262 1.47557439533574
233   -1264 1.47572116951863
234   -1266 1.47586745130108
235   -1268 1.47601147334394
236   -1270 1.47614701936603
237   -1272 1.47627015399601
238   -1274 1.47638091039797
239   -1276 1.47648361938200
240   -1278 1.47658183373250
241   -1280 1.47668313548634
242   -1282 1.47679959880658
243   -1284 1.47693261142928
244   -1286 1.47707297484201
245   -1288 1.47722283448259
246   -1290 1.47738070554226
247   -1292 1.47754337420682
248   -1294 1.47770716341215
249   -1296 1.47786028165421
250   -1298 1.47798887584323
251   -1300 1.47808934206014
252   -1302 1.47818243145329
253   -1304 1.47830827158180
254   -1306 1.47849364056186
255   -1308 1.47871221118251
256   -1310 1.47885808674696
257   -1312 1.47873010242650
258   -1314 1.47845803582890
259   -1316 1.47844930632483
260   -1318 1.47861179184706
261   -1320 1.47881460317012
262   -1322 1.47902291732804
263   -1324 1.47922066571969
264   -1326 1.47941412833592
265   -1328 1.47959210849367
266   -1330 1.47973167816960
267   -1332 1.47972691925884
268   -1334 1.47975105896865
269   -1336 1.47993512250321
270   -1338 1.48014837613309
271   -1340 1.48037360725078
272   -1342 1.48060038757184
273   -1344 1.48082753333001
274   -1346 1.48104968129957
275   -1348 1.48126553234897
276   -1350 1.48148716441519
277   -1352 1.48173647624861
278   -1354 1.48200446828695
279   -1356 1.48227599517218
280   -1358 1.48252791950314
281   -1360 1.48276324869435
282   -1362 1.48303458306896
283   -1364 1.48338223264961
284   -1366 1.48379902481358
285   -1368 1.48427223592360
286   -1370 1.48482960284728
287   -1372 1.48552801978829
288   -1374 1.48627546417750
289   -1376 1.48651700069497
290   -1378 1.48432599213190
291   -1380 1.47977968972337
292   -1382 1.47800355097223
293   -1384 1.47805316502072
294   -1386 1.47842143243600
295   -1388 1.47890024839336
296   -1390 1.47940651645865
297   -1392 1.47991712903019
298   -1394 1.48041754934745
299   -1396 1.48089750917415
300   -1398 1.48135158724828
301   -1400 1.48179771126525
302   -1402 1.48224069922095
303   -1404 1.48266579602562
304   -1406 1.48305944158359
305   -1408 1.48342298716122
306   -1410 1.48379030750588
307   -1412 1.48419035949659
308   -1414 1.48461342812701
309   -1416 1.48505164072948
310   -1418 1.48548005566484
311   -1420 1.48588588173361
312   -1422 1.48626036521862
313   -1424 1.48659663343317
314   -1426 1.48690837523274
315   -1428 1.48726752634633
316   -1430 1.48775649947673
317   -1432 1.48841619746365
318   -1434 1.48924758721438
319   -1436 1.49022965011215
320   -1438 1.49126109208233
321   -1440 1.49220157896289
322   -1442 1.49274786168208
323   -1444 1.49275436842747
324   -1446 1.49244040803637
325   -1448 1.49203506779732
326   -1450 1.49142867984501
327   -1452 1.49040469923150
328   -1454 1.48888698396754
329   -1456 1.48687784303199
330   -1458 1.48442850436533
331   -1460 1.48174723159373
332   -1462 1.47906693249971
333   -1464 1.47667955286596
334   -1466 1.47482397028080
335   -1468 1.47364425598396
336   -1470 1.47319928261846
337   -1472 1.47339047699181
338   -1474 1.47411629804730
339   -1476 1.47533374680842
340   -1478 1.47696195971213
341   -1480 1.47908527215456
342   -1482 1.48180866451580
343   -1484 1.48531763958917
344   -1486 1.48994928684771
345   -1488 1.49499065429219
346   -1490 1.50119515596543
347   -1492 1.50990378628749
348   -1494 1.51196694565470
349   -1496 1.44560795826024
350   -1498 1.41456003179507
351   -1500 1.42568725767340
352   -1502 1.43509242814603
353   -1504 1.44179871660811
354   -1506 1.44669596130319
355   -1508 1.45033176716821
356   -1510 1.45318682655572
357   -1512 1.45545228048253
358   -1514 1.45731921509841
359   -1516 1.45894932377219
360   -1518 1.46041227592838
361   -1520 1.46176173499470
362   -1522 1.46244384736929
363   -1524 1.46122289585454
364   -1526 1.46043285810887
365   -1528 1.46128161485975
366   -1530 1.46226970833946
367   -1532 1.46306701307330
368   -1534 1.46366399954379
369   -1536 1.46409417910494
370   -1538 1.46444109535269
371   -1540 1.46477704752644
372   -1542 1.46519165698743
373   -1544 1.46568852566980
374   -1546 1.46623889292729
375   -1548 1.46677632998672
376   -1550 1.46719167293357
377   -1552 1.46747772804745
378   -1554 1.46791932189599
379   -1556 1.46844756268659
380   -1558 1.46898255634672
381   -1560 1.46952197034328
382   -1562 1.46999610489784
383   -1564 1.47038792635287
384   -1566 1.47066419723057
385   -1568 1.47075696992025
386   -1570 1.47067580679212
387   -1572 1.47047224204500
388   -1574 1.47030976437525
389   -1576 1.47033092176687
390   -1578 1.47057489703138
391   -1580 1.47099907306615
392   -1582 1.47158364170880
393   -1584 1.47213789972489
394   -1586 1.47240454856960
395   -1588 1.47273455527947
396   -1590 1.47343724065447
397   -1592 1.47446091811145
398   -1594 1.47574194447918
399   -1596 1.47705173230297
400   -1598 1.47867335885708
401   -1600 1.48062028756105
402   -1602 1.48036168324124
403   -1604 1.47134299168096
404   -1606 1.45508276794757
405   -1608 1.45359592019623
406   -1610 1.45693626090464
407   -1612 1.45964926448336
408   -1614 1.46156535264851
409   -1616 1.46294485069237
410   -1618 1.46393384687173
411   -1620 1.46454159062356
412   -1622 1.46478536173497
413   -1624 1.46467572345167
414   -1626 1.46443675069875
415   -1628 1.46442873304410
416   -1630 1.46468245393626
417   -1632 1.46507304958839
418   -1634 1.46551002264583
419   -1636 1.46597619450157
420   -1638 1.46639465048447
421   -1640 1.46677714745798
422   -1642 1.46713350654907
423   -1644 1.46746066478520
424   -1646 1.46777688897226
425   -1648 1.46807230212257
426   -1650 1.46832313178042
427   -1652 1.46853535477890
428   -1654 1.46871126235072
429   -1656 1.46886441952877
430   -1658 1.46897717842913
431   -1660 1.46906019325977
432   -1662 1.46917336129198
433   -1664 1.46933992968848
434   -1666 1.46953218537231
435   -1668 1.46973458666196
436   -1670 1.46993137012353
437   -1672 1.47010972990258
438   -1674 1.47023592719105
439   -1676 1.47026189453436
440   -1678 1.47023042790416
441   -1680 1.47026824213020
442   -1682 1.47039195163007
443   -1684 1.47055816296083
444   -1686 1.47072223030395
445   -1688 1.47088122473311
446   -1690 1.47102029360098
447   -1692 1.47114084717626
448   -1694 1.47123960018069
449   -1696 1.47128779153643
450   -1698 1.47126399416326
451   -1700 1.47132896383171
452   -1702 1.47143681802407
453   -1704 1.47155945773850
454   -1706 1.47167556592223
455   -1708 1.47178940246904
456   -1710 1.47190604771198
457   -1712 1.47202944260493
458   -1714 1.47216568678700
459   -1716 1.47231539851653
460   -1718 1.47248386890388
461   -1720 1.47265447525274
462   -1722 1.47281731074269
463   -1724 1.47295042900518
464   -1726 1.47304600716400
465   -1728 1.47309375883840
466   -1730 1.47305939547434
467   -1732 1.47291741773166
468   -1734 1.47267688996611
469   -1736 1.47235533806185
470   -1738 1.47204881790723
471   -1740 1.47183343980199
472   -1742 1.47174243401936
473   -1744 1.47176880507034
474   -1746 1.47188162854264
475   -1748 1.47204632190602
476   -1750 1.47223241396135
477   -1752 1.47242316015794
478   -1754 1.47260867420886
479   -1756 1.47278327809895
480   -1758 1.47293258838400
481   -1760 1.47306085751883
482   -1762 1.47317848011178
483   -1764 1.47329045336641
484   -1766 1.47339550159425
485   -1768 1.47349145470639
486   -1770 1.47357817480071
487   -1772 1.47366712599018
488   -1774 1.47373929846121
489   -1776 1.47378551120112
490   -1778 1.47379002011073
491   -1780 1.47381389620918
492   -1782 1.47392354891587
493   -1784 1.47409170003533
494   -1786 1.47427198188798
495   -1788 1.47442615650942
496   -1790 1.47457291909648
497   -1792 1.47474878427437
498   -1794 1.47489348470272
499   -1796 1.47493489892040
500   -1798 1.47478110512949
501   -1800 1.47437081445076
502   -1802 1.47373622085690
503   -1804 1.47304588258769
504   -1806 1.47251222749590
505   -1808 1.47223472657190
506   -1810 1.47217821063195
507   -1812 1.47227236503443
508   -1814 1.47243859996067
509   -1816 1.47259748640805
510   -1818 1.47271718154483
511   -1820 1.47279535803734
512   -1822 1.47284920630461
513   -1824 1.47291235631300
514   -1826 1.47301397376823
515   -1828 1.47314852957960
516   -1830 1.47329330162724
517   -1832 1.47342543709755
518   -1834 1.47357056562475
519   -1836 1.47375873628681
520   -1838 1.47398158101288
521   -1840 1.47422445263378
522   -1842 1.47448077748417
523   -1844 1.47474586805163
524   -1846 1.47500613122839
525   -1848 1.47524723874056
526   -1850 1.47539669943437
527   -1852 1.47535125830335
528   -1854 1.47504217493076
529   -1856 1.47442394463698
530   -1858 1.47358493716912
531   -1860 1.47284787021825
532   -1862 1.47246109965773
533   -1864 1.47241132718491
534   -1866 1.47253616431924
535   -1868 1.47266502935955
536   -1870 1.47267966566327
537   -1872 1.47252923128383
538   -1874 1.47227196419049
539   -1876 1.47203509622402
540   -1878 1.47192107290153
541   -1880 1.47194298711947
542   -1882 1.47205363793314
543   -1884 1.47220708298649
544   -1886 1.47237095289447
545   -1888 1.47253062677600
546   -1890 1.47268167466003
547   -1892 1.47283038859118
548   -1894 1.47298500841240
549   -1896 1.47313109785186
550   -1898 1.47324769232051
551   -1900 1.47333129201763
552   -1902 1.47341557098201
553   -1904 1.47353087942641
554   -1906 1.47366534069078
555   -1908 1.47380841038952
556   -1910 1.47395828541387
557   -1912 1.47411340271346
558   -1914 1.47427400000000
559   -1916 1.47443781042483
560   -1918 1.47460593444462
561   -1920 1.47477582054714
562   -1922 1.47493879861924
563   -1924 1.47508438695513
564   -1926 1.47522698209875
565   -1928 1.47539264822422
566   -1930 1.47558260671450
567   -1932 1.47576219402042
568   -1934 1.47587640732885
569   -1936 1.47583908582835
570   -1938 1.47553060901904
571   -1940 1.47489150443496
572   -1942 1.47409542930774
573   -1944 1.47334201979217
574   -1946 1.47275002485068
575   -1948 1.47244925775411
576   -1950 1.47239944627947
577   -1952 1.47247579265655
578   -1954 1.47255459735783
579   -1956 1.47256197135638
580   -1958 1.47246521668706
581   -1960 1.47228135320174
582   -1962 1.47212551111344
583   -1964 1.47202075140180
584   -1966 1.47202761573580
585   -1968 1.47213420575515
586   -1970 1.47229043240161
587   -1972 1.47246807810995
588   -1974 1.47265001716927
589   -1976 1.47282643638217
590   -1978 1.47298226071844
591   -1980 1.47310651432274
592   -1982 1.47317949653548
593   -1984 1.47321671851061
594   -1986 1.47327006170979
595   -1988 1.47332686296001
596   -1990 1.47332929557274
597   -1992 1.47327822607353
598   -1994 1.47322150680404
599   -1996 1.47323618581223
600   -1998 1.47331824302286
601   -2000 1.47341135456857
602   -2002 1.47349412728021
603   -2004 1.47356154386820
604   -2006 1.47361224775319
605   -2008 1.47364186456648
606   -2010 1.47365636042820
607   -2012 1.47367336928224
608   -2014 1.47370233665225
609   -2016 1.47373443692998
610   -2018 1.47377205797454
611   -2020 1.47381648358614
612   -2022 1.47386111301432
613   -2024 1.47390577969427
614   -2026 1.47395028817579
615   -2028 1.47399564538301
616   -2030 1.47403660265942
617   -2032 1.47406519767252
618   -2034 1.47408330994744
619   -2036 1.47412047010970
620   -2038 1.47416098226622
621   -2040 1.47420115643528
622   -2042 1.47423947043298
623   -2044 1.47427612941305
624   -2046 1.47431218419212
625   -2048 1.47434648116260
626   -2050 1.47438071427926
627   -2052 1.47441278409228
628   -2054 1.47444520616084
629   -2056 1.47447627049456
630   -2058 1.47450675882064
631   -2060 1.47453588733404
632   -2062 1.47456386702353
633   -2064 1.47459073458299
634   -2066 1.47461205370700
635   -2068 1.47461817299827
636   -2070 1.47461840283149
637   -2072 1.47463277175523
638   -2074 1.47465427880758
639   -2076 1.47467709152152
640   -2078 1.47470098997954
641   -2080 1.47472590140090
642   -2082 1.47475065118331
643   -2084 1.47477468067538
644   -2086 1.47479776494193
645   -2088 1.47482142195457
646   -2090 1.47484633615274
647   -2092 1.47487121877337
648   -2094 1.47489609572630
649   -2096 1.47491999718268
650   -2098 1.47494434691905
651   -2100 1.47496980619050
652   -2102 1.47499564254391
653   -2104 1.47502159030193
654   -2106 1.47504417582923
655   -2108 1.47506264533273
656   -2110 1.47507395400220
657   -2112 1.47508393678745
658   -2114 1.47510043049552
659   -2116 1.47511198378437
660   -2118 1.47511214568773
661   -2120 1.47512762848859
662   -2122 1.47515211305019
663   -2124 1.47517182375646
664   -2126 1.47518774789092
665   -2128 1.47521310826668
666   -2130 1.47524116489652
667   -2132 1.47527005212030
668   -2134 1.47529590535418
669   -2136 1.47531935031383
670   -2138 1.47534209120029
671   -2140 1.47536554624085
672   -2142 1.47539141048574
673   -2144 1.47541735186985
674   -2146 1.47544449187503
675   -2148 1.47547342544397
676   -2150 1.47550619668115
677   -2152 1.47554178363426
678   -2154 1.47558203516447
679   -2156 1.47562160093130
680   -2158 1.47565253763469
681   -2160 1.47566151568534
682   -2162 1.47561225894049
683   -2164 1.47548068559088
684   -2166 1.47537296738995
685   -2168 1.47536211403117
686   -2170 1.47539890926361
687   -2172 1.47544656614673
688   -2174 1.47549197749543
689   -2176 1.47553203213436
690   -2178 1.47556864358705
691   -2180 1.47560215753198
692   -2182 1.47562464470162
693   -2184 1.47562085582639
694   -2186 1.47558980476200
695   -2188 1.47557480988891
696   -2190 1.47558033450347
697   -2192 1.47559232749770
698   -2194 1.47561457143455
699   -2196 1.47564434139990
700   -2198 1.47567857523082
701   -2200 1.47571617803152
702   -2202 1.47575726786490
703   -2204 1.47579337721307
704   -2206 1.47579746772491
705   -2208 1.47574189594736
706   -2210 1.47571194854898
707   -2212 1.47572956986763
708   -2214 1.47575472007504
709   -2216 1.47578621163266
710   -2218 1.47581942101129
711   -2220 1.47585088742314
712   -2222 1.47587897173469
713   -2224 1.47590298856875
714   -2226 1.47592470046514
715   -2228 1.47594779372938
716   -2230 1.47597265137572
717   -2232 1.47599748726300
718   -2234 1.47601807246604
719   -2236 1.47602689076481
720   -2238 1.47603005518190
721   -2240 1.47604281703214
722   -2242 1.47606726159445
723   -2244 1.47609784881235
724   -2246 1.47612902016881
725   -2248 1.47615949406397
726   -2250 1.47618852095385
727   -2252 1.47621446243625
728   -2254 1.47623489680521
729   -2256 1.47624408046323
730   -2258 1.47623018458297
731   -2260 1.47617742404058
732   -2262 1.47611228816094
733   -2264 1.47608500995198
734   -2266 1.47609867784140
735   -2268 1.47612909924113
736   -2270 1.47616476482454
737   -2272 1.47619947439469
738   -2274 1.47623253066542
739   -2276 1.47626319551276
740   -2278 1.47628200368923
741   -2280 1.47626680426481
742   -2282 1.47624376410414
743   -2284 1.47624714378783
744   -2286 1.47623939342228
745   -2288 1.47622263640102
746   -2290 1.47621701248520
747   -2292 1.47622414847935
748   -2294 1.47624639786310
749   -2296 1.47628230617739
750   -2298 1.47632637399547
751   -2300 1.47637356620751
752   -2302 1.47642523943489
753   -2304 1.47647814675017
754   -2306 1.47652996718143
755   -2308 1.47657059295077
756   -2310 1.47656605147736
757   -2312 1.47646451238365
758   -2314 1.47632139830172
759   -2316 1.47626434895975
760   -2318 1.47628666976549
761   -2320 1.47634178441866
762   -2322 1.47640626197946
763   -2324 1.47647367980355
764   -2326 1.47654420112269
765   -2328 1.47661693748934
766   -2330 1.47668220577778
767   -2332 1.47670897421522
768   -2334 1.47661953024202
769   -2336 1.47640699456743
770   -2338 1.47628918090598
771   -2340 1.47627922381635
772   -2342 1.47629610568572
773   -2344 1.47633775742674
774   -2346 1.47639668853055
775   -2348 1.47645464076621
776   -2350 1.47650252320800
777   -2352 1.47653396769864
778   -2354 1.47655188224605
779   -2356 1.47656625779288
780   -2358 1.47656342537266
781   -2360 1.47646841808416
782   -2362 1.47627988649258
783   -2364 1.47623361007945
784   -2366 1.47628349602868
785   -2368 1.47634714131595
786   -2370 1.47640579435613
787   -2372 1.47645673781608
788   -2374 1.47650329311272
789   -2376 1.47654473856361
790   -2378 1.47658519751564
791   -2380 1.47662360662062
792   -2382 1.47665509133976
793   -2384 1.47667939867421
794   -2386 1.47668999377568
795   -2388 1.47666832266751
796   -2390 1.47662551968266
797   -2392 1.47661227607686
798   -2394 1.47662326945870
799   -2396 1.47664538468599
800   -2398 1.47667621017793
801   -2400 1.47670840326370
802   -2402 1.47673732384369
803   -2404 1.47676080113293
804   -2406 1.47677566835384
805   -2408 1.47677747426079
806   -2410 1.47675773033081
807   -2412 1.47671176533526
808   -2414 1.47665898774225
809   -2416 1.47662888566870
810   -2418 1.47661609885311
811   -2420 1.47661804906686
812   -2422 1.47663361079607
813   -2424 1.47665615258179
814   -2426 1.47667989702189
815   -2428 1.47670167875450
816   -2430 1.47671889251986
817   -2432 1.47672660033007
818   -2434 1.47672581905542
819   -2436 1.47673588691547
820   -2438 1.47675625346807
821   -2440 1.47677811479011
822   -2442 1.47680201299431
823   -2444 1.47682690323960
824   -2446 1.47685134280847
825   -2448 1.47687468838441
826   -2450 1.47689577948214
827   -2452 1.47691461221252
828   -2454 1.47693121483650
829   -2456 1.47694483659804
830   -2458 1.47695706614166
831   -2460 1.47696841245298
832   -2462 1.47698092980728
833   -2464 1.47699165258073
834   -2466 1.47699892231642
835   -2468 1.47700518850467
836   -2470 1.47701681917772
837   -2472 1.47703371133993
838   -2474 1.47705172804537
839   -2476 1.47706963205611
840   -2478 1.47708839046513
841   -2480 1.47710595182822
842   -2482 1.47712353018048
843   -2484 1.47714045399508
844   -2486 1.47715526898974
845   -2488 1.47716785931325
846   -2490 1.47717746351979
847   -2492 1.47718774105152
848   -2494 1.47720108087222
849   -2496 1.47721116876733
850   -2498 1.47720908793559
851   -2500 1.47721975153658
852   -2502 1.47724153102797
853   -2504 1.47726842063502
854   -2506 1.47729164115863
855   -2508 1.47729793164711
856   -2510 1.47728751673010
857   -2512 1.47728595976167
858   -2514 1.47730346177822
859   -2516 1.47732866245654
860   -2518 1.47735480680865
861   -2520 1.47737778321487
862   -2522 1.47739640465051
863   -2524 1.47741388745850
864   -2526 1.47743674344455
865   -2528 1.47746686662636
866   -2530 1.47749859543051
867   -2532 1.47752798101785
868   -2534 1.47755196992726
869   -2536 1.47757059463727
870   -2538 1.47758008928483
871   -2540 1.47756988987874
872   -2542 1.47755427512999
873   -2544 1.47756361259663
874   -2546 1.47758639316885
875   -2548 1.47760210701986
876   -2550 1.47761136589934
877   -2552 1.47762359682751
878   -2554 1.47764677677048
879   -2556 1.47767474710701
880   -2558 1.47770246497527
881   -2560 1.47773042785198
882   -2562 1.47776361629940
883   -2564 1.47779998470837
884   -2566 1.47783821733131
885   -2568 1.47787806111451
886   -2570 1.47792064098960
887   -2572 1.47796488547863
888   -2574 1.47800956216730
889   -2576 1.47805314833494
890   -2578 1.47809883475004
891   -2580 1.47814186001493
892   -2582 1.47815997256423
893   -2584 1.47809360441189
894   -2586 1.47790866325303
895   -2588 1.47773400000000
896   -2590 1.47767480433235
897   -2592 1.47770364229106
898   -2594 1.47776662663767
899   -2596 1.47783459041379
900   -2598 1.47789713249225
901   -2600 1.47795076443856
902   -2602 1.47798212010995
903   -2604 1.47796839500240
904   -2606 1.47793022585363
905   -2608 1.47793384355028
906   -2610 1.47794564701586
907   -2612 1.47795047312967
908   -2614 1.47797539539217
909   -2616 1.47801274460181
910   -2618 1.47805108460942
911   -2620 1.47808604011951
912   -2622 1.47811663248782
913   -2624 1.47814577420760
914   -2626 1.47817100891022
915   -2628 1.47819185746701
916   -2630 1.47820200756835
917   -2632 1.47819509341812
918   -2634 1.47818069648523
919   -2636 1.47819937787229
920   -2638 1.47823535219485
921   -2640 1.47827081637876
922   -2642 1.47830404351228
923   -2644 1.47832995386373
924   -2646 1.47835243329009
925   -2648 1.47837673632241
926   -2650 1.47840422324866
927   -2652 1.47843503880664
928   -2654 1.47846525754672
929   -2656 1.47849229804531
930   -2658 1.47851619218461
931   -2660 1.47854228554823
932   -2662 1.47857183053155
933   -2664 1.47860675830984
934   -2666 1.47864502580642
935   -2668 1.47868442524625
936   -2670 1.47871645234617
937   -2672 1.47872844710197
938   -2674 1.47874644966096
939   -2676 1.47878367512841
940   -2678 1.47882577091271
941   -2680 1.47886734102623
942   -2682 1.47890576030499
943   -2684 1.47894410487476
944   -2686 1.47898246676081
945   -2688 1.47902078634990
946   -2690 1.47905697663379
947   -2692 1.47909348635787
948   -2694 1.47913253241860
949   -2696 1.47917713682535
950   -2698 1.47922494363690
951   -2700 1.47927370219512
952   -2702 1.47932350132184
953   -2704 1.47937477829841
954   -2706 1.47942977955203
955   -2708 1.47948662996503
956   -2710 1.47954572465315
957   -2712 1.47960899951982
958   -2714 1.47967582145469
959   -2716 1.47974783424700
960   -2718 1.47982686383801
961   -2720 1.47991434869689
962   -2722 1.48001161889876
963   -2724 1.48011529035864
964   -2726 1.48021743640732
965   -2728 1.48029271013490
966   -2730 1.48028469924544
967   -2732 1.48009333694647
968   -2734 1.47968604519118
969   -2736 1.47926069770098
970   -2738 1.47904382199068
971   -2740 1.47903137276969
972   -2742 1.47912234371550
973   -2744 1.47924475242006
974   -2746 1.47936896123536
975   -2748 1.47948547683776
976   -2750 1.47959346670195
977   -2752 1.47969391424782
978   -2754 1.47978696270901
979   -2756 1.47987478298896
980   -2758 1.47995758449142
981   -2760 1.48003727324589
982   -2762 1.48011924219933
983   -2764 1.48019913384442
984   -2766 1.48027922637338
985   -2768 1.48035769798330
986   -2770 1.48043385800477
987   -2772 1.48050725415469
988   -2774 1.48057567058368
989   -2776 1.48065105935983
990   -2778 1.48072266299449
991   -2780 1.48079977415031
992   -2782 1.48088053164822
993   -2784 1.48096687278145
994   -2786 1.48105512159158
995   -2788 1.48114937559786
996   -2790 1.48124466747644
997   -2792 1.48134118881539
998   -2794 1.48144014454067
999   -2796 1.48153308521599
1000   -2798 1.48162875830237
1001   -2800 1.48173023207917
1002   -2802 1.48183567152155
1003   -2804 1.48193764434860
1004   -2806 1.48203772197889
1005   -2808 1.48213332822876
1006   -2810 1.48221893030834
1007   -2812 1.48230128068059
1008   -2814 1.48241543210576
1009   -2816 1.48256188329700
1010   -2818 1.48272146386266
1011   -2820 1.48288593713105
1012   -2822 1.48303146156846
1013   -2824 1.48316535466125
1014   -2826 1.48333287967432
1015   -2828 1.48353886468435
1016   -2830 1.48376233940652
1017   -2832 1.48399372362724
1018   -2834 1.48422859660869
1019   -2836 1.48446914811588
1020   -2838 1.48472335986644
1021   -2840 1.48498891752954
1022   -2842 1.48526978967144
1023   -2844 1.48556244410920
1024   -2846 1.48585030113417
1025   -2848 1.48611635747129
1026   -2850 1.48631703683473
1027   -2852 1.48642616794096
1028   -2854 1.48638931900690
1029   -2856 1.48617288132870
1030   -2858 1.48578055258264
1031   -2860 1.48528254616381
1032   -2862 1.48477473720320
1033   -2864 1.48431306898547
1034   -2866 1.48390294869478
1035   -2868 1.48352758708888
1036   -2870 1.48315923324289
1037   -2872 1.48276317318322
1038   -2874 1.48233036174381
1039   -2876 1.48190033197863
1040   -2878 1.48156989857095
1041   -2880 1.48135829837939
1042   -2882 1.48127046426508
1043   -2884 1.48129224687463
1044   -2886 1.48142276034719
1045   -2888 1.48166152381514
1046   -2890 1.48199469355260
1047   -2892 1.48241286263108
1048   -2894 1.48290615618025
1049   -2896 1.48346174779728
1050   -2898 1.48406068695481
1051   -2900 1.48469749104873
1052   -2902 1.48534901849277
1053   -2904 1.48600451268347
1054   -2906 1.48663330502903
1055   -2908 1.48716049340272
1056   -2910 1.48749427432860
1057   -2912 1.48745634999468
1058   -2914 1.48687918789111
1059   -2916 1.48564647709805
1060   -2918 1.48378138421067
1061   -2920 1.48160842259702
1062   -2922 1.47963902212310
1063   -2924 1.47817563267450
1064   -2926 1.47725366173650
1065   -2928 1.47680009878321
1066   -2930 1.47670600337876
1067   -2932 1.47683592850229
1068   -2934 1.47707848906770
1069   -2936 1.47736368012666
1070   -2938 1.47761998820843
1071   -2940 1.47780991969196
1072   -2942 1.47790616610153
1073   -2944 1.47789352215007
1074   -2946 1.47776642994662
1075   -2948 1.47755303644224
1076   -2950 1.47732098571495
1077   -2952 1.47710982305520
1078   -2954 1.47692656410946
1079   -2956 1.47677865708199
1080   -2958 1.47664389769752
1081   -2960 1.47653950030308
1082   -2962 1.47652380859929
1083   -2964 1.47671143784641
1084   -2966 1.47706590558488
1085   -2968 1.47742684312635
1086   -2970 1.47770009243870
1087   -2972 1.47786247321149
1088   -2974 1.47794741384886
1089   -2976 1.47797899370123
1090   -2978 1.47798223648454
1091   -2980 1.47795004028588
1092   -2982 1.47790147416153
1093   -2984 1.47795735389707
1094   -2986 1.47814496927765
1095   -2988 1.47844692443850
1096   -2990 1.47884918651108
1097   -2992 1.47932344250011
1098   -2994 1.47986306802417
1099   -2996 1.48043188046815
1100   -2998 1.48097537656156
1101   -3000 1.48138517100778
1102   -3002 1.48162356419426
1103   -3004 1.48185212024737
1104   -3006 1.48228440440630
1105   -3008 1.48297178567222
1106   -3010 1.48385673952528
1107   -3012 1.48487993544870
1108   -3014 1.48595665242293
1109   -3016 1.48695938009756
1110   -3018 1.48767468298278
1111   -3020 1.48765524108674
1112   -3022 1.48618132554454
1113   -3024 1.48268461964750
1114   -3026 1.47762082421352
1115   -3028 1.47232727506644
1116   -3030 1.46776463943145
1117   -3032 1.46440878935946
1118   -3034 1.46247197560802
1119   -3036 1.46196769309556
1120   -3038 1.46253947223186
1121   -3040 1.46367382189299
1122   -3042 1.46491417717244
1123   -3044 1.46601563099238
1124   -3046 1.46697686500990
1125   -3048 1.46781464802766
1126   -3050 1.46847402904648
1127   -3052 1.46887853308036
1128   -3054 1.46895675121188
1129   -3056 1.46875323941201
1130   -3058 1.46834302704055
1131   -3060 1.46771282666113
1132   -3062 1.46675300487368
1133   -3064 1.46553703632205
1134   -3066 1.46435734374414
1135   -3068 1.46364333274111
1136   -3070 1.46361967631567
1137   -3072 1.46416270683630
1138   -3074 1.46500589551713
1139   -3076 1.46593266001109
1140   -3078 1.46681497080407
1141   -3080 1.46754108115619
1142   -3082 1.46785690887919
1143   -3084 1.46726760945338
1144   -3086 1.46533247163430
1145   -3088 1.46268292062625
1146   -3090 1.46120303549580
1147   -3092 1.46134478479294
1148   -3094 1.46221369798373
1149   -3096 1.46321247938499
1150   -3098 1.46411661764251
1151   -3100 1.46482369285261
1152   -3102 1.46525636685728
1153   -3104 1.46533581524600
1154   -3106 1.46519098442260
1155   -3108 1.46516907412280
1156   -3110 1.46538060689336
1157   -3112 1.46568276755924
1158   -3114 1.46596931336371
1159   -3116 1.46619739482536
1160   -3118 1.46639101964608
1161   -3120 1.46661054944789
1162   -3122 1.46687049156442
1163   -3124 1.46713909721892
1164   -3126 1.46740251735782
1165   -3128 1.46765965900548
1166   -3130 1.46790595336806
1167   -3132 1.46813448944673
1168   -3134 1.46834723054744
1169   -3136 1.46854553575727
1170   -3138 1.46872578997706
1171   -3140 1.46889606787041
1172   -3142 1.46905361684206
1173   -3144 1.46920788445114
1174   -3146 1.46935155893370
1175   -3148 1.46948926642375
1176   -3150 1.46961711994727
1177   -3152 1.46973932284344
1178   -3154 1.46985771524525
1179   -3156 1.46997084147302
1180   -3158 1.47008125375275
1181   -3160 1.47018834504960
1182   -3162 1.47028749194193
1183   -3164 1.47037561555632
1184   -3166 1.47044733671974
1185   -3168 1.47049523638823
1186   -3170 1.47053287904761
1187   -3172 1.47059397007388
1188   -3174 1.47068028883230
1189   -3176 1.47077100092966
1190   -3178 1.47085834352883
1191   -3180 1.47094237966502
1192   -3182 1.47102127140257
1193   -3184 1.47109691171596
1194   -3186 1.47116815404231
1195   -3188 1.47123618567128
1196   -3190 1.47130184743484
1197   -3192 1.47136511381017
1198   -3194 1.47142734846007
1199   -3196 1.47148851688128
1200   -3198 1.47154755038698
1201   -3200 1.47160533014890
1202   -3202 1.47166012795457
1203   -3204 1.47171224992608
1204   -3206 1.47176315489772
1205   -3208 1.47181395071669
1206   -3210 1.47186466789480
1207   -3212 1.47191661577937
1208   -3214 1.47196738520913
1209   -3216 1.47201707857991
1210   -3218 1.47206588870145
1211   -3220 1.47211365240659
1212   -3222 1.47215936522226
1213   -3224 1.47220500735251
1214   -3226 1.47225033231421
1215   -3228 1.47229424065224
1216   -3230 1.47233733691715
1217   -3232 1.47237980638024
1218   -3234 1.47242122252104
1219   -3236 1.47246173766460
1220   -3238 1.47250090500984
1221   -3240 1.47253933121953
1222   -3242 1.47257666559418
1223   -3244 1.47261289353408
1224   -3246 1.47264942225475
1225   -3248 1.47268468000033
1226   -3250 1.47271896562139
1227   -3252 1.47275329822459
1228   -3254 1.47278723826016
1229   -3256 1.47281957643892
1230   -3258 1.47285086138010
1231   -3260 1.47288192451579
1232   -3262 1.47291300000000
1233   -3264 1.47294399234620
1234   -3266 1.47297519999867
1235   -3268 1.47300456597122
1236   -3270 1.47303306949960
1237   -3272 1.47306229798834
1238   -3274 1.47309029819990
1239   -3276 1.47311725100397
1240   -3278 1.47314519229524
1241   -3280 1.47317191831342
1242   -3282 1.47319904835607
1243   -3284 1.47322480511295
1244   -3286 1.47325068033533
1245   -3288 1.47327558727819
1246   -3290 1.47330149637565
1247   -3292 1.47332523279087
1248   -3294 1.47335025198767
1249   -3296 1.47337510971327
1250   -3298 1.47339905996618
1251   -3300 1.47342296954304
1252   -3302 1.47344582202335
1253   -3304 1.47346658074592
1254   -3306 1.47348738493031
1255   -3308 1.47350703202034
1256   -3310 1.47352683574489
1257   -3312 1.47354755048152
1258   -3314 1.47356829450234
1259   -3316 1.47358903215508
1260   -3318 1.47360880465673
1261   -3320 1.47362855417648
1262   -3322 1.47364734936801
1263   -3324 1.47366547803442
1264   -3326 1.47368305009043
1265   -3328 1.47369959979993
1266   -3330 1.47371718446385
1267   -3332 1.47373378124277
1268   -3334 1.47375068696817
1269   -3336 1.47376844875514
1270   -3338 1.47378666053286
1271   -3340 1.47380404591194
1272   -3342 1.47382276516742
1273   -3344 1.47384040963255
1274   -3346 1.47385904663877
1275   -3348 1.47387858239480
1276   -3350 1.47389752320424
1277   -3352 1.47391752328576
1278   -3354 1.47393606713734
1279   -3356 1.47395488874822
1280   -3358 1.47397353990369
1281   -3360 1.47399234620080
1282   -3362 1.47401055721405
1283   -3364 1.47402826981442
1284   -3366 1.47404508175359
1285   -3368 1.47406141829832
1286   -3370 1.47407704342040
1287   -3372 1.47409059132764
1288   -3374 1.47410503032631
1289   -3376 1.47411782704824
1290   -3378 1.47413081528590
1291   -3380 1.47414326557675
1292   -3382 1.47415571156753
1293   -3384 1.47416717298263
1294   -3386 1.47417841575972
1295   -3388 1.47418915024028
1296   -3390 1.47419998707473
1297   -3392 1.47421190062571
1298   -3394 1.47422443429139
1299   -3396 1.47423683452363
1300   -3398 1.47425033505022
1301   -3400 1.47426480528893
1302   -3402 1.47427826680738
1303   -3404 1.47429170418534
1304   -3406 1.47430477066294
1305   -3408 1.47431835512023
1306   -3410 1.47433193595530
1307   -3412 1.47434642118416
1308   -3414 1.47436087920127
1309   -3416 1.47437532634686
1310   -3418 1.47439018109776
1311   -3420 1.47440515622779
1312   -3422 1.47442044328205
1313   -3424 1.47443606103306
1314   -3426 1.47444964436527
1315   -3428 1.47446294847254
1316   -3430 1.47447439134230
1317   -3432 1.47448416869267
1318   -3434 1.47449072019392
1319   -3436 1.47449591374259
1320   -3438 1.47449903792179
1321   -3440 1.47449993449953
1322   -3442 1.47450135456237
1323   -3444 1.47450458795612
1324   -3446 1.47450875108451
1325   -3448 1.47451445884208
1326   -3450 1.47452484258401
1327   -3452 1.47453827241797
1328   -3454 1.47455172262247
1329   -3456 1.47456517206426
1330   -3458 1.47457860151852
1331   -3460 1.47459192059468
1332   -3462 1.47460450298261
1333   -3464 1.47461696547474
1334   -3466 1.47462839859281
1335   -3468 1.47463987388367
1336   -3470 1.47465188200346
1337   -3472 1.47466266389847
1338   -3474 1.47467409691578
1339   -3476 1.47468473670609
1340   -3478 1.47469608306209
1341   -3480 1.47470752002888
1342   -3482 1.47471885889080
1343   -3484 1.47473141107054
1344   -3486 1.47474321664113
1345   -3488 1.47475540477105
1346   -3490 1.47476577603289
1347   -3492 1.47477517654069
1348   -3494 1.47478437686762
1349   -3496 1.47479375265910
1350   -3498 1.47480352784050
1351   -3500 1.47481386454326
1352   -3502 1.47482540254891
1353   -3504 1.47483686546170
1354   -3506 1.47484922964243
1355   -3508 1.47486054239155
1356   -3510 1.47487118057395
1357   -3512 1.47488161773392
1358   -3514 1.47489155648764
1359   -3516 1.47489779215940
1360   -3518 1.47490199751604
1361   -3520 1.47490515212000
1362   -3522 1.47490858576642
1363   -3524 1.47491589352572
1364   -3526 1.47492563809847
1365   -3528 1.47493721829251
1366   -3530 1.47494965183138
1367   -3532 1.47496209482301
1368   -3534 1.47497548127118
1369   -3536 1.47498901026331
1370   -3538 1.47500250064110
1371   -3540 1.47501334375007
1372   -3542 1.47502155988466
1373   -3544 1.47502590855583
1374   -3546 1.47502798788122
1375   -3548 1.47502908741446
1376   -3550 1.47503013111600
1377   -3552 1.47503152066431
1378   -3554 1.47503369017078
1379   -3556 1.47503596161309
1380   -3558 1.47503994401260
1381   -3560 1.47504720780187
1382   -3562 1.47505757685400
1383   -3564 1.47506921753979
1384   -3566 1.47508222835820
1385   -3568 1.47509583612677
1386   -3570 1.47510943592653
1387   -3572 1.47512299244722
1388   -3574 1.47513544229862
1389   -3576 1.47514788646150
1390   -3578 1.47515877336465
1391   -3580 1.47516830010454
1392   -3582 1.47517301097796
1393   -3584 1.47516730096467
1394   -3586 1.47516098788624
1395   -3588 1.47515999912529
1396   -3590 1.47516344979552
1397   -3592 1.47516995891151
1398   -3594 1.47517893497533
1399   -3596 1.47518949533554
1400   -3598 1.47519986950803
1401   -3600 1.47520815315630
1402   -3602 1.47521639684906
1403   -3604 1.47522677803691
1404   -3606 1.47523756307109
1405   -3608 1.47524905817071
1406   -3610 1.47526235394740
1407   -3612 1.47527689090454
1408   -3614 1.47529241512157
1409   -3616 1.47530577596310
1410   -3618 1.47531550675526
1411   -3620 1.47531807217956
1412   -3622 1.47531330897623
1413   -3624 1.47530520668685
1414   -3626 1.47530099713781
1415   -3628 1.47530419555884
1416   -3630 1.47531292297539
1417   -3632 1.47532682994681
1418   -3634 1.47534230166646
1419   -3636 1.47535817866622
1420   -3638 1.47537270802382
1421   -3640 1.47538306617453
1422   -3642 1.47538491013479
1423   -3644 1.47537808441815
1424   -3646 1.47536152773521
1425   -3648 1.47533829820411
1426   -3650 1.47531127187157
1427   -3652 1.47528831452931
1428   -3654 1.47527173292062
1429   -3656 1.47526400688559
1430   -3658 1.47526538002071
1431   -3660 1.47527196497124
1432   -3662 1.47528332467912
1433   -3664 1.47529547167214
1434   -3666 1.47530792033597
1435   -3668 1.47531940264238
1436   -3670 1.47532950934428
1437   -3672 1.47533752543273
1438   -3674 1.47534264633859
1439   -3676 1.47534493660391
1440   -3678 1.47534793834948
1441   -3680 1.47535101048592
1442   -3682 1.47535512741537
1443   -3684 1.47536061029192
1444   -3686 1.47536677517540
1445   -3688 1.47537422152313
1446   -3690 1.47538349069671
1447   -3692 1.47539466802181
1448   -3694 1.47540614815786
1449   -3696 1.47541766757740
1450   -3698 1.47543103564364
1451   -3700 1.47544309274752
1452   -3702 1.47545168948545
1453   -3704 1.47545396563826
1454   -3706 1.47545207507319
1455   -3708 1.47544797484465
1456   -3710 1.47544704753668
1457   -3712 1.47545189667326
1458   -3714 1.47545995926878
1459   -3716 1.47547095072698
1460   -3718 1.47548066602429
1461   -3720 1.47548697893292
1462   -3722 1.47548796009613
1463   -3724 1.47548478177503
1464   -3726 1.47547947641639
1465   -3728 1.47547863259801
1466   -3730 1.47548174475524
1467   -3732 1.47548778078125
1468   -3734 1.47549403635331
1469   -3736 1.47550125363908
1470   -3738 1.47550934180435
1471   -3740 1.47551683167599
1472   -3742 1.47552688594006
1473   -3744 1.47553729090548
1474   -3746 1.47554678198008
1475   -3748 1.47555713325216
1476   -3750 1.47556659302775
1477   -3752 1.47557669459374
1478   -3754 1.47558647315562
1479   -3756 1.47559529768016
1480   -3758 1.47560360009648
1481   -3760 1.47561091508282
1482   -3762 1.47561609735508
1483   -3764 1.47562029070796
1484   -3766 1.47562441780911
1485   -3768 1.47563306550754
1486   -3770 1.47564405166112
1487   -3772 1.47565552291783
1488   -3774 1.47566694809298
1489   -3776 1.47567830857219
1490   -3778 1.47568755133462
1491   -3780 1.47569463620025
1492   -3782 1.47569547492168
1493   -3784 1.47568951387041
1494   -3786 1.47567835935080
1495   -3788 1.47566593929693
1496   -3790 1.47566101977927
1497   -3792 1.47566354952827
1498   -3794 1.47567185732029
1499   -3796 1.47568321348889
1500   -3798 1.47569529254648
1501   -3800 1.47570772530959
1502   -3802 1.47571809962768
1503   -3804 1.47572648401529
1504   -3806 1.47573134192597
1505   -3808 1.47573352027040
1506   -3810 1.47573292361008
1507   -3812 1.47573299326894
1508   -3814 1.47573398673360
1509   -3816 1.47573817632205
1510   -3818 1.47574527524272
1511   -3820 1.47575277086820
1512   -3822 1.47575967350287
1513   -3824 1.47576470303911
1514   -3826 1.47576975528735
1515   -3828 1.47577698612879
1516   -3830 1.47578309783396
1517   -3832 1.47578829704916
1518   -3834 1.47579095824278
1519   -3836 1.47578839924332
1520   -3838 1.47578153880935
1521   -3840 1.47577325828602
1522   -3842 1.47576695658169
1523   -3844 1.47576181472562
1524   -3846 1.47575638975092
1525   -3848 1.47574893511221
1526   -3850 1.47574067656252
1527   -3852 1.47573418960490
1528   -3854 1.47573201348304
1529   -3856 1.47573609448654
1530   -3858 1.47574340076582
1531   -3860 1.47575406506568
1532   -3862 1.47576509594980
1533   -3864 1.47577344240290
1534   -3866 1.47577782298125
1535   -3868 1.47577704417063
1536   -3870 1.47576978782061
1537   -3872 1.47576167888626
1538   -3874 1.47575983530599
1539   -3876 1.47576615931522
1540   -3878 1.47577603616264
1541   -3880 1.47578749602566
1542   -3882 1.47579899049744
1543   -3884 1.47580829754193
1544   -3886 1.47581553191111
1545   -3888 1.47582044576450
1546   -3890 1.47582361486597
1547   -3892 1.47582488670530
1548   -3894 1.47582691190401
1549   -3896 1.47582798767520
1550   -3898 1.47583005776107
1551   -3900 1.47583333559154
1552   -3902 1.47583798052018
1553   -3904 1.47584349792097
1554   -3906 1.47584878503057
1555   -3908 1.47585104104660
1556   -3910 1.47584786442429
1557   -3912 1.47584503864650
1558   -3914 1.47584772763597
1559   -3916 1.47585513011730
1560   -3918 1.47586161194681
1561   -3920 1.47586680114244
1562   -3922 1.47586801742881
1563   -3924 1.47586285228063
1564   -3926 1.47585768990955
1565   -3928 1.47585725672200
1566   -3930 1.47586502926929
1567   -3932 1.47587638834149
1568   -3934 1.47588758559686
1569   -3936 1.47589600406114
1570   -3938 1.47590331354213
1571   -3940 1.47591060804636
1572   -3942 1.47591789591720
1573   -3944 1.47592457142526
1574   -3946 1.47593081059303
1575   -3948 1.47593398581283
1576   -3950 1.47593295565452
1577   -3952 1.47592878275285
1578   -3954 1.47592684349640
1579   -3956 1.47592986168501
1580   -3958 1.47593628896516
1581   -3960 1.47594351825970
1582   -3962 1.47595186222678
1583   -3964 1.47595911320580
1584   -3966 1.47596854991323
1585   -3968 1.47597712871599
1586   -3970 1.47598746992252
1587   -3972 1.47600004422535
1588   -3974 1.47601337421929
1589   -3976 1.47602692154134
1590   -3978 1.47603405627977
1591   -3980 1.47602817354059
1592   -3982 1.47601874488156
1593   -3984 1.47602563707167
1594   -3986 1.47604367443527
1595   -3988 1.47606327560645
1596   -3990 1.47608304122308
1597   -3992 1.47610269526207
1598   -3994 1.47612262206064
1599   -3996 1.47614078459134
1600   -3998 1.47615752083133
  1 +800 1.44120102496924
  2 +802 1.44244952355793
  3 +804 1.44362241452370
  4 +806 1.44473157548162
  5 +808 1.44576931343185
  6 +810 1.44673515341541
  7 +812 1.44763153740528
  8 +814 1.44849997645288
  9 +816 1.44937159368323
  10 +818 1.45024511061741
  11 +820 1.45109838059394
  12 +822 1.45193180052550
  13 +824 1.45274307737647
  14 +826 1.45353862658166
  15 +828 1.45431614422343
  16 +830 1.45505783090997
  17 +832 1.45575257351567
  18 +834 1.45637393495922
  19 +836 1.45689903981153
  20 +838 1.45730768949019
  21 +840 1.45754105585989
  22 +842 1.45762277914234
  23 +844 1.45763704972226
  24 +846 1.45770974157519
  25 +848 1.45792998369439
  26 +850 1.45831194599516
  27 +852 1.45879214084464
  28 +854 1.45933254646700
  29 +856 1.45988983429307
  30 +858 1.46043988459777
  31 +860 1.46098292821135
  32 +862 1.46151723624776
  33 +864 1.46203872496248
  34 +866 1.46253192223325
  35 +868 1.46297856786196
  36 +870 1.46337643775072
  37 +872 1.46369146339390
  38 +874 1.46394643585616
  39 +876 1.46431343981134
  40 +878 1.46483594897202
  41 +880 1.46543855156632
  42 +882 1.46608462990801
  43 +884 1.46677023178158
  44 +886 1.46750898169590
  45 +888 1.46831763414834
  46 +890 1.46912802427779
  47 +892 1.46954514029358
  48 +894 1.46839331789610
  49 +896 1.46522362501208
  50 +898 1.46324102369024
  51 +900 1.46324805165743
  52 +902 1.46389477313103
  53 +904 1.46460285834673
  54 +906 1.46524189063531
  55 +908 1.46578615865865
  56 +910 1.46624870624222
  57 +912 1.46665117759441
  58 +914 1.46703266934571
  59 +916 1.46740765502925
  60 +918 1.46779668973951
  61 +920 1.46820189802559
  62 +922 1.46861141696830
  63 +924 1.46901759517687
  64 +926 1.46935992609941
  65 +928 1.46951316452951
  66 +930 1.46945198189589
  67 +932 1.46950773718789
  68 +934 1.46980252488385
  69 +936 1.47016397014931
  70 +938 1.47050527825284
  71 +940 1.47079802225791
  72 +942 1.47102956241248
  73 +944 1.47121559715866
  74 +946 1.47137193902005
  75 +948 1.47152008803324
  76 +950 1.47167672882319
  77 +952 1.47187041329055
  78 +954 1.47208448275609
  79 +956 1.47229737949647
  80 +958 1.47250268786501
  81 +960 1.47267011513556
  82 +962 1.47277605897765
  83 +964 1.47281096169045
  84 +966 1.47283377833869
  85 +968 1.47288521062562
  86 +970 1.47300680592029
  87 +972 1.47318336590741
  88 +974 1.47338081764773
  89 +976 1.47357969584368
  90 +978 1.47371821017195
  91 +980 1.47375527316737
  92 +982 1.47374243519460
  93 +984 1.47381322933363
  94 +986 1.47398487555170
  95 +988 1.47420629302573
  96 +990 1.47448130861459
  97 +992 1.47481507770761
  98 +994 1.47518229617302
  99 +996 1.47557023171639
  100 +998 1.47596326572828
  101 +1000 1.47630080652934
  102 +1002 1.47636823234471
  103 +1004 1.47636996678396
  104 +1006 1.47689524896944
  105 +1008 1.47750032220134
  106 +1010 1.47819158796836
  107 +1012 1.47897505869564
  108 +1014 1.47986167058547
  109 +1016 1.48089513800264
  110 +1018 1.48214271193312
  111 +1020 1.48362438976875
  112 +1022 1.48502767979268
  113 +1024 1.48723564000764
  114 +1026 1.49092289691198
  115 +1028 1.49396375951509
  116 +1030 1.47873935405011
  117 +1032 1.46178488502145
  118 +1034 1.46614728364263
  119 +1036 1.46944972756204
  120 +1038 1.47076139801307
  121 +1040 1.47051860247504
  122 +1042 1.46925108082617
  123 +1044 1.46777888639623
  124 +1046 1.46677062217283
  125 +1048 1.46644104430282
  126 +1050 1.46666085838594
  127 +1052 1.46724995592262
  128 +1054 1.46804818971542
  129 +1056 1.46897681608261
  130 +1058 1.46995585496974
  131 +1060 1.47098590895262
  132 +1062 1.47206714530921
  133 +1064 1.47321734998274
  134 +1066 1.47445175619764
  135 +1068 1.47579194531028
  136 +1070 1.47721681438477
  137 +1072 1.47863578920406
  138 +1074 1.47989036409651
  139 +1076 1.48086017571181
  140 +1078 1.48069474784801
  141 +1080 1.47616731467815
  142 +1082 1.46390771869497
  143 +1084 1.45570223896581
  144 +1086 1.45597971475891
  145 +1088 1.45836941934247
  146 +1090 1.46066235559752
  147 +1092 1.46255873201846
  148 +1094 1.46411051824312
  149 +1096 1.46540793776881
  150 +1098 1.46651204425965
  151 +1100 1.46743001960627
  152 +1102 1.46810891059625
  153 +1104 1.46835826348699
  154 +1106 1.46762316195694
  155 +1108 1.46618573784309
  156 +1110 1.46572358542781
  157 +1112 1.46614920302751
  158 +1114 1.46684472613418
  159 +1116 1.46754366818093
  160 +1118 1.46816766240122
  161 +1120 1.46871860517754
  162 +1122 1.46920770699094
  163 +1124 1.46965073082635
  164 +1126 1.47005259957817
  165 +1128 1.47040212564529
  166 +1130 1.47068773768668
  167 +1132 1.47096001810126
  168 +1134 1.47125261448772
  169 +1136 1.47154891832636
  170 +1138 1.47183699189280
  171 +1140 1.47209800955853
  172 +1142 1.47233456778191
  173 +1144 1.47257573473017
  174 +1146 1.47283356711807
  175 +1148 1.47307259446091
  176 +1150 1.47326381831914
  177 +1152 1.47336996150258
  178 +1154 1.47330710459724
  179 +1156 1.47293509477181
  180 +1158 1.47266594765858
  181 +1160 1.47259707273045
  182 +1162 1.47267982619196
  183 +1164 1.47288581951866
  184 +1166 1.47317564562733
  185 +1168 1.47355761342796
  186 +1170 1.47402209612147
  187 +1172 1.47459197223784
  188 +1174 1.47529073492465
  189 +1176 1.47579201984062
  190 +1178 1.47389452829121
  191 +1180 1.46944888964386
  192 +1182 1.46919538008765
  193 +1184 1.46993706618235
  194 +1186 1.47058584953654
  195 +1188 1.47109418040909
  196 +1190 1.47148385016616
  197 +1192 1.47177356227783
  198 +1194 1.47196611004565
  199 +1196 1.47207728619391
  200 +1198 1.47220096862104
  201 +1200 1.47245042725556
  202 +1202 1.47283662225685
  203 +1204 1.47330431122777
  204 +1206 1.47375342391676
  205 +1208 1.47385318037376
  206 +1210 1.47280027515132
  207 +1212 1.47140252001622
  208 +1214 1.47159489093342
  209 +1216 1.47205516262945
  210 +1218 1.47243159969193
  211 +1220 1.47273916940180
  212 +1222 1.47301272972689
  213 +1224 1.47326393439881
  214 +1226 1.47349889542765
  215 +1228 1.47371659199003
  216 +1230 1.47393059180901
  217 +1232 1.47413378656172
  218 +1234 1.47433469964923
  219 +1236 1.47453039235071
  220 +1238 1.47471647903353
  221 +1240 1.47488491964895
  222 +1242 1.47502851521336
  223 +1244 1.47512495593972
  224 +1246 1.47514408931247
  225 +1248 1.47505892212860
  226 +1250 1.47489972136187
  227 +1252 1.47484106680061
  228 +1254 1.47493923662727
  229 +1256 1.47509846252746
  230 +1258 1.47526567770392
  231 +1260 1.47542057167793
  232 +1262 1.47557439533574
  233 +1264 1.47572116951863
  234 +1266 1.47586745130108
  235 +1268 1.47601147334394
  236 +1270 1.47614701936603
  237 +1272 1.47627015399601
  238 +1274 1.47638091039797
  239 +1276 1.47648361938200
  240 +1278 1.47658183373250
  241 +1280 1.47668313548634
  242 +1282 1.47679959880658
  243 +1284 1.47693261142928
  244 +1286 1.47707297484201
  245 +1288 1.47722283448259
  246 +1290 1.47738070554226
  247 +1292 1.47754337420682
  248 +1294 1.47770716341215
  249 +1296 1.47786028165421
  250 +1298 1.47798887584323
  251 +1300 1.47808934206014
  252 +1302 1.47818243145329
  253 +1304 1.47830827158180
  254 +1306 1.47849364056186
  255 +1308 1.47871221118251
  256 +1310 1.47885808674696
  257 +1312 1.47873010242650
  258 +1314 1.47845803582890
  259 +1316 1.47844930632483
  260 +1318 1.47861179184706
  261 +1320 1.47881460317012
  262 +1322 1.47902291732804
  263 +1324 1.47922066571969
  264 +1326 1.47941412833592
  265 +1328 1.47959210849367
  266 +1330 1.47973167816960
  267 +1332 1.47972691925884
  268 +1334 1.47975105896865
  269 +1336 1.47993512250321
  270 +1338 1.48014837613309
  271 +1340 1.48037360725078
  272 +1342 1.48060038757184
  273 +1344 1.48082753333001
  274 +1346 1.48104968129957
  275 +1348 1.48126553234897
  276 +1350 1.48148716441519
  277 +1352 1.48173647624861
  278 +1354 1.48200446828695
  279 +1356 1.48227599517218
  280 +1358 1.48252791950314
  281 +1360 1.48276324869435
  282 +1362 1.48303458306896
  283 +1364 1.48338223264961
  284 +1366 1.48379902481358
  285 +1368 1.48427223592360
  286 +1370 1.48482960284728
  287 +1372 1.48552801978829
  288 +1374 1.48627546417750
  289 +1376 1.48651700069497
  290 +1378 1.48432599213190
  291 +1380 1.47977968972337
  292 +1382 1.47800355097223
  293 +1384 1.47805316502072
  294 +1386 1.47842143243600
  295 +1388 1.47890024839336
  296 +1390 1.47940651645865
  297 +1392 1.47991712903019
  298 +1394 1.48041754934745
  299 +1396 1.48089750917415
  300 +1398 1.48135158724828
  301 +1400 1.48179771126525
  302 +1402 1.48224069922095
  303 +1404 1.48266579602562
  304 +1406 1.48305944158359
  305 +1408 1.48342298716122
  306 +1410 1.48379030750588
  307 +1412 1.48419035949659
  308 +1414 1.48461342812701
  309 +1416 1.48505164072948
  310 +1418 1.48548005566484
  311 +1420 1.48588588173361
  312 +1422 1.48626036521862
  313 +1424 1.48659663343317
  314 +1426 1.48690837523274
  315 +1428 1.48726752634633
  316 +1430 1.48775649947673
  317 +1432 1.48841619746365
  318 +1434 1.48924758721438
  319 +1436 1.49022965011215
  320 +1438 1.49126109208233
  321 +1440 1.49220157896289
  322 +1442 1.49274786168208
  323 +1444 1.49275436842747
  324 +1446 1.49244040803637
  325 +1448 1.49203506779732
  326 +1450 1.49142867984501
  327 +1452 1.49040469923150
  328 +1454 1.48888698396754
  329 +1456 1.48687784303199
  330 +1458 1.48442850436533
  331 +1460 1.48174723159373
  332 +1462 1.47906693249971
  333 +1464 1.47667955286596
  334 +1466 1.47482397028080
  335 +1468 1.47364425598396
  336 +1470 1.47319928261846
  337 +1472 1.47339047699181
  338 +1474 1.47411629804730
  339 +1476 1.47533374680842
  340 +1478 1.47696195971213
  341 +1480 1.47908527215456
  342 +1482 1.48180866451580
  343 +1484 1.48531763958917
  344 +1486 1.48994928684771
  345 +1488 1.49499065429219
  346 +1490 1.50119515596543
  347 +1492 1.50990378628749
  348 +1494 1.51196694565470
  349 +1496 1.44560795826024
  350 +1498 1.41456003179507
  351 +1500 1.42568725767340
  352 +1502 1.43509242814603
  353 +1504 1.44179871660811
  354 +1506 1.44669596130319
  355 +1508 1.45033176716821
  356 +1510 1.45318682655572
  357 +1512 1.45545228048253
  358 +1514 1.45731921509841
  359 +1516 1.45894932377219
  360 +1518 1.46041227592838
  361 +1520 1.46176173499470
  362 +1522 1.46244384736929
  363 +1524 1.46122289585454
  364 +1526 1.46043285810887
  365 +1528 1.46128161485975
  366 +1530 1.46226970833946
  367 +1532 1.46306701307330
  368 +1534 1.46366399954379
  369 +1536 1.46409417910494
  370 +1538 1.46444109535269
  371 +1540 1.46477704752644
  372 +1542 1.46519165698743
  373 +1544 1.46568852566980
  374 +1546 1.46623889292729
  375 +1548 1.46677632998672
  376 +1550 1.46719167293357
  377 +1552 1.46747772804745
  378 +1554 1.46791932189599
  379 +1556 1.46844756268659
  380 +1558 1.46898255634672
  381 +1560 1.46952197034328
  382 +1562 1.46999610489784
  383 +1564 1.47038792635287
  384 +1566 1.47066419723057
  385 +1568 1.47075696992025
  386 +1570 1.47067580679212
  387 +1572 1.47047224204500
  388 +1574 1.47030976437525
  389 +1576 1.47033092176687
  390 +1578 1.47057489703138
  391 +1580 1.47099907306615
  392 +1582 1.47158364170880
  393 +1584 1.47213789972489
  394 +1586 1.47240454856960
  395 +1588 1.47273455527947
  396 +1590 1.47343724065447
  397 +1592 1.47446091811145
  398 +1594 1.47574194447918
  399 +1596 1.47705173230297
  400 +1598 1.47867335885708
  401 +1600 1.48062028756105
  402 +1602 1.48036168324124
  403 +1604 1.47134299168096
  404 +1606 1.45508276794757
  405 +1608 1.45359592019623
  406 +1610 1.45693626090464
  407 +1612 1.45964926448336
  408 +1614 1.46156535264851
  409 +1616 1.46294485069237
  410 +1618 1.46393384687173
  411 +1620 1.46454159062356
  412 +1622 1.46478536173497
  413 +1624 1.46467572345167
  414 +1626 1.46443675069875
  415 +1628 1.46442873304410
  416 +1630 1.46468245393626
  417 +1632 1.46507304958839
  418 +1634 1.46551002264583
  419 +1636 1.46597619450157
  420 +1638 1.46639465048447
  421 +1640 1.46677714745798
  422 +1642 1.46713350654907
  423 +1644 1.46746066478520
  424 +1646 1.46777688897226
  425 +1648 1.46807230212257
  426 +1650 1.46832313178042
  427 +1652 1.46853535477890
  428 +1654 1.46871126235072
  429 +1656 1.46886441952877
  430 +1658 1.46897717842913
  431 +1660 1.46906019325977
  432 +1662 1.46917336129198
  433 +1664 1.46933992968848
  434 +1666 1.46953218537231
  435 +1668 1.46973458666196
  436 +1670 1.46993137012353
  437 +1672 1.47010972990258
  438 +1674 1.47023592719105
  439 +1676 1.47026189453436
  440 +1678 1.47023042790416
  441 +1680 1.47026824213020
  442 +1682 1.47039195163007
  443 +1684 1.47055816296083
  444 +1686 1.47072223030395
  445 +1688 1.47088122473311
  446 +1690 1.47102029360098
  447 +1692 1.47114084717626
  448 +1694 1.47123960018069
  449 +1696 1.47128779153643
  450 +1698 1.47126399416326
  451 +1700 1.47132896383171
  452 +1702 1.47143681802407
  453 +1704 1.47155945773850
  454 +1706 1.47167556592223
  455 +1708 1.47178940246904
  456 +1710 1.47190604771198
  457 +1712 1.47202944260493
  458 +1714 1.47216568678700
  459 +1716 1.47231539851653
  460 +1718 1.47248386890388
  461 +1720 1.47265447525274
  462 +1722 1.47281731074269
  463 +1724 1.47295042900518
  464 +1726 1.47304600716400
  465 +1728 1.47309375883840
  466 +1730 1.47305939547434
  467 +1732 1.47291741773166
  468 +1734 1.47267688996611
  469 +1736 1.47235533806185
  470 +1738 1.47204881790723
  471 +1740 1.47183343980199
  472 +1742 1.47174243401936
  473 +1744 1.47176880507034
  474 +1746 1.47188162854264
  475 +1748 1.47204632190602
  476 +1750 1.47223241396135
  477 +1752 1.47242316015794
  478 +1754 1.47260867420886
  479 +1756 1.47278327809895
  480 +1758 1.47293258838400
  481 +1760 1.47306085751883
  482 +1762 1.47317848011178
  483 +1764 1.47329045336641
  484 +1766 1.47339550159425
  485 +1768 1.47349145470639
  486 +1770 1.47357817480071
  487 +1772 1.47366712599018
  488 +1774 1.47373929846121
  489 +1776 1.47378551120112
  490 +1778 1.47379002011073
  491 +1780 1.47381389620918
  492 +1782 1.47392354891587
  493 +1784 1.47409170003533
  494 +1786 1.47427198188798
  495 +1788 1.47442615650942
  496 +1790 1.47457291909648
  497 +1792 1.47474878427437
  498 +1794 1.47489348470272
  499 +1796 1.47493489892040
  500 +1798 1.47478110512949
  501 +1800 1.47437081445076
  502 +1802 1.47373622085690
  503 +1804 1.47304588258769
  504 +1806 1.47251222749590
  505 +1808 1.47223472657190
  506 +1810 1.47217821063195
  507 +1812 1.47227236503443
  508 +1814 1.47243859996067
  509 +1816 1.47259748640805
  510 +1818 1.47271718154483
  511 +1820 1.47279535803734
  512 +1822 1.47284920630461
  513 +1824 1.47291235631300
  514 +1826 1.47301397376823
  515 +1828 1.47314852957960
  516 +1830 1.47329330162724
  517 +1832 1.47342543709755
  518 +1834 1.47357056562475
  519 +1836 1.47375873628681
  520 +1838 1.47398158101288
  521 +1840 1.47422445263378
  522 +1842 1.47448077748417
  523 +1844 1.47474586805163
  524 +1846 1.47500613122839
  525 +1848 1.47524723874056
  526 +1850 1.47539669943437
  527 +1852 1.47535125830335
  528 +1854 1.47504217493076
  529 +1856 1.47442394463698
  530 +1858 1.47358493716912
  531 +1860 1.47284787021825
  532 +1862 1.47246109965773
  533 +1864 1.47241132718491
  534 +1866 1.47253616431924
  535 +1868 1.47266502935955
  536 +1870 1.47267966566327
  537 +1872 1.47252923128383
  538 +1874 1.47227196419049
  539 +1876 1.47203509622402
  540 +1878 1.47192107290153
  541 +1880 1.47194298711947
  542 +1882 1.47205363793314
  543 +1884 1.47220708298649
  544 +1886 1.47237095289447
  545 +1888 1.47253062677600
  546 +1890 1.47268167466003
  547 +1892 1.47283038859118
  548 +1894 1.47298500841240
  549 +1896 1.47313109785186
  550 +1898 1.47324769232051
  551 +1900 1.47333129201763
  552 +1902 1.47341557098201
  553 +1904 1.47353087942641
  554 +1906 1.47366534069078
  555 +1908 1.47380841038952
  556 +1910 1.47395828541387
  557 +1912 1.47411340271346
  558 +1914 1.47427400000000
  559 +1916 1.47443781042483
  560 +1918 1.47460593444462
  561 +1920 1.47477582054714
  562 +1922 1.47493879861924
  563 +1924 1.47508438695513
  564 +1926 1.47522698209875
  565 +1928 1.47539264822422
  566 +1930 1.47558260671450
  567 +1932 1.47576219402042
  568 +1934 1.47587640732885
  569 +1936 1.47583908582835
  570 +1938 1.47553060901904
  571 +1940 1.47489150443496
  572 +1942 1.47409542930774
  573 +1944 1.47334201979217
  574 +1946 1.47275002485068
  575 +1948 1.47244925775411
  576 +1950 1.47239944627947
  577 +1952 1.47247579265655
  578 +1954 1.47255459735783
  579 +1956 1.47256197135638
  580 +1958 1.47246521668706
  581 +1960 1.47228135320174
  582 +1962 1.47212551111344
  583 +1964 1.47202075140180
  584 +1966 1.47202761573580
  585 +1968 1.47213420575515
  586 +1970 1.47229043240161
  587 +1972 1.47246807810995
  588 +1974 1.47265001716927
  589 +1976 1.47282643638217
  590 +1978 1.47298226071844
  591 +1980 1.47310651432274
  592 +1982 1.47317949653548
  593 +1984 1.47321671851061
  594 +1986 1.47327006170979
  595 +1988 1.47332686296001
  596 +1990 1.47332929557274
  597 +1992 1.47327822607353
  598 +1994 1.47322150680404
  599 +1996 1.47323618581223
  600 +1998 1.47331824302286
  601 +2000 1.47341135456857
  602 +2002 1.47349412728021
  603 +2004 1.47356154386820
  604 +2006 1.47361224775319
  605 +2008 1.47364186456648
  606 +2010 1.47365636042820
  607 +2012 1.47367336928224
  608 +2014 1.47370233665225
  609 +2016 1.47373443692998
  610 +2018 1.47377205797454
  611 +2020 1.47381648358614
  612 +2022 1.47386111301432
  613 +2024 1.47390577969427
  614 +2026 1.47395028817579
  615 +2028 1.47399564538301
  616 +2030 1.47403660265942
  617 +2032 1.47406519767252
  618 +2034 1.47408330994744
  619 +2036 1.47412047010970
  620 +2038 1.47416098226622
  621 +2040 1.47420115643528
  622 +2042 1.47423947043298
  623 +2044 1.47427612941305
  624 +2046 1.47431218419212
  625 +2048 1.47434648116260
  626 +2050 1.47438071427926
  627 +2052 1.47441278409228
  628 +2054 1.47444520616084
  629 +2056 1.47447627049456
  630 +2058 1.47450675882064
  631 +2060 1.47453588733404
  632 +2062 1.47456386702353
  633 +2064 1.47459073458299
  634 +2066 1.47461205370700
  635 +2068 1.47461817299827
  636 +2070 1.47461840283149
  637 +2072 1.47463277175523
  638 +2074 1.47465427880758
  639 +2076 1.47467709152152
  640 +2078 1.47470098997954
  641 +2080 1.47472590140090
  642 +2082 1.47475065118331
  643 +2084 1.47477468067538
  644 +2086 1.47479776494193
  645 +2088 1.47482142195457
  646 +2090 1.47484633615274
  647 +2092 1.47487121877337
  648 +2094 1.47489609572630
  649 +2096 1.47491999718268
  650 +2098 1.47494434691905
  651 +2100 1.47496980619050
  652 +2102 1.47499564254391
  653 +2104 1.47502159030193
  654 +2106 1.47504417582923
  655 +2108 1.47506264533273
  656 +2110 1.47507395400220
  657 +2112 1.47508393678745
  658 +2114 1.47510043049552
  659 +2116 1.47511198378437
  660 +2118 1.47511214568773
  661 +2120 1.47512762848859
  662 +2122 1.47515211305019
  663 +2124 1.47517182375646
  664 +2126 1.47518774789092
  665 +2128 1.47521310826668
  666 +2130 1.47524116489652
  667 +2132 1.47527005212030
  668 +2134 1.47529590535418
  669 +2136 1.47531935031383
  670 +2138 1.47534209120029
  671 +2140 1.47536554624085
  672 +2142 1.47539141048574
  673 +2144 1.47541735186985
  674 +2146 1.47544449187503
  675 +2148 1.47547342544397
  676 +2150 1.47550619668115
  677 +2152 1.47554178363426
  678 +2154 1.47558203516447
  679 +2156 1.47562160093130
  680 +2158 1.47565253763469
  681 +2160 1.47566151568534
  682 +2162 1.47561225894049
  683 +2164 1.47548068559088
  684 +2166 1.47537296738995
  685 +2168 1.47536211403117
  686 +2170 1.47539890926361
  687 +2172 1.47544656614673
  688 +2174 1.47549197749543
  689 +2176 1.47553203213436
  690 +2178 1.47556864358705
  691 +2180 1.47560215753198
  692 +2182 1.47562464470162
  693 +2184 1.47562085582639
  694 +2186 1.47558980476200
  695 +2188 1.47557480988891
  696 +2190 1.47558033450347
  697 +2192 1.47559232749770
  698 +2194 1.47561457143455
  699 +2196 1.47564434139990
  700 +2198 1.47567857523082
  701 +2200 1.47571617803152
  702 +2202 1.47575726786490
  703 +2204 1.47579337721307
  704 +2206 1.47579746772491
  705 +2208 1.47574189594736
  706 +2210 1.47571194854898
  707 +2212 1.47572956986763
  708 +2214 1.47575472007504
  709 +2216 1.47578621163266
  710 +2218 1.47581942101129
  711 +2220 1.47585088742314
  712 +2222 1.47587897173469
  713 +2224 1.47590298856875
  714 +2226 1.47592470046514
  715 +2228 1.47594779372938
  716 +2230 1.47597265137572
  717 +2232 1.47599748726300
  718 +2234 1.47601807246604
  719 +2236 1.47602689076481
  720 +2238 1.47603005518190
  721 +2240 1.47604281703214
  722 +2242 1.47606726159445
  723 +2244 1.47609784881235
  724 +2246 1.47612902016881
  725 +2248 1.47615949406397
  726 +2250 1.47618852095385
  727 +2252 1.47621446243625
  728 +2254 1.47623489680521
  729 +2256 1.47624408046323
  730 +2258 1.47623018458297
  731 +2260 1.47617742404058
  732 +2262 1.47611228816094
  733 +2264 1.47608500995198
  734 +2266 1.47609867784140
  735 +2268 1.47612909924113
  736 +2270 1.47616476482454
  737 +2272 1.47619947439469
  738 +2274 1.47623253066542
  739 +2276 1.47626319551276
  740 +2278 1.47628200368923
  741 +2280 1.47626680426481
  742 +2282 1.47624376410414
  743 +2284 1.47624714378783
  744 +2286 1.47623939342228
  745 +2288 1.47622263640102
  746 +2290 1.47621701248520
  747 +2292 1.47622414847935
  748 +2294 1.47624639786310
  749 +2296 1.47628230617739
  750 +2298 1.47632637399547
  751 +2300 1.47637356620751
  752 +2302 1.47642523943489
  753 +2304 1.47647814675017
  754 +2306 1.47652996718143
  755 +2308 1.47657059295077
  756 +2310 1.47656605147736
  757 +2312 1.47646451238365
  758 +2314 1.47632139830172
  759 +2316 1.47626434895975
  760 +2318 1.47628666976549
  761 +2320 1.47634178441866
  762 +2322 1.47640626197946
  763 +2324 1.47647367980355
  764 +2326 1.47654420112269
  765 +2328 1.47661693748934
  766 +2330 1.47668220577778
  767 +2332 1.47670897421522
  768 +2334 1.47661953024202
  769 +2336 1.47640699456743
  770 +2338 1.47628918090598
  771 +2340 1.47627922381635
  772 +2342 1.47629610568572
  773 +2344 1.47633775742674
  774 +2346 1.47639668853055
  775 +2348 1.47645464076621
  776 +2350 1.47650252320800
  777 +2352 1.47653396769864
  778 +2354 1.47655188224605
  779 +2356 1.47656625779288
  780 +2358 1.47656342537266
  781 +2360 1.47646841808416
  782 +2362 1.47627988649258
  783 +2364 1.47623361007945
  784 +2366 1.47628349602868
  785 +2368 1.47634714131595
  786 +2370 1.47640579435613
  787 +2372 1.47645673781608
  788 +2374 1.47650329311272
  789 +2376 1.47654473856361
  790 +2378 1.47658519751564
  791 +2380 1.47662360662062
  792 +2382 1.47665509133976
  793 +2384 1.47667939867421
  794 +2386 1.47668999377568
  795 +2388 1.47666832266751
  796 +2390 1.47662551968266
  797 +2392 1.47661227607686
  798 +2394 1.47662326945870
  799 +2396 1.47664538468599
  800 +2398 1.47667621017793
  801 +2400 1.47670840326370
  802 +2402 1.47673732384369
  803 +2404 1.47676080113293
  804 +2406 1.47677566835384
  805 +2408 1.47677747426079
  806 +2410 1.47675773033081
  807 +2412 1.47671176533526
  808 +2414 1.47665898774225
  809 +2416 1.47662888566870
  810 +2418 1.47661609885311
  811 +2420 1.47661804906686
  812 +2422 1.47663361079607
  813 +2424 1.47665615258179
  814 +2426 1.47667989702189
  815 +2428 1.47670167875450
  816 +2430 1.47671889251986
  817 +2432 1.47672660033007
  818 +2434 1.47672581905542
  819 +2436 1.47673588691547
  820 +2438 1.47675625346807
  821 +2440 1.47677811479011
  822 +2442 1.47680201299431
  823 +2444 1.47682690323960
  824 +2446 1.47685134280847
  825 +2448 1.47687468838441
  826 +2450 1.47689577948214
  827 +2452 1.47691461221252
  828 +2454 1.47693121483650
  829 +2456 1.47694483659804
  830 +2458 1.47695706614166
  831 +2460 1.47696841245298
  832 +2462 1.47698092980728
  833 +2464 1.47699165258073
  834 +2466 1.47699892231642
  835 +2468 1.47700518850467
  836 +2470 1.47701681917772
  837 +2472 1.47703371133993
  838 +2474 1.47705172804537
  839 +2476 1.47706963205611
  840 +2478 1.47708839046513
  841 +2480 1.47710595182822
  842 +2482 1.47712353018048
  843 +2484 1.47714045399508
  844 +2486 1.47715526898974
  845 +2488 1.47716785931325
  846 +2490 1.47717746351979
  847 +2492 1.47718774105152
  848 +2494 1.47720108087222
  849 +2496 1.47721116876733
  850 +2498 1.47720908793559
  851 +2500 1.47721975153658
  852 +2502 1.47724153102797
  853 +2504 1.47726842063502
  854 +2506 1.47729164115863
  855 +2508 1.47729793164711
  856 +2510 1.47728751673010
  857 +2512 1.47728595976167
  858 +2514 1.47730346177822
  859 +2516 1.47732866245654
  860 +2518 1.47735480680865
  861 +2520 1.47737778321487
  862 +2522 1.47739640465051
  863 +2524 1.47741388745850
  864 +2526 1.47743674344455
  865 +2528 1.47746686662636
  866 +2530 1.47749859543051
  867 +2532 1.47752798101785
  868 +2534 1.47755196992726
  869 +2536 1.47757059463727
  870 +2538 1.47758008928483
  871 +2540 1.47756988987874
  872 +2542 1.47755427512999
  873 +2544 1.47756361259663
  874 +2546 1.47758639316885
  875 +2548 1.47760210701986
  876 +2550 1.47761136589934
  877 +2552 1.47762359682751
  878 +2554 1.47764677677048
  879 +2556 1.47767474710701
  880 +2558 1.47770246497527
  881 +2560 1.47773042785198
  882 +2562 1.47776361629940
  883 +2564 1.47779998470837
  884 +2566 1.47783821733131
  885 +2568 1.47787806111451
  886 +2570 1.47792064098960
  887 +2572 1.47796488547863
  888 +2574 1.47800956216730
  889 +2576 1.47805314833494
  890 +2578 1.47809883475004
  891 +2580 1.47814186001493
  892 +2582 1.47815997256423
  893 +2584 1.47809360441189
  894 +2586 1.47790866325303
  895 +2588 1.47773400000000
  896 +2590 1.47767480433235
  897 +2592 1.47770364229106
  898 +2594 1.47776662663767
  899 +2596 1.47783459041379
  900 +2598 1.47789713249225
  901 +2600 1.47795076443856
  902 +2602 1.47798212010995
  903 +2604 1.47796839500240
  904 +2606 1.47793022585363
  905 +2608 1.47793384355028
  906 +2610 1.47794564701586
  907 +2612 1.47795047312967
  908 +2614 1.47797539539217
  909 +2616 1.47801274460181
  910 +2618 1.47805108460942
  911 +2620 1.47808604011951
  912 +2622 1.47811663248782
  913 +2624 1.47814577420760
  914 +2626 1.47817100891022
  915 +2628 1.47819185746701
  916 +2630 1.47820200756835
  917 +2632 1.47819509341812
  918 +2634 1.47818069648523
  919 +2636 1.47819937787229
  920 +2638 1.47823535219485
  921 +2640 1.47827081637876
  922 +2642 1.47830404351228
  923 +2644 1.47832995386373
  924 +2646 1.47835243329009
  925 +2648 1.47837673632241
  926 +2650 1.47840422324866
  927 +2652 1.47843503880664
  928 +2654 1.47846525754672
  929 +2656 1.47849229804531
  930 +2658 1.47851619218461
  931 +2660 1.47854228554823
  932 +2662 1.47857183053155
  933 +2664 1.47860675830984
  934 +2666 1.47864502580642
  935 +2668 1.47868442524625
  936 +2670 1.47871645234617
  937 +2672 1.47872844710197
  938 +2674 1.47874644966096
  939 +2676 1.47878367512841
  940 +2678 1.47882577091271
  941 +2680 1.47886734102623
  942 +2682 1.47890576030499
  943 +2684 1.47894410487476
  944 +2686 1.47898246676081
  945 +2688 1.47902078634990
  946 +2690 1.47905697663379
  947 +2692 1.47909348635787
  948 +2694 1.47913253241860
  949 +2696 1.47917713682535
  950 +2698 1.47922494363690
  951 +2700 1.47927370219512
  952 +2702 1.47932350132184
  953 +2704 1.47937477829841
  954 +2706 1.47942977955203
  955 +2708 1.47948662996503
  956 +2710 1.47954572465315
  957 +2712 1.47960899951982
  958 +2714 1.47967582145469
  959 +2716 1.47974783424700
  960 +2718 1.47982686383801
  961 +2720 1.47991434869689
  962 +2722 1.48001161889876
  963 +2724 1.48011529035864
  964 +2726 1.48021743640732
  965 +2728 1.48029271013490
  966 +2730 1.48028469924544
  967 +2732 1.48009333694647
  968 +2734 1.47968604519118
  969 +2736 1.47926069770098
  970 +2738 1.47904382199068
  971 +2740 1.47903137276969
  972 +2742 1.47912234371550
  973 +2744 1.47924475242006
  974 +2746 1.47936896123536
  975 +2748 1.47948547683776
  976 +2750 1.47959346670195
  977 +2752 1.47969391424782
  978 +2754 1.47978696270901
  979 +2756 1.47987478298896
  980 +2758 1.47995758449142
  981 +2760 1.48003727324589
  982 +2762 1.48011924219933
  983 +2764 1.48019913384442
  984 +2766 1.48027922637338
  985 +2768 1.48035769798330
  986 +2770 1.48043385800477
  987 +2772 1.48050725415469
  988 +2774 1.48057567058368
  989 +2776 1.48065105935983
  990 +2778 1.48072266299449
  991 +2780 1.48079977415031
  992 +2782 1.48088053164822
  993 +2784 1.48096687278145
  994 +2786 1.48105512159158
  995 +2788 1.48114937559786
  996 +2790 1.48124466747644
  997 +2792 1.48134118881539
  998 +2794 1.48144014454067
  999 +2796 1.48153308521599
  1000 +2798 1.48162875830237
  1001 +2800 1.48173023207917
  1002 +2802 1.48183567152155
  1003 +2804 1.48193764434860
  1004 +2806 1.48203772197889
  1005 +2808 1.48213332822876
  1006 +2810 1.48221893030834
  1007 +2812 1.48230128068059
  1008 +2814 1.48241543210576
  1009 +2816 1.48256188329700
  1010 +2818 1.48272146386266
  1011 +2820 1.48288593713105
  1012 +2822 1.48303146156846
  1013 +2824 1.48316535466125
  1014 +2826 1.48333287967432
  1015 +2828 1.48353886468435
  1016 +2830 1.48376233940652
  1017 +2832 1.48399372362724
  1018 +2834 1.48422859660869
  1019 +2836 1.48446914811588
  1020 +2838 1.48472335986644
  1021 +2840 1.48498891752954
  1022 +2842 1.48526978967144
  1023 +2844 1.48556244410920
  1024 +2846 1.48585030113417
  1025 +2848 1.48611635747129
  1026 +2850 1.48631703683473
  1027 +2852 1.48642616794096
  1028 +2854 1.48638931900690
  1029 +2856 1.48617288132870
  1030 +2858 1.48578055258264
  1031 +2860 1.48528254616381
  1032 +2862 1.48477473720320
  1033 +2864 1.48431306898547
  1034 +2866 1.48390294869478
  1035 +2868 1.48352758708888
  1036 +2870 1.48315923324289
  1037 +2872 1.48276317318322
  1038 +2874 1.48233036174381
  1039 +2876 1.48190033197863
  1040 +2878 1.48156989857095
  1041 +2880 1.48135829837939
  1042 +2882 1.48127046426508
  1043 +2884 1.48129224687463
  1044 +2886 1.48142276034719
  1045 +2888 1.48166152381514
  1046 +2890 1.48199469355260
  1047 +2892 1.48241286263108
  1048 +2894 1.48290615618025
  1049 +2896 1.48346174779728
  1050 +2898 1.48406068695481
  1051 +2900 1.48469749104873
  1052 +2902 1.48534901849277
  1053 +2904 1.48600451268347
  1054 +2906 1.48663330502903
  1055 +2908 1.48716049340272
  1056 +2910 1.48749427432860
  1057 +2912 1.48745634999468
  1058 +2914 1.48687918789111
  1059 +2916 1.48564647709805
  1060 +2918 1.48378138421067
  1061 +2920 1.48160842259702
  1062 +2922 1.47963902212310
  1063 +2924 1.47817563267450
  1064 +2926 1.47725366173650
  1065 +2928 1.47680009878321
  1066 +2930 1.47670600337876
  1067 +2932 1.47683592850229
  1068 +2934 1.47707848906770
  1069 +2936 1.47736368012666
  1070 +2938 1.47761998820843
  1071 +2940 1.47780991969196
  1072 +2942 1.47790616610153
  1073 +2944 1.47789352215007
  1074 +2946 1.47776642994662
  1075 +2948 1.47755303644224
  1076 +2950 1.47732098571495
  1077 +2952 1.47710982305520
  1078 +2954 1.47692656410946
  1079 +2956 1.47677865708199
  1080 +2958 1.47664389769752
  1081 +2960 1.47653950030308
  1082 +2962 1.47652380859929
  1083 +2964 1.47671143784641
  1084 +2966 1.47706590558488
  1085 +2968 1.47742684312635
  1086 +2970 1.47770009243870
  1087 +2972 1.47786247321149
  1088 +2974 1.47794741384886
  1089 +2976 1.47797899370123
  1090 +2978 1.47798223648454
  1091 +2980 1.47795004028588
  1092 +2982 1.47790147416153
  1093 +2984 1.47795735389707
  1094 +2986 1.47814496927765
  1095 +2988 1.47844692443850
  1096 +2990 1.47884918651108
  1097 +2992 1.47932344250011
  1098 +2994 1.47986306802417
  1099 +2996 1.48043188046815
  1100 +2998 1.48097537656156
  1101 +3000 1.48138517100778
  1102 +3002 1.48162356419426
  1103 +3004 1.48185212024737
  1104 +3006 1.48228440440630
  1105 +3008 1.48297178567222
  1106 +3010 1.48385673952528
  1107 +3012 1.48487993544870
  1108 +3014 1.48595665242293
  1109 +3016 1.48695938009756
  1110 +3018 1.48767468298278
  1111 +3020 1.48765524108674
  1112 +3022 1.48618132554454
  1113 +3024 1.48268461964750
  1114 +3026 1.47762082421352
  1115 +3028 1.47232727506644
  1116 +3030 1.46776463943145
  1117 +3032 1.46440878935946
  1118 +3034 1.46247197560802
  1119 +3036 1.46196769309556
  1120 +3038 1.46253947223186
  1121 +3040 1.46367382189299
  1122 +3042 1.46491417717244
  1123 +3044 1.46601563099238
  1124 +3046 1.46697686500990
  1125 +3048 1.46781464802766
  1126 +3050 1.46847402904648
  1127 +3052 1.46887853308036
  1128 +3054 1.46895675121188
  1129 +3056 1.46875323941201
  1130 +3058 1.46834302704055
  1131 +3060 1.46771282666113
  1132 +3062 1.46675300487368
  1133 +3064 1.46553703632205
  1134 +3066 1.46435734374414
  1135 +3068 1.46364333274111
  1136 +3070 1.46361967631567
  1137 +3072 1.46416270683630
  1138 +3074 1.46500589551713
  1139 +3076 1.46593266001109
  1140 +3078 1.46681497080407
  1141 +3080 1.46754108115619
  1142 +3082 1.46785690887919
  1143 +3084 1.46726760945338
  1144 +3086 1.46533247163430
  1145 +3088 1.46268292062625
  1146 +3090 1.46120303549580
  1147 +3092 1.46134478479294
  1148 +3094 1.46221369798373
  1149 +3096 1.46321247938499
  1150 +3098 1.46411661764251
  1151 +3100 1.46482369285261
  1152 +3102 1.46525636685728
  1153 +3104 1.46533581524600
  1154 +3106 1.46519098442260
  1155 +3108 1.46516907412280
  1156 +3110 1.46538060689336
  1157 +3112 1.46568276755924
  1158 +3114 1.46596931336371
  1159 +3116 1.46619739482536
  1160 +3118 1.46639101964608
  1161 +3120 1.46661054944789
  1162 +3122 1.46687049156442
  1163 +3124 1.46713909721892
  1164 +3126 1.46740251735782
  1165 +3128 1.46765965900548
  1166 +3130 1.46790595336806
  1167 +3132 1.46813448944673
  1168 +3134 1.46834723054744
  1169 +3136 1.46854553575727
  1170 +3138 1.46872578997706
  1171 +3140 1.46889606787041
  1172 +3142 1.46905361684206
  1173 +3144 1.46920788445114
  1174 +3146 1.46935155893370
  1175 +3148 1.46948926642375
  1176 +3150 1.46961711994727
  1177 +3152 1.46973932284344
  1178 +3154 1.46985771524525
  1179 +3156 1.46997084147302
  1180 +3158 1.47008125375275
  1181 +3160 1.47018834504960
  1182 +3162 1.47028749194193
  1183 +3164 1.47037561555632
  1184 +3166 1.47044733671974
  1185 +3168 1.47049523638823
  1186 +3170 1.47053287904761
  1187 +3172 1.47059397007388
  1188 +3174 1.47068028883230
  1189 +3176 1.47077100092966
  1190 +3178 1.47085834352883
  1191 +3180 1.47094237966502
  1192 +3182 1.47102127140257
  1193 +3184 1.47109691171596
  1194 +3186 1.47116815404231
  1195 +3188 1.47123618567128
  1196 +3190 1.47130184743484
  1197 +3192 1.47136511381017
  1198 +3194 1.47142734846007
  1199 +3196 1.47148851688128
  1200 +3198 1.47154755038698
  1201 +3200 1.47160533014890
  1202 +3202 1.47166012795457
  1203 +3204 1.47171224992608
  1204 +3206 1.47176315489772
  1205 +3208 1.47181395071669
  1206 +3210 1.47186466789480
  1207 +3212 1.47191661577937
  1208 +3214 1.47196738520913
  1209 +3216 1.47201707857991
  1210 +3218 1.47206588870145
  1211 +3220 1.47211365240659
  1212 +3222 1.47215936522226
  1213 +3224 1.47220500735251
  1214 +3226 1.47225033231421
  1215 +3228 1.47229424065224
  1216 +3230 1.47233733691715
  1217 +3232 1.47237980638024
  1218 +3234 1.47242122252104
  1219 +3236 1.47246173766460
  1220 +3238 1.47250090500984
  1221 +3240 1.47253933121953
  1222 +3242 1.47257666559418
  1223 +3244 1.47261289353408
  1224 +3246 1.47264942225475
  1225 +3248 1.47268468000033
  1226 +3250 1.47271896562139
  1227 +3252 1.47275329822459
  1228 +3254 1.47278723826016
  1229 +3256 1.47281957643892
  1230 +3258 1.47285086138010
  1231 +3260 1.47288192451579
  1232 +3262 1.47291300000000
  1233 +3264 1.47294399234620
  1234 +3266 1.47297519999867
  1235 +3268 1.47300456597122
  1236 +3270 1.47303306949960
  1237 +3272 1.47306229798834
  1238 +3274 1.47309029819990
  1239 +3276 1.47311725100397
  1240 +3278 1.47314519229524
  1241 +3280 1.47317191831342
  1242 +3282 1.47319904835607
  1243 +3284 1.47322480511295
  1244 +3286 1.47325068033533
  1245 +3288 1.47327558727819
  1246 +3290 1.47330149637565
  1247 +3292 1.47332523279087
  1248 +3294 1.47335025198767
  1249 +3296 1.47337510971327
  1250 +3298 1.47339905996618
  1251 +3300 1.47342296954304
  1252 +3302 1.47344582202335
  1253 +3304 1.47346658074592
  1254 +3306 1.47348738493031
  1255 +3308 1.47350703202034
  1256 +3310 1.47352683574489
  1257 +3312 1.47354755048152
  1258 +3314 1.47356829450234
  1259 +3316 1.47358903215508
  1260 +3318 1.47360880465673
  1261 +3320 1.47362855417648
  1262 +3322 1.47364734936801
  1263 +3324 1.47366547803442
  1264 +3326 1.47368305009043
  1265 +3328 1.47369959979993
  1266 +3330 1.47371718446385
  1267 +3332 1.47373378124277
  1268 +3334 1.47375068696817
  1269 +3336 1.47376844875514
  1270 +3338 1.47378666053286
  1271 +3340 1.47380404591194
  1272 +3342 1.47382276516742
  1273 +3344 1.47384040963255
  1274 +3346 1.47385904663877
  1275 +3348 1.47387858239480
  1276 +3350 1.47389752320424
  1277 +3352 1.47391752328576
  1278 +3354 1.47393606713734
  1279 +3356 1.47395488874822
  1280 +3358 1.47397353990369
  1281 +3360 1.47399234620080
  1282 +3362 1.47401055721405
  1283 +3364 1.47402826981442
  1284 +3366 1.47404508175359
  1285 +3368 1.47406141829832
  1286 +3370 1.47407704342040
  1287 +3372 1.47409059132764
  1288 +3374 1.47410503032631
  1289 +3376 1.47411782704824
  1290 +3378 1.47413081528590
  1291 +3380 1.47414326557675
  1292 +3382 1.47415571156753
  1293 +3384 1.47416717298263
  1294 +3386 1.47417841575972
  1295 +3388 1.47418915024028
  1296 +3390 1.47419998707473
  1297 +3392 1.47421190062571
  1298 +3394 1.47422443429139
  1299 +3396 1.47423683452363
  1300 +3398 1.47425033505022
  1301 +3400 1.47426480528893
  1302 +3402 1.47427826680738
  1303 +3404 1.47429170418534
  1304 +3406 1.47430477066294
  1305 +3408 1.47431835512023
  1306 +3410 1.47433193595530
  1307 +3412 1.47434642118416
  1308 +3414 1.47436087920127
  1309 +3416 1.47437532634686
  1310 +3418 1.47439018109776
  1311 +3420 1.47440515622779
  1312 +3422 1.47442044328205
  1313 +3424 1.47443606103306
  1314 +3426 1.47444964436527
  1315 +3428 1.47446294847254
  1316 +3430 1.47447439134230
  1317 +3432 1.47448416869267
  1318 +3434 1.47449072019392
  1319 +3436 1.47449591374259
  1320 +3438 1.47449903792179
  1321 +3440 1.47449993449953
  1322 +3442 1.47450135456237
  1323 +3444 1.47450458795612
  1324 +3446 1.47450875108451
  1325 +3448 1.47451445884208
  1326 +3450 1.47452484258401
  1327 +3452 1.47453827241797
  1328 +3454 1.47455172262247
  1329 +3456 1.47456517206426
  1330 +3458 1.47457860151852
  1331 +3460 1.47459192059468
  1332 +3462 1.47460450298261
  1333 +3464 1.47461696547474
  1334 +3466 1.47462839859281
  1335 +3468 1.47463987388367
  1336 +3470 1.47465188200346
  1337 +3472 1.47466266389847
  1338 +3474 1.47467409691578
  1339 +3476 1.47468473670609
  1340 +3478 1.47469608306209
  1341 +3480 1.47470752002888
  1342 +3482 1.47471885889080
  1343 +3484 1.47473141107054
  1344 +3486 1.47474321664113
  1345 +3488 1.47475540477105
  1346 +3490 1.47476577603289
  1347 +3492 1.47477517654069
  1348 +3494 1.47478437686762
  1349 +3496 1.47479375265910
  1350 +3498 1.47480352784050
  1351 +3500 1.47481386454326
  1352 +3502 1.47482540254891
  1353 +3504 1.47483686546170
  1354 +3506 1.47484922964243
  1355 +3508 1.47486054239155
  1356 +3510 1.47487118057395
  1357 +3512 1.47488161773392
  1358 +3514 1.47489155648764
  1359 +3516 1.47489779215940
  1360 +3518 1.47490199751604
  1361 +3520 1.47490515212000
  1362 +3522 1.47490858576642
  1363 +3524 1.47491589352572
  1364 +3526 1.47492563809847
  1365 +3528 1.47493721829251
  1366 +3530 1.47494965183138
  1367 +3532 1.47496209482301
  1368 +3534 1.47497548127118
  1369 +3536 1.47498901026331
  1370 +3538 1.47500250064110
  1371 +3540 1.47501334375007
  1372 +3542 1.47502155988466
  1373 +3544 1.47502590855583
  1374 +3546 1.47502798788122
  1375 +3548 1.47502908741446
  1376 +3550 1.47503013111600
  1377 +3552 1.47503152066431
  1378 +3554 1.47503369017078
  1379 +3556 1.47503596161309
  1380 +3558 1.47503994401260
  1381 +3560 1.47504720780187
  1382 +3562 1.47505757685400
  1383 +3564 1.47506921753979
  1384 +3566 1.47508222835820
  1385 +3568 1.47509583612677
  1386 +3570 1.47510943592653
  1387 +3572 1.47512299244722
  1388 +3574 1.47513544229862
  1389 +3576 1.47514788646150
  1390 +3578 1.47515877336465
  1391 +3580 1.47516830010454
  1392 +3582 1.47517301097796
  1393 +3584 1.47516730096467
  1394 +3586 1.47516098788624
  1395 +3588 1.47515999912529
  1396 +3590 1.47516344979552
  1397 +3592 1.47516995891151
  1398 +3594 1.47517893497533
  1399 +3596 1.47518949533554
  1400 +3598 1.47519986950803
  1401 +3600 1.47520815315630
  1402 +3602 1.47521639684906
  1403 +3604 1.47522677803691
  1404 +3606 1.47523756307109
  1405 +3608 1.47524905817071
  1406 +3610 1.47526235394740
  1407 +3612 1.47527689090454
  1408 +3614 1.47529241512157
  1409 +3616 1.47530577596310
  1410 +3618 1.47531550675526
  1411 +3620 1.47531807217956
  1412 +3622 1.47531330897623
  1413 +3624 1.47530520668685
  1414 +3626 1.47530099713781
  1415 +3628 1.47530419555884
  1416 +3630 1.47531292297539
  1417 +3632 1.47532682994681
  1418 +3634 1.47534230166646
  1419 +3636 1.47535817866622
  1420 +3638 1.47537270802382
  1421 +3640 1.47538306617453
  1422 +3642 1.47538491013479
  1423 +3644 1.47537808441815
  1424 +3646 1.47536152773521
  1425 +3648 1.47533829820411
  1426 +3650 1.47531127187157
  1427 +3652 1.47528831452931
  1428 +3654 1.47527173292062
  1429 +3656 1.47526400688559
  1430 +3658 1.47526538002071
  1431 +3660 1.47527196497124
  1432 +3662 1.47528332467912
  1433 +3664 1.47529547167214
  1434 +3666 1.47530792033597
  1435 +3668 1.47531940264238
  1436 +3670 1.47532950934428
  1437 +3672 1.47533752543273
  1438 +3674 1.47534264633859
  1439 +3676 1.47534493660391
  1440 +3678 1.47534793834948
  1441 +3680 1.47535101048592
  1442 +3682 1.47535512741537
  1443 +3684 1.47536061029192
  1444 +3686 1.47536677517540
  1445 +3688 1.47537422152313
  1446 +3690 1.47538349069671
  1447 +3692 1.47539466802181
  1448 +3694 1.47540614815786
  1449 +3696 1.47541766757740
  1450 +3698 1.47543103564364
  1451 +3700 1.47544309274752
  1452 +3702 1.47545168948545
  1453 +3704 1.47545396563826
  1454 +3706 1.47545207507319
  1455 +3708 1.47544797484465
  1456 +3710 1.47544704753668
  1457 +3712 1.47545189667326
  1458 +3714 1.47545995926878
  1459 +3716 1.47547095072698
  1460 +3718 1.47548066602429
  1461 +3720 1.47548697893292
  1462 +3722 1.47548796009613
  1463 +3724 1.47548478177503
  1464 +3726 1.47547947641639
  1465 +3728 1.47547863259801
  1466 +3730 1.47548174475524
  1467 +3732 1.47548778078125
  1468 +3734 1.47549403635331
  1469 +3736 1.47550125363908
  1470 +3738 1.47550934180435
  1471 +3740 1.47551683167599
  1472 +3742 1.47552688594006
  1473 +3744 1.47553729090548
  1474 +3746 1.47554678198008
  1475 +3748 1.47555713325216
  1476 +3750 1.47556659302775
  1477 +3752 1.47557669459374
  1478 +3754 1.47558647315562
  1479 +3756 1.47559529768016
  1480 +3758 1.47560360009648
  1481 +3760 1.47561091508282
  1482 +3762 1.47561609735508
  1483 +3764 1.47562029070796
  1484 +3766 1.47562441780911
  1485 +3768 1.47563306550754
  1486 +3770 1.47564405166112
  1487 +3772 1.47565552291783
  1488 +3774 1.47566694809298
  1489 +3776 1.47567830857219
  1490 +3778 1.47568755133462
  1491 +3780 1.47569463620025
  1492 +3782 1.47569547492168
  1493 +3784 1.47568951387041
  1494 +3786 1.47567835935080
  1495 +3788 1.47566593929693
  1496 +3790 1.47566101977927
  1497 +3792 1.47566354952827
  1498 +3794 1.47567185732029
  1499 +3796 1.47568321348889
  1500 +3798 1.47569529254648
  1501 +3800 1.47570772530959
  1502 +3802 1.47571809962768
  1503 +3804 1.47572648401529
  1504 +3806 1.47573134192597
  1505 +3808 1.47573352027040
  1506 +3810 1.47573292361008
  1507 +3812 1.47573299326894
  1508 +3814 1.47573398673360
  1509 +3816 1.47573817632205
  1510 +3818 1.47574527524272
  1511 +3820 1.47575277086820
  1512 +3822 1.47575967350287
  1513 +3824 1.47576470303911
  1514 +3826 1.47576975528735
  1515 +3828 1.47577698612879
  1516 +3830 1.47578309783396
  1517 +3832 1.47578829704916
  1518 +3834 1.47579095824278
  1519 +3836 1.47578839924332
  1520 +3838 1.47578153880935
  1521 +3840 1.47577325828602
  1522 +3842 1.47576695658169
  1523 +3844 1.47576181472562
  1524 +3846 1.47575638975092
  1525 +3848 1.47574893511221
  1526 +3850 1.47574067656252
  1527 +3852 1.47573418960490
  1528 +3854 1.47573201348304
  1529 +3856 1.47573609448654
  1530 +3858 1.47574340076582
  1531 +3860 1.47575406506568
  1532 +3862 1.47576509594980
  1533 +3864 1.47577344240290
  1534 +3866 1.47577782298125
  1535 +3868 1.47577704417063
  1536 +3870 1.47576978782061
  1537 +3872 1.47576167888626
  1538 +3874 1.47575983530599
  1539 +3876 1.47576615931522
  1540 +3878 1.47577603616264
  1541 +3880 1.47578749602566
  1542 +3882 1.47579899049744
  1543 +3884 1.47580829754193
  1544 +3886 1.47581553191111
  1545 +3888 1.47582044576450
  1546 +3890 1.47582361486597
  1547 +3892 1.47582488670530
  1548 +3894 1.47582691190401
  1549 +3896 1.47582798767520
  1550 +3898 1.47583005776107
  1551 +3900 1.47583333559154
  1552 +3902 1.47583798052018
  1553 +3904 1.47584349792097
  1554 +3906 1.47584878503057
  1555 +3908 1.47585104104660
  1556 +3910 1.47584786442429
  1557 +3912 1.47584503864650
  1558 +3914 1.47584772763597
  1559 +3916 1.47585513011730
  1560 +3918 1.47586161194681
  1561 +3920 1.47586680114244
  1562 +3922 1.47586801742881
  1563 +3924 1.47586285228063
  1564 +3926 1.47585768990955
  1565 +3928 1.47585725672200
  1566 +3930 1.47586502926929
  1567 +3932 1.47587638834149
  1568 +3934 1.47588758559686
  1569 +3936 1.47589600406114
  1570 +3938 1.47590331354213
  1571 +3940 1.47591060804636
  1572 +3942 1.47591789591720
  1573 +3944 1.47592457142526
  1574 +3946 1.47593081059303
  1575 +3948 1.47593398581283
  1576 +3950 1.47593295565452
  1577 +3952 1.47592878275285
  1578 +3954 1.47592684349640
  1579 +3956 1.47592986168501
  1580 +3958 1.47593628896516
  1581 +3960 1.47594351825970
  1582 +3962 1.47595186222678
  1583 +3964 1.47595911320580
  1584 +3966 1.47596854991323
  1585 +3968 1.47597712871599
  1586 +3970 1.47598746992252
  1587 +3972 1.47600004422535
  1588 +3974 1.47601337421929
  1589 +3976 1.47602692154134
  1590 +3978 1.47603405627977
  1591 +3980 1.47602817354059
  1592 +3982 1.47601874488156
  1593 +3984 1.47602563707167
  1594 +3986 1.47604367443527
  1595 +3988 1.47606327560645
  1596 +3990 1.47608304122308
  1597 +3992 1.47610269526207
  1598 +3994 1.47612262206064
  1599 +3996 1.47614078459134
  1600 +3998 1.47615752083133
1601 1601 4000 1.47617133599432
1602 1602 \ No newline at end of file
... ...
globals.h
1   -#ifndef GLOBALS_H
2   -#define GLOBALS_H
3   -
4   -#include <vector>
5   -#include <string>
6   -#include <iostream>
7   -#include "PerformanceData.h"
8   -#include <complex>
9   -using namespace std;
10   -
11   -typedef float rtsFloat;
12   -
13   -struct SpecPair{
14   - double nu;
15   - double A;
16   -};
17   -
18   -struct Material{
19   - vector<double> nu;
20   - vector<complex<double> > eta;
21   - string name;
22   -};
23   -
24   -enum SpecType {AbsorbanceSpecType, IntensitySpecType};
25   -enum OpticsType {TransmissionOpticsType, ReflectionOpticsType};
26   -
27   -extern PerformanceData PD;
28   -
29   -
30   -extern vector<vector<SpecPair> > RefSpectrum;
31   -extern int currentSpec;
32   -extern vector<SpecPair> SimSpectrum;
33   -
34   -//IO Functions
35   -vector<SpecPair> LoadSpectrum(string filename);
36   -vector<SpecPair> SetReferenceSpectrum(char* text);
37   -void SaveState();
38   -void LoadState();
39   -void SetDefaults();
40   -void SaveSimulation(string fileName);
41   -void SaveK(string fileName);
42   -void SaveN(string fileName);
43   -void LoadMaterial(string fileNameK, string fileNameN, string materialName);
44   -void LoadMaterial(string fileNameK, string materialName);
45   -
46   -//Display Functions
47   -void FitDisplay();
48   -
49   -//Update Functions
50   -void UpdateDisplay();
51   -void SimulateSpectrum();
52   -void cudaKramersKronig(double* cpuN, double* cpuK, int nVals, double nuStart, double nuEnd, double nOffset);
53   -void cudaComputeSpectrum(double* cpuI, double* cpuB, double* alpha,
54   - int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples);
55   -
56   -//Window Parameters
57   -extern double nuMin;
58   -extern double nuMax;
59   -extern double aMin;
60   -extern double aMax;
61   -extern double dNu;
62   -extern bool dispRefSpec;
63   -extern bool dispSimSpec;
64   -extern bool dispSimK;
65   -extern bool dispMatK;
66   -extern bool dispSimN;
67   -extern bool dispMatN;
68   -extern SpecType dispSimType;
69   -extern bool dispNormalize;
70   -extern double dispNormFactor;
71   -
72   -
73   -extern double dispScaleK;
74   -extern double dispScaleN;
75   -
76   -//material parameters
77   -extern double radius;
78   -extern double baseIR;
79   -extern double cA;
80   -extern vector<SpecPair> EtaK;
81   -extern vector<SpecPair> EtaN;
82   -extern bool applyMaterial;
83   -//extern vector<SpecPair> KMaterial;
84   -//extern vector<SpecPair> NMaterial;
85   -extern vector<Material> MaterialList;
86   -extern int currentMaterial;
87   -void ChangeAbsorbance();
88   -void SetMaterial();
89   -
90   -//optical parameters
91   -extern double cNAi;
92   -extern double cNAo;
93   -extern double oNAi;
94   -extern double oNAo;
95   -extern OpticsType opticsMode;
96   -extern bool pointDetector;
97   -extern int objectiveSamples;
98   -
99   -//fitting parameters
100   -extern double minMSE;
101   -extern int maxFitIter;
102   -void EstimateMaterial();
103   -extern double scaleI0;
104   -extern double refSlope;
105   -
106   -double ComputeDistortion();
107   -void MinimizeDistortion();
108   -
109   -
  1 +#ifndef GLOBALS_H
  2 +#define GLOBALS_H
  3 +
  4 +#include <vector>
  5 +#include <string>
  6 +#include <iostream>
  7 +#include "PerformanceData.h"
  8 +#include <complex>
  9 +using namespace std;
  10 +
  11 +typedef float rtsFloat;
  12 +
  13 +struct SpecPair{
  14 + double nu;
  15 + double A;
  16 +};
  17 +
  18 +struct Material{
  19 + vector<double> nu;
  20 + vector<complex<double> > eta;
  21 + string name;
  22 +};
  23 +
  24 +enum SpecType {AbsorbanceSpecType, IntensitySpecType};
  25 +enum OpticsType {TransmissionOpticsType, ReflectionOpticsType};
  26 +
  27 +extern PerformanceData PD;
  28 +
  29 +
  30 +extern vector<vector<SpecPair> > RefSpectrum;
  31 +extern int currentSpec;
  32 +extern vector<SpecPair> SimSpectrum;
  33 +
  34 +//IO Functions
  35 +vector<SpecPair> LoadSpectrum(string filename);
  36 +vector<SpecPair> SetReferenceSpectrum(char* text);
  37 +void SaveState();
  38 +void LoadState();
  39 +void SetDefaults();
  40 +void SaveSimulation(string fileName);
  41 +void SaveK(string fileName);
  42 +void SaveN(string fileName);
  43 +void LoadMaterial(string fileNameK, string fileNameN, string materialName);
  44 +void LoadMaterial(string fileNameK, string materialName);
  45 +
  46 +//Display Functions
  47 +void FitDisplay();
  48 +
  49 +//Update Functions
  50 +void UpdateDisplay();
  51 +void SimulateSpectrum();
  52 +void cudaKramersKronig(double* cpuN, double* cpuK, int nVals, double nuStart, double nuEnd, double nOffset);
  53 +void cudaComputeSpectrum(double* cpuI, double* cpuB, double* alpha,
  54 + int Nl, int nLambda, double oThetaI, double oThetaO, double cThetaI, double cThetaO, int nSamples);
  55 +
  56 +//Window Parameters
  57 +extern double nuMin;
  58 +extern double nuMax;
  59 +extern double aMin;
  60 +extern double aMax;
  61 +extern double dNu;
  62 +extern bool dispRefSpec;
  63 +extern bool dispSimSpec;
  64 +extern bool dispSimK;
  65 +extern bool dispMatK;
  66 +extern bool dispSimN;
  67 +extern bool dispMatN;
  68 +extern SpecType dispSimType;
  69 +extern bool dispNormalize;
  70 +extern double dispNormFactor;
  71 +
  72 +
  73 +extern double dispScaleK;
  74 +extern double dispScaleN;
  75 +
  76 +//material parameters
  77 +extern double radius;
  78 +extern double baseIR;
  79 +extern double cA;
  80 +extern vector<SpecPair> EtaK;
  81 +extern vector<SpecPair> EtaN;
  82 +extern bool applyMaterial;
  83 +//extern vector<SpecPair> KMaterial;
  84 +//extern vector<SpecPair> NMaterial;
  85 +extern vector<Material> MaterialList;
  86 +extern int currentMaterial;
  87 +void ChangeAbsorbance();
  88 +void SetMaterial();
  89 +
  90 +//optical parameters
  91 +extern double cNAi;
  92 +extern double cNAo;
  93 +extern double oNAi;
  94 +extern double oNAo;
  95 +extern OpticsType opticsMode;
  96 +extern bool pointDetector;
  97 +extern int objectiveSamples;
  98 +
  99 +//fitting parameters
  100 +extern double minMSE;
  101 +extern int maxFitIter;
  102 +void EstimateMaterial();
  103 +extern double scaleI0;
  104 +extern double refSlope;
  105 +
  106 +double ComputeDistortion();
  107 +void MinimizeDistortion();
  108 +
  109 +
110 110 #endif
111 111 \ No newline at end of file
... ...
interactivemie.cpp
1   -#include "interactivemie.h"
2   -
3   -InteractiveMie::InteractiveMie(QWidget *parent, Qt::WFlags flags)
4   - : QMainWindow(parent, flags)
5   -{
6   - ui.setupUi(this);
7   -}
8   -
9   -InteractiveMie::~InteractiveMie()
10   -{
11   - updating = false;
12   -}
  1 +#include "interactivemie.h"
  2 +
  3 +InteractiveMie::InteractiveMie(QWidget *parent, Qt::WFlags flags)
  4 + : QMainWindow(parent, flags)
  5 +{
  6 + ui.setupUi(this);
  7 +}
  8 +
  9 +InteractiveMie::~InteractiveMie()
  10 +{
  11 + updating = false;
  12 +}
... ...
interactivemie.h
1   -#ifndef INTERACTIVEMIE_H
2   -#define INTERACTIVEMIE_H
3   -
4   -#include <QtGui/QMainWindow>
5   -#include <QDragEnterEvent>
6   -#include <qfiledialog.h>
7   -#include <qinputdialog.h>
8   -#include "ui_interactivemie.h"
9   -#include "globals.h"
10   -
11   -class InteractiveMie : public QMainWindow
12   -{
13   - Q_OBJECT
14   -
15   -public:
16   - InteractiveMie(QWidget *parent = 0, Qt::WFlags flags = 0);
17   - ~InteractiveMie();
18   - bool updating;
19   -
20   - void refreshUI()
21   - {
22   - updating = true;
23   -
24   - ui.spinNuMin->setValue(nuMin);
25   - ui.spinNuMax->setValue(nuMax);
26   - ui.spinAMin->setValue(aMin);
27   - ui.spinAMax->setValue(aMax);
28   - ui.spinRadius->setValue(radius);
29   - ui.spinBaseIR->setValue(baseIR);
30   - ui.spinScaleK->setValue(cA);
31   - ui.spinObjNAi->setValue(oNAi);
32   - ui.spinObjNAo->setValue(oNAo);
33   - ui.spinCondNAi->setValue(cNAi);
34   - ui.spinCondNAo->setValue(cNAo);
35   - ui.spinError->setValue(minMSE);
36   - ui.spinMaxIter->setValue(maxFitIter);
37   - ui.spinI0Scale->setValue(scaleI0);
38   -
39   - //display spectra values
40   - ui.chkDisplaySimSpec->setChecked(dispSimSpec);
41   - ui.chkDisplayRefSpec->setChecked(dispRefSpec);
42   - ui.chkDisplaySimK->setChecked(dispSimK);
43   - ui.chkDisplayMatK->setChecked(dispMatK);
44   - ui.chkDisplaySimN->setChecked(dispSimN);
45   - ui.chkDisplayMatN->setChecked(dispMatN);
46   - ui.spinDispScaleK->setValue(dispScaleK);
47   - ui.spinDispScaleN->setValue(dispScaleN);
48   -
49   - //material selection combo box
50   - ui.cmbMaterial->clear();
51   - for(unsigned int i=0; i<MaterialList.size(); i++)
52   - ui.cmbMaterial->addItem(MaterialList[i].name.c_str(), i);
53   - ui.cmbMaterial->setCurrentIndex(currentMaterial);
54   -
55   - updating = false;
56   -
57   - }
58   -
59   - void dragEnterEvent(QDragEnterEvent *event)
60   - {
61   - cout<<"This is a test."<<endl;
62   - QStringList s = event->mimeData()->formats();
63   - if (event->mimeData()->hasFormat("application/x-qt-windows-mime;value=\"FileName\"") ||
64   - event->mimeData()->hasFormat("text/plain"))
65   - {
66   - event->acceptProposedAction();
67   -
68   - }
69   - }
70   -
71   - void dropEvent(QDropEvent *event)
72   - {
73   - //cout<<"Challenge Accepted."<<endl;
74   - RefSpectrum.clear();
75   - RefSpectrum.push_back(SetReferenceSpectrum(event->mimeData()->text().toAscii().data()));
76   - UpdateDisplay();
77   - }
78   -
79   -private:
80   - Ui::InteractiveMieClass ui;
81   -
82   -public slots:
83   - //display parameters
84   - void on_spinNuMin_valueChanged(int i){
85   - nuMin = (float)i;
86   - UpdateDisplay();
87   - }
88   - void on_spinNuMax_valueChanged(int i){
89   - nuMax = (float)i;
90   - UpdateDisplay();
91   - }
92   - void on_spinAMin_valueChanged(double d){
93   - aMin = d;
94   - UpdateDisplay();
95   - }
96   - void on_spinAMax_valueChanged(double d){
97   - aMax = d;
98   - UpdateDisplay();
99   - }
100   - void on_chkDisplaySimSpec_clicked(bool b){
101   - dispSimSpec = b;
102   - UpdateDisplay();
103   - }
104   - void on_chkDisplayRefSpec_clicked(bool b){
105   - dispRefSpec = b;
106   - UpdateDisplay();
107   - }
108   - void on_chkDisplaySimK_clicked(bool b){
109   - dispSimK = b;
110   - UpdateDisplay();
111   - }
112   - void on_chkDisplayMatK_clicked(bool b){
113   - dispMatK = b;
114   - UpdateDisplay();
115   - }
116   - void on_chkDisplaySimN_clicked(bool b){
117   - dispSimN = b;
118   - UpdateDisplay();
119   - }
120   - void on_chkDisplayMatN_clicked(bool b){
121   - dispMatN = b;
122   - UpdateDisplay();
123   - }
124   - void on_spinDispScaleK_valueChanged(double d){
125   - dispScaleK = d;
126   - UpdateDisplay();
127   - }
128   - void on_spinDispScaleN_valueChanged(double d){
129   - dispScaleN = d;
130   - UpdateDisplay();
131   - }
132   - void on_radDisplayAbsorbance_clicked(bool b){
133   - dispSimType = AbsorbanceSpecType;
134   - SimulateSpectrum();
135   - UpdateDisplay();
136   - }
137   - void on_radDisplayIntensity_toggled(bool b){
138   - dispSimType = IntensitySpecType;
139   - SimulateSpectrum();
140   - UpdateDisplay();
141   - }
142   - void on_chkNormalize_clicked(bool b){
143   - dispNormalize = b;
144   - SimulateSpectrum();
145   - UpdateDisplay();
146   - }
147   - void on_spinNormFactor_valueChanged(double d){
148   - dispNormFactor = d;
149   - SimulateSpectrum();
150   - UpdateDisplay();
151   - }
152   -
153   - //material parameters
154   - void on_spinRadius_valueChanged(double d){
155   - radius = d;
156   - SimulateSpectrum();
157   - UpdateDisplay();
158   - }
159   - void on_spinBaseIR_valueChanged(double d){
160   - baseIR = d;
161   - ChangeAbsorbance();
162   - SimulateSpectrum();
163   - UpdateDisplay();
164   - }
165   - void on_spinScaleK_valueChanged(double d){
166   - cA = d;
167   - ChangeAbsorbance();
168   - SimulateSpectrum();
169   - UpdateDisplay();
170   - }
171   - void on_chkApplyMaterial_clicked(bool b){
172   - applyMaterial = b;
173   - SimulateSpectrum();
174   - UpdateDisplay();
175   - }
176   - void on_cmbMaterial_currentIndexChanged(int i){
177   - if(updating) return;
178   -
179   - currentMaterial = i;
180   - SetMaterial();
181   - SimulateSpectrum();
182   - UpdateDisplay();
183   - refreshUI();
184   - }
185   -
186   - //optical parameters
187   - void on_spinCondNAi_valueChanged(double d){
188   - cNAi = d;
189   - SimulateSpectrum();
190   - UpdateDisplay();
191   - }
192   - void on_spinCondNAo_valueChanged(double d){
193   - cNAo = d;
194   - SimulateSpectrum();
195   - UpdateDisplay();
196   - }
197   - void on_spinObjNAi_valueChanged(double d){
198   - oNAi = d;
199   - SimulateSpectrum();
200   - UpdateDisplay();
201   - }
202   - void on_spinObjNAo_valueChanged(double d){
203   - oNAo = d;
204   - SimulateSpectrum();
205   - UpdateDisplay();
206   - }
207   - void on_radTransmissionOptics_clicked(bool d){
208   - ui.spinCondNAi->setEnabled(true);
209   - ui.spinCondNAo->setEnabled(true);
210   - opticsMode = TransmissionOpticsType;
211   - SimulateSpectrum();
212   - UpdateDisplay();
213   - }
214   - void on_radReflectionOptics_clicked(bool d){
215   - ui.spinCondNAi->setEnabled(false);
216   - ui.spinCondNAo->setEnabled(false);
217   - ui.radDisplayAbsorbance->setEnabled(false);
218   - ui.radDisplayIntensity->setChecked(true);
219   - opticsMode = ReflectionOpticsType;
220   - SimulateSpectrum();
221   - UpdateDisplay();
222   - }
223   - void on_chkPointDetector_clicked(bool b){
224   - if(b)
225   - {
226   - pointDetector = true;
227   - ui.spinObjectiveSamples->setEnabled(false);
228   - }
229   - else
230   - {
231   - pointDetector = false;
232   - ui.spinObjectiveSamples->setEnabled(true);
233   - }
234   -
235   - SimulateSpectrum();
236   - UpdateDisplay();
237   - }
238   -
239   - void on_spinObjectiveSamples_valueChanged(int i){
240   - objectiveSamples = i;
241   - SimulateSpectrum();
242   - UpdateDisplay();
243   - }
244   -
245   - //Fitting
246   - void on_spinMaxIter_valueChanged(int i){
247   - maxFitIter = i;
248   - }
249   - void on_spinError_valueChanged(double d){
250   - minMSE = d;
251   - }
252   - void on_spinI0Scale_valueChanged(double d){
253   - scaleI0 = d;
254   - SimulateSpectrum();
255   - UpdateDisplay();
256   - }
257   - void on_spinRefSlope_valueChanged(double d){
258   - refSlope = d;
259   - UpdateDisplay();
260   - }
261   -
262   - //display settings
263   -
264   - //Buttons
265   - void on_btnFit_clicked(){
266   - FitDisplay();
267   - refreshUI();
268   - }
269   - void on_btnSave_clicked(){
270   - SaveState();
271   - }
272   - void on_btnReset_clicked(){
273   - SetDefaults();
274   - SimulateSpectrum();
275   - UpdateDisplay();
276   - refreshUI();
277   - }
278   - void on_btnResetK_clicked(){
279   - ChangeAbsorbance();
280   - SimulateSpectrum();
281   - UpdateDisplay();
282   - }
283   - void on_btnEstimateK_clicked(){
284   - EstimateMaterial();
285   - SimulateSpectrum();
286   - UpdateDisplay();
287   - }
288   - void on_btnDistortion_clicked(){
289   - //ComputeDistortion();
290   - MinimizeDistortion();
291   - }
292   - void on_btnTimings_clicked(){
293   - PD.PrintResults(cout);
294   - }
295   -
296   - //menu items
297   - void on_mnuLoadReference_triggered(){
298   - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Reference Spectrum"));
299   -
300   - if(fileName != QString::null){
301   - RefSpectrum.clear();
302   - RefSpectrum.push_back(LoadSpectrum(fileName.toAscii().data()));
303   - }
304   - UpdateDisplay();
305   - }
306   -
307   - void on_mnuLoadMaterial_triggered(){
308   -
309   - //first load the imaginary part
310   - QString kFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (k) Spectrum"));
311   -
312   - //exit if no file was selected
313   - if(kFileName == QString::null)
314   - return;
315   -
316   - QString nFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (n) Spectrum"));
317   -
318   - //request the material name
319   - QString matName = QInputDialog::getText(this, tr("Material Name"), tr("Enter material name:"));
320   -
321   - //if a real part was given, load both
322   - if(nFileName != QString::null)
323   - LoadMaterial(kFileName.toAscii().data(), nFileName.toAscii().data(), matName.toAscii().data());
324   - else
325   - LoadMaterial(kFileName.toAscii().data(), matName.toAscii().data());
326   -
327   - //add the new material to the combo box
328   - refreshUI();
329   - }
330   -
331   - void on_mnuSaveSim_triggered(){
332   - //first load the imaginary part
333   - QString fileName = QFileDialog::getSaveFileName(this, tr("Save Simulated Spectrum"));
334   - SaveSimulation(fileName.toAscii().data());
335   - }
336   -
337   - void on_mnuSaveK_triggered(){
338   - //first load the imaginary part
339   - QString fileName = QFileDialog::getSaveFileName(this, tr("Save Imaginary Index of Refraction (k)"));
340   - SaveK(fileName.toAscii().data());
341   - }
342   -
343   - void on_mnuSaveN_triggered(){
344   - //first load the imaginary part
345   - QString fileName = QFileDialog::getSaveFileName(this, tr("Save Real Index of Refraction (n)"));
346   - SaveN(fileName.toAscii().data());
347   - }
348   -
349   -
350   -
351   -};
352   -
353   -#endif // INTERACTIVEMIE_H
  1 +#ifndef INTERACTIVEMIE_H
  2 +#define INTERACTIVEMIE_H
  3 +
  4 +#include <QtGui/QMainWindow>
  5 +#include <QDragEnterEvent>
  6 +#include <qfiledialog.h>
  7 +#include <qinputdialog.h>
  8 +#include "ui_interactivemie.h"
  9 +#include "globals.h"
  10 +
  11 +class InteractiveMie : public QMainWindow
  12 +{
  13 + Q_OBJECT
  14 +
  15 +public:
  16 + InteractiveMie(QWidget *parent = 0, Qt::WFlags flags = 0);
  17 + ~InteractiveMie();
  18 + bool updating;
  19 +
  20 + void refreshUI()
  21 + {
  22 + updating = true;
  23 +
  24 + ui.spinNuMin->setValue(nuMin);
  25 + ui.spinNuMax->setValue(nuMax);
  26 + ui.spinAMin->setValue(aMin);
  27 + ui.spinAMax->setValue(aMax);
  28 + ui.spinRadius->setValue(radius);
  29 + ui.spinBaseIR->setValue(baseIR);
  30 + ui.spinScaleK->setValue(cA);
  31 + ui.spinObjNAi->setValue(oNAi);
  32 + ui.spinObjNAo->setValue(oNAo);
  33 + ui.spinCondNAi->setValue(cNAi);
  34 + ui.spinCondNAo->setValue(cNAo);
  35 + ui.spinError->setValue(minMSE);
  36 + ui.spinMaxIter->setValue(maxFitIter);
  37 + ui.spinI0Scale->setValue(scaleI0);
  38 +
  39 + //display spectra values
  40 + ui.chkDisplaySimSpec->setChecked(dispSimSpec);
  41 + ui.chkDisplayRefSpec->setChecked(dispRefSpec);
  42 + ui.chkDisplaySimK->setChecked(dispSimK);
  43 + ui.chkDisplayMatK->setChecked(dispMatK);
  44 + ui.chkDisplaySimN->setChecked(dispSimN);
  45 + ui.chkDisplayMatN->setChecked(dispMatN);
  46 + ui.spinDispScaleK->setValue(dispScaleK);
  47 + ui.spinDispScaleN->setValue(dispScaleN);
  48 +
  49 + //material selection combo box
  50 + ui.cmbMaterial->clear();
  51 + for(unsigned int i=0; i<MaterialList.size(); i++)
  52 + ui.cmbMaterial->addItem(MaterialList[i].name.c_str(), i);
  53 + ui.cmbMaterial->setCurrentIndex(currentMaterial);
  54 +
  55 + updating = false;
  56 +
  57 + }
  58 +
  59 + void dragEnterEvent(QDragEnterEvent *event)
  60 + {
  61 + cout<<"This is a test."<<endl;
  62 + QStringList s = event->mimeData()->formats();
  63 + if (event->mimeData()->hasFormat("application/x-qt-windows-mime;value=\"FileName\"") ||
  64 + event->mimeData()->hasFormat("text/plain"))
  65 + {
  66 + event->acceptProposedAction();
  67 +
  68 + }
  69 + }
  70 +
  71 + void dropEvent(QDropEvent *event)
  72 + {
  73 + //cout<<"Challenge Accepted."<<endl;
  74 + RefSpectrum.clear();
  75 + RefSpectrum.push_back(SetReferenceSpectrum(event->mimeData()->text().toAscii().data()));
  76 + UpdateDisplay();
  77 + }
  78 +
  79 +private:
  80 + Ui::InteractiveMieClass ui;
  81 +
  82 +public slots:
  83 + //display parameters
  84 + void on_spinNuMin_valueChanged(int i){
  85 + nuMin = (float)i;
  86 + UpdateDisplay();
  87 + }
  88 + void on_spinNuMax_valueChanged(int i){
  89 + nuMax = (float)i;
  90 + UpdateDisplay();
  91 + }
  92 + void on_spinAMin_valueChanged(double d){
  93 + aMin = d;
  94 + UpdateDisplay();
  95 + }
  96 + void on_spinAMax_valueChanged(double d){
  97 + aMax = d;
  98 + UpdateDisplay();
  99 + }
  100 + void on_chkDisplaySimSpec_clicked(bool b){
  101 + dispSimSpec = b;
  102 + UpdateDisplay();
  103 + }
  104 + void on_chkDisplayRefSpec_clicked(bool b){
  105 + dispRefSpec = b;
  106 + UpdateDisplay();
  107 + }
  108 + void on_chkDisplaySimK_clicked(bool b){
  109 + dispSimK = b;
  110 + UpdateDisplay();
  111 + }
  112 + void on_chkDisplayMatK_clicked(bool b){
  113 + dispMatK = b;
  114 + UpdateDisplay();
  115 + }
  116 + void on_chkDisplaySimN_clicked(bool b){
  117 + dispSimN = b;
  118 + UpdateDisplay();
  119 + }
  120 + void on_chkDisplayMatN_clicked(bool b){
  121 + dispMatN = b;
  122 + UpdateDisplay();
  123 + }
  124 + void on_spinDispScaleK_valueChanged(double d){
  125 + dispScaleK = d;
  126 + UpdateDisplay();
  127 + }
  128 + void on_spinDispScaleN_valueChanged(double d){
  129 + dispScaleN = d;
  130 + UpdateDisplay();
  131 + }
  132 + void on_radDisplayAbsorbance_clicked(bool b){
  133 + dispSimType = AbsorbanceSpecType;
  134 + SimulateSpectrum();
  135 + UpdateDisplay();
  136 + }
  137 + void on_radDisplayIntensity_toggled(bool b){
  138 + dispSimType = IntensitySpecType;
  139 + SimulateSpectrum();
  140 + UpdateDisplay();
  141 + }
  142 + void on_chkNormalize_clicked(bool b){
  143 + dispNormalize = b;
  144 + SimulateSpectrum();
  145 + UpdateDisplay();
  146 + }
  147 + void on_spinNormFactor_valueChanged(double d){
  148 + dispNormFactor = d;
  149 + SimulateSpectrum();
  150 + UpdateDisplay();
  151 + }
  152 +
  153 + //material parameters
  154 + void on_spinRadius_valueChanged(double d){
  155 + radius = d;
  156 + SimulateSpectrum();
  157 + UpdateDisplay();
  158 + }
  159 + void on_spinBaseIR_valueChanged(double d){
  160 + baseIR = d;
  161 + ChangeAbsorbance();
  162 + SimulateSpectrum();
  163 + UpdateDisplay();
  164 + }
  165 + void on_spinScaleK_valueChanged(double d){
  166 + cA = d;
  167 + ChangeAbsorbance();
  168 + SimulateSpectrum();
  169 + UpdateDisplay();
  170 + }
  171 + void on_chkApplyMaterial_clicked(bool b){
  172 + applyMaterial = b;
  173 + SimulateSpectrum();
  174 + UpdateDisplay();
  175 + }
  176 + void on_cmbMaterial_currentIndexChanged(int i){
  177 + if(updating) return;
  178 +
  179 + currentMaterial = i;
  180 + SetMaterial();
  181 + SimulateSpectrum();
  182 + UpdateDisplay();
  183 + refreshUI();
  184 + }
  185 +
  186 + //optical parameters
  187 + void on_spinCondNAi_valueChanged(double d){
  188 + cNAi = d;
  189 + SimulateSpectrum();
  190 + UpdateDisplay();
  191 + }
  192 + void on_spinCondNAo_valueChanged(double d){
  193 + cNAo = d;
  194 + SimulateSpectrum();
  195 + UpdateDisplay();
  196 + }
  197 + void on_spinObjNAi_valueChanged(double d){
  198 + oNAi = d;
  199 + SimulateSpectrum();
  200 + UpdateDisplay();
  201 + }
  202 + void on_spinObjNAo_valueChanged(double d){
  203 + oNAo = d;
  204 + SimulateSpectrum();
  205 + UpdateDisplay();
  206 + }
  207 + void on_radTransmissionOptics_clicked(bool d){
  208 + ui.spinCondNAi->setEnabled(true);
  209 + ui.spinCondNAo->setEnabled(true);
  210 + opticsMode = TransmissionOpticsType;
  211 + SimulateSpectrum();
  212 + UpdateDisplay();
  213 + }
  214 + void on_radReflectionOptics_clicked(bool d){
  215 + ui.spinCondNAi->setEnabled(false);
  216 + ui.spinCondNAo->setEnabled(false);
  217 + ui.radDisplayAbsorbance->setEnabled(false);
  218 + ui.radDisplayIntensity->setChecked(true);
  219 + opticsMode = ReflectionOpticsType;
  220 + SimulateSpectrum();
  221 + UpdateDisplay();
  222 + }
  223 + void on_chkPointDetector_clicked(bool b){
  224 + if(b)
  225 + {
  226 + pointDetector = true;
  227 + ui.spinObjectiveSamples->setEnabled(false);
  228 + }
  229 + else
  230 + {
  231 + pointDetector = false;
  232 + ui.spinObjectiveSamples->setEnabled(true);
  233 + }
  234 +
  235 + SimulateSpectrum();
  236 + UpdateDisplay();
  237 + }
  238 +
  239 + void on_spinObjectiveSamples_valueChanged(int i){
  240 + objectiveSamples = i;
  241 + SimulateSpectrum();
  242 + UpdateDisplay();
  243 + }
  244 +
  245 + //Fitting
  246 + void on_spinMaxIter_valueChanged(int i){
  247 + maxFitIter = i;
  248 + }
  249 + void on_spinError_valueChanged(double d){
  250 + minMSE = d;
  251 + }
  252 + void on_spinI0Scale_valueChanged(double d){
  253 + scaleI0 = d;
  254 + SimulateSpectrum();
  255 + UpdateDisplay();
  256 + }
  257 + void on_spinRefSlope_valueChanged(double d){
  258 + refSlope = d;
  259 + UpdateDisplay();
  260 + }
  261 +
  262 + //display settings
  263 +
  264 + //Buttons
  265 + void on_btnFit_clicked(){
  266 + FitDisplay();
  267 + refreshUI();
  268 + }
  269 + void on_btnSave_clicked(){
  270 + SaveState();
  271 + }
  272 + void on_btnReset_clicked(){
  273 + SetDefaults();
  274 + SimulateSpectrum();
  275 + UpdateDisplay();
  276 + refreshUI();
  277 + }
  278 + void on_btnResetK_clicked(){
  279 + ChangeAbsorbance();
  280 + SimulateSpectrum();
  281 + UpdateDisplay();
  282 + }
  283 + void on_btnEstimateK_clicked(){
  284 + EstimateMaterial();
  285 + SimulateSpectrum();
  286 + UpdateDisplay();
  287 + }
  288 + void on_btnDistortion_clicked(){
  289 + //ComputeDistortion();
  290 + MinimizeDistortion();
  291 + }
  292 + void on_btnTimings_clicked(){
  293 + PD.PrintResults(cout);
  294 + }
  295 +
  296 + //menu items
  297 + void on_mnuLoadReference_triggered(){
  298 + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Reference Spectrum"));
  299 +
  300 + if(fileName != QString::null){
  301 + RefSpectrum.clear();
  302 + RefSpectrum.push_back(LoadSpectrum(fileName.toAscii().data()));
  303 + }
  304 + UpdateDisplay();
  305 + }
  306 +
  307 + void on_mnuLoadMaterial_triggered(){
  308 +
  309 + //first load the imaginary part
  310 + QString kFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (k) Spectrum"));
  311 +
  312 + //exit if no file was selected
  313 + if(kFileName == QString::null)
  314 + return;
  315 +
  316 + QString nFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (n) Spectrum"));
  317 +
  318 + //request the material name
  319 + QString matName = QInputDialog::getText(this, tr("Material Name"), tr("Enter material name:"));
  320 +
  321 + //if a real part was given, load both
  322 + if(nFileName != QString::null)
  323 + LoadMaterial(kFileName.toAscii().data(), nFileName.toAscii().data(), matName.toAscii().data());
  324 + else
  325 + LoadMaterial(kFileName.toAscii().data(), matName.toAscii().data());
  326 +
  327 + //add the new material to the combo box
  328 + refreshUI();
  329 + }
  330 +
  331 + void on_mnuSaveSim_triggered(){
  332 + //first load the imaginary part
  333 + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Simulated Spectrum"));
  334 + SaveSimulation(fileName.toAscii().data());
  335 + }
  336 +
  337 + void on_mnuSaveK_triggered(){
  338 + //first load the imaginary part
  339 + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Imaginary Index of Refraction (k)"));
  340 + SaveK(fileName.toAscii().data());
  341 + }
  342 +
  343 + void on_mnuSaveN_triggered(){
  344 + //first load the imaginary part
  345 + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Real Index of Refraction (n)"));
  346 + SaveN(fileName.toAscii().data());
  347 + }
  348 +
  349 +
  350 +
  351 +};
  352 +
  353 +#endif // INTERACTIVEMIE_H
... ...
interactivemie.qrc
1   -<RCC>
2   - <qresource prefix="InteractiveMie">
3   - </qresource>
4   -</RCC>
  1 +<RCC>
  2 + <qresource prefix="InteractiveMie">
  3 + </qresource>
  4 +</RCC>
... ...
interactivemie.ui
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<ui version="4.0">
3   - <class>InteractiveMieClass</class>
4   - <widget class="QMainWindow" name="InteractiveMieClass">
5   - <property name="geometry">
6   - <rect>
7   - <x>0</x>
8   - <y>0</y>
9   - <width>464</width>
10   - <height>525</height>
11   - </rect>
12   - </property>
13   - <property name="acceptDrops">
14   - <bool>true</bool>
15   - </property>
16   - <property name="windowTitle">
17   - <string>InteractiveMie</string>
18   - </property>
19   - <widget class="QWidget" name="centralWidget">
20   - <widget class="QGroupBox" name="groupBox">
21   - <property name="geometry">
22   - <rect>
23   - <x>20</x>
24   - <y>140</y>
25   - <width>151</width>
26   - <height>181</height>
27   - </rect>
28   - </property>
29   - <property name="title">
30   - <string>Material</string>
31   - </property>
32   - <widget class="QDoubleSpinBox" name="spinScaleK">
33   - <property name="geometry">
34   - <rect>
35   - <x>70</x>
36   - <y>80</y>
37   - <width>62</width>
38   - <height>22</height>
39   - </rect>
40   - </property>
41   - <property name="singleStep">
42   - <double>0.100000000000000</double>
43   - </property>
44   - <property name="value">
45   - <double>1.000000000000000</double>
46   - </property>
47   - </widget>
48   - <widget class="QDoubleSpinBox" name="spinBaseIR">
49   - <property name="geometry">
50   - <rect>
51   - <x>70</x>
52   - <y>50</y>
53   - <width>62</width>
54   - <height>22</height>
55   - </rect>
56   - </property>
57   - <property name="minimum">
58   - <double>1.000000000000000</double>
59   - </property>
60   - <property name="singleStep">
61   - <double>0.010000000000000</double>
62   - </property>
63   - <property name="value">
64   - <double>1.490000000000000</double>
65   - </property>
66   - </widget>
67   - <widget class="QLabel" name="label_8">
68   - <property name="geometry">
69   - <rect>
70   - <x>30</x>
71   - <y>50</y>
72   - <width>46</width>
73   - <height>13</height>
74   - </rect>
75   - </property>
76   - <property name="text">
77   - <string>base IR</string>
78   - </property>
79   - </widget>
80   - <widget class="QDoubleSpinBox" name="spinRadius">
81   - <property name="geometry">
82   - <rect>
83   - <x>70</x>
84   - <y>20</y>
85   - <width>62</width>
86   - <height>22</height>
87   - </rect>
88   - </property>
89   - <property name="accelerated">
90   - <bool>true</bool>
91   - </property>
92   - <property name="singleStep">
93   - <double>0.100000000000000</double>
94   - </property>
95   - <property name="value">
96   - <double>4.000000000000000</double>
97   - </property>
98   - </widget>
99   - <widget class="QLabel" name="label_4">
100   - <property name="geometry">
101   - <rect>
102   - <x>30</x>
103   - <y>20</y>
104   - <width>46</width>
105   - <height>13</height>
106   - </rect>
107   - </property>
108   - <property name="text">
109   - <string>radius</string>
110   - </property>
111   - </widget>
112   - <widget class="QLabel" name="label_9">
113   - <property name="geometry">
114   - <rect>
115   - <x>30</x>
116   - <y>80</y>
117   - <width>46</width>
118   - <height>13</height>
119   - </rect>
120   - </property>
121   - <property name="text">
122   - <string>scale K</string>
123   - </property>
124   - </widget>
125   - <widget class="QCheckBox" name="chkApplyMaterial">
126   - <property name="geometry">
127   - <rect>
128   - <x>20</x>
129   - <y>110</y>
130   - <width>101</width>
131   - <height>17</height>
132   - </rect>
133   - </property>
134   - <property name="text">
135   - <string>Apply Material</string>
136   - </property>
137   - <property name="checked">
138   - <bool>true</bool>
139   - </property>
140   - </widget>
141   - <widget class="QComboBox" name="cmbMaterial">
142   - <property name="geometry">
143   - <rect>
144   - <x>20</x>
145   - <y>140</y>
146   - <width>111</width>
147   - <height>22</height>
148   - </rect>
149   - </property>
150   - </widget>
151   - </widget>
152   - <widget class="QGroupBox" name="groupBox_2">
153   - <property name="geometry">
154   - <rect>
155   - <x>20</x>
156   - <y>10</y>
157   - <width>241</width>
158   - <height>131</height>
159   - </rect>
160   - </property>
161   - <property name="title">
162   - <string>Optics</string>
163   - </property>
164   - <widget class="QLabel" name="label_7">
165   - <property name="geometry">
166   - <rect>
167   - <x>5</x>
168   - <y>50</y>
169   - <width>71</width>
170   - <height>20</height>
171   - </rect>
172   - </property>
173   - <property name="text">
174   - <string>Objective NA</string>
175   - </property>
176   - </widget>
177   - <widget class="QDoubleSpinBox" name="spinCondNAi">
178   - <property name="geometry">
179   - <rect>
180   - <x>80</x>
181   - <y>20</y>
182   - <width>62</width>
183   - <height>22</height>
184   - </rect>
185   - </property>
186   - <property name="maximum">
187   - <double>1.000000000000000</double>
188   - </property>
189   - <property name="singleStep">
190   - <double>0.010000000000000</double>
191   - </property>
192   - </widget>
193   - <widget class="QLabel" name="label_6">
194   - <property name="geometry">
195   - <rect>
196   - <x>5</x>
197   - <y>20</y>
198   - <width>71</width>
199   - <height>20</height>
200   - </rect>
201   - </property>
202   - <property name="text">
203   - <string>Condenser NA</string>
204   - </property>
205   - </widget>
206   - <widget class="QDoubleSpinBox" name="spinCondNAo">
207   - <property name="geometry">
208   - <rect>
209   - <x>160</x>
210   - <y>20</y>
211   - <width>62</width>
212   - <height>22</height>
213   - </rect>
214   - </property>
215   - <property name="maximum">
216   - <double>1.000000000000000</double>
217   - </property>
218   - <property name="singleStep">
219   - <double>0.010000000000000</double>
220   - </property>
221   - <property name="value">
222   - <double>0.600000000000000</double>
223   - </property>
224   - </widget>
225   - <widget class="QDoubleSpinBox" name="spinObjNAo">
226   - <property name="geometry">
227   - <rect>
228   - <x>160</x>
229   - <y>50</y>
230   - <width>62</width>
231   - <height>22</height>
232   - </rect>
233   - </property>
234   - <property name="maximum">
235   - <double>1.000000000000000</double>
236   - </property>
237   - <property name="singleStep">
238   - <double>0.010000000000000</double>
239   - </property>
240   - <property name="value">
241   - <double>0.600000000000000</double>
242   - </property>
243   - </widget>
244   - <widget class="QDoubleSpinBox" name="spinObjNAi">
245   - <property name="geometry">
246   - <rect>
247   - <x>80</x>
248   - <y>50</y>
249   - <width>62</width>
250   - <height>22</height>
251   - </rect>
252   - </property>
253   - <property name="maximum">
254   - <double>1.000000000000000</double>
255   - </property>
256   - <property name="singleStep">
257   - <double>0.010000000000000</double>
258   - </property>
259   - </widget>
260   - <widget class="QRadioButton" name="radTransmissionOptics">
261   - <property name="geometry">
262   - <rect>
263   - <x>20</x>
264   - <y>80</y>
265   - <width>82</width>
266   - <height>17</height>
267   - </rect>
268   - </property>
269   - <property name="text">
270   - <string>Transmission</string>
271   - </property>
272   - <property name="checked">
273   - <bool>true</bool>
274   - </property>
275   - </widget>
276   - <widget class="QRadioButton" name="radReflectionOptics">
277   - <property name="geometry">
278   - <rect>
279   - <x>150</x>
280   - <y>80</y>
281   - <width>82</width>
282   - <height>17</height>
283   - </rect>
284   - </property>
285   - <property name="text">
286   - <string>Reflection</string>
287   - </property>
288   - </widget>
289   - <widget class="QCheckBox" name="chkPointDetector">
290   - <property name="geometry">
291   - <rect>
292   - <x>150</x>
293   - <y>100</y>
294   - <width>101</width>
295   - <height>17</height>
296   - </rect>
297   - </property>
298   - <property name="text">
299   - <string>Point Detector</string>
300   - </property>
301   - </widget>
302   - <widget class="QSpinBox" name="spinObjectiveSamples">
303   - <property name="geometry">
304   - <rect>
305   - <x>10</x>
306   - <y>100</y>
307   - <width>42</width>
308   - <height>22</height>
309   - </rect>
310   - </property>
311   - <property name="maximum">
312   - <number>999</number>
313   - </property>
314   - <property name="value">
315   - <number>200</number>
316   - </property>
317   - </widget>
318   - <widget class="QLabel" name="label_12">
319   - <property name="geometry">
320   - <rect>
321   - <x>60</x>
322   - <y>100</y>
323   - <width>71</width>
324   - <height>16</height>
325   - </rect>
326   - </property>
327   - <property name="text">
328   - <string>Obj. Samples</string>
329   - </property>
330   - </widget>
331   - </widget>
332   - <widget class="QGroupBox" name="groupBox_3">
333   - <property name="geometry">
334   - <rect>
335   - <x>280</x>
336   - <y>20</y>
337   - <width>161</width>
338   - <height>411</height>
339   - </rect>
340   - </property>
341   - <property name="title">
342   - <string>Display</string>
343   - </property>
344   - <widget class="QDoubleSpinBox" name="spinAMin">
345   - <property name="geometry">
346   - <rect>
347   - <x>80</x>
348   - <y>70</y>
349   - <width>71</width>
350   - <height>22</height>
351   - </rect>
352   - </property>
353   - <property name="decimals">
354   - <number>6</number>
355   - </property>
356   - <property name="minimum">
357   - <double>-9999.000000000000000</double>
358   - </property>
359   - <property name="maximum">
360   - <double>9999.000000000000000</double>
361   - </property>
362   - <property name="singleStep">
363   - <double>0.100000000000000</double>
364   - </property>
365   - </widget>
366   - <widget class="QSpinBox" name="spinNuMin">
367   - <property name="enabled">
368   - <bool>true</bool>
369   - </property>
370   - <property name="geometry">
371   - <rect>
372   - <x>10</x>
373   - <y>70</y>
374   - <width>61</width>
375   - <height>22</height>
376   - </rect>
377   - </property>
378   - <property name="minimum">
379   - <number>1</number>
380   - </property>
381   - <property name="maximum">
382   - <number>100000</number>
383   - </property>
384   - <property name="singleStep">
385   - <number>10</number>
386   - </property>
387   - <property name="value">
388   - <number>800</number>
389   - </property>
390   - </widget>
391   - <widget class="QLabel" name="label_2">
392   - <property name="geometry">
393   - <rect>
394   - <x>110</x>
395   - <y>20</y>
396   - <width>16</width>
397   - <height>16</height>
398   - </rect>
399   - </property>
400   - <property name="text">
401   - <string>A</string>
402   - </property>
403   - </widget>
404   - <widget class="QDoubleSpinBox" name="spinAMax">
405   - <property name="geometry">
406   - <rect>
407   - <x>80</x>
408   - <y>40</y>
409   - <width>71</width>
410   - <height>22</height>
411   - </rect>
412   - </property>
413   - <property name="decimals">
414   - <number>6</number>
415   - </property>
416   - <property name="minimum">
417   - <double>-9999.000000000000000</double>
418   - </property>
419   - <property name="maximum">
420   - <double>9999.000000000000000</double>
421   - </property>
422   - <property name="singleStep">
423   - <double>0.100000000000000</double>
424   - </property>
425   - <property name="value">
426   - <double>1.000000000000000</double>
427   - </property>
428   - </widget>
429   - <widget class="QSpinBox" name="spinNuMax">
430   - <property name="enabled">
431   - <bool>true</bool>
432   - </property>
433   - <property name="geometry">
434   - <rect>
435   - <x>10</x>
436   - <y>40</y>
437   - <width>61</width>
438   - <height>22</height>
439   - </rect>
440   - </property>
441   - <property name="minimum">
442   - <number>1</number>
443   - </property>
444   - <property name="maximum">
445   - <number>100000</number>
446   - </property>
447   - <property name="singleStep">
448   - <number>10</number>
449   - </property>
450   - <property name="value">
451   - <number>4000</number>
452   - </property>
453   - </widget>
454   - <widget class="QLabel" name="label">
455   - <property name="geometry">
456   - <rect>
457   - <x>20</x>
458   - <y>20</y>
459   - <width>61</width>
460   - <height>16</height>
461   - </rect>
462   - </property>
463   - <property name="text">
464   - <string>nu (cm^-1)</string>
465   - </property>
466   - </widget>
467   - <widget class="QCheckBox" name="chkDisplayRefSpec">
468   - <property name="geometry">
469   - <rect>
470   - <x>10</x>
471   - <y>230</y>
472   - <width>131</width>
473   - <height>17</height>
474   - </rect>
475   - </property>
476   - <property name="text">
477   - <string>Reference Spectrum</string>
478   - </property>
479   - <property name="checked">
480   - <bool>true</bool>
481   - </property>
482   - </widget>
483   - <widget class="QCheckBox" name="chkDisplaySimSpec">
484   - <property name="geometry">
485   - <rect>
486   - <x>10</x>
487   - <y>170</y>
488   - <width>131</width>
489   - <height>17</height>
490   - </rect>
491   - </property>
492   - <property name="text">
493   - <string>Simulated Spectrum</string>
494   - </property>
495   - <property name="checked">
496   - <bool>true</bool>
497   - </property>
498   - </widget>
499   - <widget class="QCheckBox" name="chkDisplaySimK">
500   - <property name="geometry">
501   - <rect>
502   - <x>10</x>
503   - <y>280</y>
504   - <width>131</width>
505   - <height>17</height>
506   - </rect>
507   - </property>
508   - <property name="text">
509   - <string>Simulated K</string>
510   - </property>
511   - <property name="checked">
512   - <bool>false</bool>
513   - </property>
514   - </widget>
515   - <widget class="QDoubleSpinBox" name="spinI0Scale">
516   - <property name="geometry">
517   - <rect>
518   - <x>80</x>
519   - <y>100</y>
520   - <width>71</width>
521   - <height>22</height>
522   - </rect>
523   - </property>
524   - <property name="decimals">
525   - <number>6</number>
526   - </property>
527   - <property name="minimum">
528   - <double>-99.989999999999995</double>
529   - </property>
530   - <property name="singleStep">
531   - <double>0.010000000000000</double>
532   - </property>
533   - </widget>
534   - <widget class="QLabel" name="label_10">
535   - <property name="geometry">
536   - <rect>
537   - <x>10</x>
538   - <y>100</y>
539   - <width>71</width>
540   - <height>16</height>
541   - </rect>
542   - </property>
543   - <property name="text">
544   - <string>I0 Scale</string>
545   - </property>
546   - </widget>
547   - <widget class="QDoubleSpinBox" name="spinRefSlope">
548   - <property name="enabled">
549   - <bool>false</bool>
550   - </property>
551   - <property name="geometry">
552   - <rect>
553   - <x>80</x>
554   - <y>130</y>
555   - <width>71</width>
556   - <height>22</height>
557   - </rect>
558   - </property>
559   - <property name="decimals">
560   - <number>6</number>
561   - </property>
562   - <property name="minimum">
563   - <double>-99.989999999999995</double>
564   - </property>
565   - <property name="singleStep">
566   - <double>0.000010000000000</double>
567   - </property>
568   - </widget>
569   - <widget class="QLabel" name="label_11">
570   - <property name="geometry">
571   - <rect>
572   - <x>10</x>
573   - <y>130</y>
574   - <width>71</width>
575   - <height>16</height>
576   - </rect>
577   - </property>
578   - <property name="text">
579   - <string>Ref Slope</string>
580   - </property>
581   - </widget>
582   - <widget class="QCheckBox" name="chkDisplayMatK">
583   - <property name="geometry">
584   - <rect>
585   - <x>10</x>
586   - <y>300</y>
587   - <width>91</width>
588   - <height>17</height>
589   - </rect>
590   - </property>
591   - <property name="text">
592   - <string>Material K</string>
593   - </property>
594   - </widget>
595   - <widget class="QCheckBox" name="chkDisplaySimN">
596   - <property name="geometry">
597   - <rect>
598   - <x>10</x>
599   - <y>330</y>
600   - <width>131</width>
601   - <height>17</height>
602   - </rect>
603   - </property>
604   - <property name="text">
605   - <string>Simulated N</string>
606   - </property>
607   - <property name="checked">
608   - <bool>false</bool>
609   - </property>
610   - </widget>
611   - <widget class="QCheckBox" name="chkDisplayMatN">
612   - <property name="geometry">
613   - <rect>
614   - <x>10</x>
615   - <y>350</y>
616   - <width>91</width>
617   - <height>17</height>
618   - </rect>
619   - </property>
620   - <property name="text">
621   - <string>Material N</string>
622   - </property>
623   - </widget>
624   - <widget class="QDoubleSpinBox" name="spinDispScaleK">
625   - <property name="geometry">
626   - <rect>
627   - <x>90</x>
628   - <y>290</y>
629   - <width>51</width>
630   - <height>22</height>
631   - </rect>
632   - </property>
633   - <property name="singleStep">
634   - <double>0.100000000000000</double>
635   - </property>
636   - </widget>
637   - <widget class="QDoubleSpinBox" name="spinDispScaleN">
638   - <property name="geometry">
639   - <rect>
640   - <x>90</x>
641   - <y>340</y>
642   - <width>51</width>
643   - <height>22</height>
644   - </rect>
645   - </property>
646   - <property name="singleStep">
647   - <double>0.100000000000000</double>
648   - </property>
649   - </widget>
650   - <widget class="QCheckBox" name="chkNormalize">
651   - <property name="geometry">
652   - <rect>
653   - <x>10</x>
654   - <y>380</y>
655   - <width>70</width>
656   - <height>17</height>
657   - </rect>
658   - </property>
659   - <property name="text">
660   - <string>Normalize</string>
661   - </property>
662   - </widget>
663   - <widget class="QRadioButton" name="radDisplayAbsorbance">
664   - <property name="geometry">
665   - <rect>
666   - <x>50</x>
667   - <y>190</y>
668   - <width>82</width>
669   - <height>17</height>
670   - </rect>
671   - </property>
672   - <property name="text">
673   - <string>Absorbance</string>
674   - </property>
675   - <property name="checked">
676   - <bool>true</bool>
677   - </property>
678   - </widget>
679   - <widget class="QRadioButton" name="radDisplayIntensity">
680   - <property name="geometry">
681   - <rect>
682   - <x>50</x>
683   - <y>210</y>
684   - <width>82</width>
685   - <height>17</height>
686   - </rect>
687   - </property>
688   - <property name="text">
689   - <string>Intensity</string>
690   - </property>
691   - </widget>
692   - <widget class="QDoubleSpinBox" name="spinNormFactor">
693   - <property name="geometry">
694   - <rect>
695   - <x>90</x>
696   - <y>380</y>
697   - <width>62</width>
698   - <height>22</height>
699   - </rect>
700   - </property>
701   - <property name="singleStep">
702   - <double>1.000000000000000</double>
703   - </property>
704   - <property name="value">
705   - <double>1.000000000000000</double>
706   - </property>
707   - </widget>
708   - </widget>
709   - <widget class="QPushButton" name="btnFit">
710   - <property name="geometry">
711   - <rect>
712   - <x>180</x>
713   - <y>150</y>
714   - <width>75</width>
715   - <height>23</height>
716   - </rect>
717   - </property>
718   - <property name="text">
719   - <string>Fit</string>
720   - </property>
721   - </widget>
722   - <widget class="QPushButton" name="btnSave">
723   - <property name="geometry">
724   - <rect>
725   - <x>180</x>
726   - <y>180</y>
727   - <width>75</width>
728   - <height>23</height>
729   - </rect>
730   - </property>
731   - <property name="text">
732   - <string>Save</string>
733   - </property>
734   - </widget>
735   - <widget class="QPushButton" name="btnReset">
736   - <property name="geometry">
737   - <rect>
738   - <x>180</x>
739   - <y>210</y>
740   - <width>75</width>
741   - <height>23</height>
742   - </rect>
743   - </property>
744   - <property name="text">
745   - <string>Reset</string>
746   - </property>
747   - </widget>
748   - <widget class="QPushButton" name="btnDistortion">
749   - <property name="enabled">
750   - <bool>true</bool>
751   - </property>
752   - <property name="geometry">
753   - <rect>
754   - <x>180</x>
755   - <y>240</y>
756   - <width>75</width>
757   - <height>23</height>
758   - </rect>
759   - </property>
760   - <property name="text">
761   - <string>Distortion</string>
762   - </property>
763   - </widget>
764   - <widget class="QPushButton" name="btnTimings">
765   - <property name="geometry">
766   - <rect>
767   - <x>180</x>
768   - <y>270</y>
769   - <width>75</width>
770   - <height>23</height>
771   - </rect>
772   - </property>
773   - <property name="text">
774   - <string>Timings</string>
775   - </property>
776   - </widget>
777   - <widget class="QGroupBox" name="groupBox_4">
778   - <property name="geometry">
779   - <rect>
780   - <x>20</x>
781   - <y>320</y>
782   - <width>201</width>
783   - <height>111</height>
784   - </rect>
785   - </property>
786   - <property name="title">
787   - <string>Fit Material</string>
788   - </property>
789   - <widget class="QSpinBox" name="spinMaxIter">
790   - <property name="geometry">
791   - <rect>
792   - <x>110</x>
793   - <y>70</y>
794   - <width>61</width>
795   - <height>22</height>
796   - </rect>
797   - </property>
798   - <property name="maximum">
799   - <number>9999</number>
800   - </property>
801   - <property name="value">
802   - <number>20</number>
803   - </property>
804   - </widget>
805   - <widget class="QLabel" name="label_3">
806   - <property name="geometry">
807   - <rect>
808   - <x>40</x>
809   - <y>50</y>
810   - <width>46</width>
811   - <height>13</height>
812   - </rect>
813   - </property>
814   - <property name="text">
815   - <string>Error</string>
816   - </property>
817   - </widget>
818   - <widget class="QDoubleSpinBox" name="spinError">
819   - <property name="geometry">
820   - <rect>
821   - <x>20</x>
822   - <y>70</y>
823   - <width>71</width>
824   - <height>22</height>
825   - </rect>
826   - </property>
827   - <property name="decimals">
828   - <number>7</number>
829   - </property>
830   - <property name="maximum">
831   - <double>0.100000000000000</double>
832   - </property>
833   - <property name="singleStep">
834   - <double>0.000100000000000</double>
835   - </property>
836   - <property name="value">
837   - <double>0.000100000000000</double>
838   - </property>
839   - </widget>
840   - <widget class="QPushButton" name="btnEstimateK">
841   - <property name="geometry">
842   - <rect>
843   - <x>20</x>
844   - <y>20</y>
845   - <width>75</width>
846   - <height>23</height>
847   - </rect>
848   - </property>
849   - <property name="text">
850   - <string>Estimate K</string>
851   - </property>
852   - </widget>
853   - <widget class="QPushButton" name="btnResetK">
854   - <property name="geometry">
855   - <rect>
856   - <x>100</x>
857   - <y>20</y>
858   - <width>75</width>
859   - <height>23</height>
860   - </rect>
861   - </property>
862   - <property name="text">
863   - <string>Reset K</string>
864   - </property>
865   - </widget>
866   - <widget class="QLabel" name="label_5">
867   - <property name="geometry">
868   - <rect>
869   - <x>120</x>
870   - <y>50</y>
871   - <width>46</width>
872   - <height>13</height>
873   - </rect>
874   - </property>
875   - <property name="text">
876   - <string>Max Iter</string>
877   - </property>
878   - </widget>
879   - </widget>
880   - </widget>
881   - <widget class="QMenuBar" name="menuBar">
882   - <property name="geometry">
883   - <rect>
884   - <x>0</x>
885   - <y>0</y>
886   - <width>464</width>
887   - <height>21</height>
888   - </rect>
889   - </property>
890   - <widget class="QMenu" name="menuFile">
891   - <property name="title">
892   - <string>Load</string>
893   - </property>
894   - <addaction name="mnuLoadReference"/>
895   - <addaction name="mnuLoadMaterial"/>
896   - </widget>
897   - <widget class="QMenu" name="menuSave">
898   - <property name="title">
899   - <string>Save</string>
900   - </property>
901   - <addaction name="mnuSaveSim"/>
902   - <addaction name="mnuSaveK"/>
903   - <addaction name="mnuSaveN"/>
904   - </widget>
905   - <widget class="QMenu" name="menuVersion_0_6">
906   - <property name="title">
907   - <string>Version 0.6</string>
908   - </property>
909   - </widget>
910   - <addaction name="menuFile"/>
911   - <addaction name="menuSave"/>
912   - <addaction name="menuVersion_0_6"/>
913   - </widget>
914   - <widget class="QToolBar" name="mainToolBar">
915   - <attribute name="toolBarArea">
916   - <enum>TopToolBarArea</enum>
917   - </attribute>
918   - <attribute name="toolBarBreak">
919   - <bool>false</bool>
920   - </attribute>
921   - </widget>
922   - <widget class="QStatusBar" name="statusBar"/>
923   - <action name="mnuLoadReference">
924   - <property name="text">
925   - <string>Load Reference</string>
926   - </property>
927   - </action>
928   - <action name="mnuLoadMaterial">
929   - <property name="text">
930   - <string>Load Material</string>
931   - </property>
932   - </action>
933   - <action name="mnuSaveSim">
934   - <property name="text">
935   - <string>Simulation</string>
936   - </property>
937   - </action>
938   - <action name="mnuSaveK">
939   - <property name="text">
940   - <string>k</string>
941   - </property>
942   - </action>
943   - <action name="mnuSaveN">
944   - <property name="text">
945   - <string>n</string>
946   - </property>
947   - </action>
948   - </widget>
949   - <layoutdefault spacing="6" margin="11"/>
950   - <resources>
951   - <include location="interactivemie.qrc"/>
952   - </resources>
953   - <connections/>
954   -</ui>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<ui version="4.0">
  3 + <class>InteractiveMieClass</class>
  4 + <widget class="QMainWindow" name="InteractiveMieClass">
  5 + <property name="geometry">
  6 + <rect>
  7 + <x>0</x>
  8 + <y>0</y>
  9 + <width>464</width>
  10 + <height>525</height>
  11 + </rect>
  12 + </property>
  13 + <property name="acceptDrops">
  14 + <bool>true</bool>
  15 + </property>
  16 + <property name="windowTitle">
  17 + <string>InteractiveMie</string>
  18 + </property>
  19 + <widget class="QWidget" name="centralWidget">
  20 + <widget class="QGroupBox" name="groupBox">
  21 + <property name="geometry">
  22 + <rect>
  23 + <x>20</x>
  24 + <y>140</y>
  25 + <width>151</width>
  26 + <height>181</height>
  27 + </rect>
  28 + </property>
  29 + <property name="title">
  30 + <string>Material</string>
  31 + </property>
  32 + <widget class="QDoubleSpinBox" name="spinScaleK">
  33 + <property name="geometry">
  34 + <rect>
  35 + <x>70</x>
  36 + <y>80</y>
  37 + <width>62</width>
  38 + <height>22</height>
  39 + </rect>
  40 + </property>
  41 + <property name="singleStep">
  42 + <double>0.100000000000000</double>
  43 + </property>
  44 + <property name="value">
  45 + <double>1.000000000000000</double>
  46 + </property>
  47 + </widget>
  48 + <widget class="QDoubleSpinBox" name="spinBaseIR">
  49 + <property name="geometry">
  50 + <rect>
  51 + <x>70</x>
  52 + <y>50</y>
  53 + <width>62</width>
  54 + <height>22</height>
  55 + </rect>
  56 + </property>
  57 + <property name="minimum">
  58 + <double>1.000000000000000</double>
  59 + </property>
  60 + <property name="singleStep">
  61 + <double>0.010000000000000</double>
  62 + </property>
  63 + <property name="value">
  64 + <double>1.490000000000000</double>
  65 + </property>
  66 + </widget>
  67 + <widget class="QLabel" name="label_8">
  68 + <property name="geometry">
  69 + <rect>
  70 + <x>30</x>
  71 + <y>50</y>
  72 + <width>46</width>
  73 + <height>13</height>
  74 + </rect>
  75 + </property>
  76 + <property name="text">
  77 + <string>base IR</string>
  78 + </property>
  79 + </widget>
  80 + <widget class="QDoubleSpinBox" name="spinRadius">
  81 + <property name="geometry">
  82 + <rect>
  83 + <x>70</x>
  84 + <y>20</y>
  85 + <width>62</width>
  86 + <height>22</height>
  87 + </rect>
  88 + </property>
  89 + <property name="accelerated">
  90 + <bool>true</bool>
  91 + </property>
  92 + <property name="singleStep">
  93 + <double>0.100000000000000</double>
  94 + </property>
  95 + <property name="value">
  96 + <double>4.000000000000000</double>
  97 + </property>
  98 + </widget>
  99 + <widget class="QLabel" name="label_4">
  100 + <property name="geometry">
  101 + <rect>
  102 + <x>30</x>
  103 + <y>20</y>
  104 + <width>46</width>
  105 + <height>13</height>
  106 + </rect>
  107 + </property>
  108 + <property name="text">
  109 + <string>radius</string>
  110 + </property>
  111 + </widget>
  112 + <widget class="QLabel" name="label_9">
  113 + <property name="geometry">
  114 + <rect>
  115 + <x>30</x>
  116 + <y>80</y>
  117 + <width>46</width>
  118 + <height>13</height>
  119 + </rect>
  120 + </property>
  121 + <property name="text">
  122 + <string>scale K</string>
  123 + </property>
  124 + </widget>
  125 + <widget class="QCheckBox" name="chkApplyMaterial">
  126 + <property name="geometry">
  127 + <rect>
  128 + <x>20</x>
  129 + <y>110</y>
  130 + <width>101</width>
  131 + <height>17</height>
  132 + </rect>
  133 + </property>
  134 + <property name="text">
  135 + <string>Apply Material</string>
  136 + </property>
  137 + <property name="checked">
  138 + <bool>true</bool>
  139 + </property>
  140 + </widget>
  141 + <widget class="QComboBox" name="cmbMaterial">
  142 + <property name="geometry">
  143 + <rect>
  144 + <x>20</x>
  145 + <y>140</y>
  146 + <width>111</width>
  147 + <height>22</height>
  148 + </rect>
  149 + </property>
  150 + </widget>
  151 + </widget>
  152 + <widget class="QGroupBox" name="groupBox_2">
  153 + <property name="geometry">
  154 + <rect>
  155 + <x>20</x>
  156 + <y>10</y>
  157 + <width>241</width>
  158 + <height>131</height>
  159 + </rect>
  160 + </property>
  161 + <property name="title">
  162 + <string>Optics</string>
  163 + </property>
  164 + <widget class="QLabel" name="label_7">
  165 + <property name="geometry">
  166 + <rect>
  167 + <x>5</x>
  168 + <y>50</y>
  169 + <width>71</width>
  170 + <height>20</height>
  171 + </rect>
  172 + </property>
  173 + <property name="text">
  174 + <string>Objective NA</string>
  175 + </property>
  176 + </widget>
  177 + <widget class="QDoubleSpinBox" name="spinCondNAi">
  178 + <property name="geometry">
  179 + <rect>
  180 + <x>80</x>
  181 + <y>20</y>
  182 + <width>62</width>
  183 + <height>22</height>
  184 + </rect>
  185 + </property>
  186 + <property name="maximum">
  187 + <double>1.000000000000000</double>
  188 + </property>
  189 + <property name="singleStep">
  190 + <double>0.010000000000000</double>
  191 + </property>
  192 + </widget>
  193 + <widget class="QLabel" name="label_6">
  194 + <property name="geometry">
  195 + <rect>
  196 + <x>5</x>
  197 + <y>20</y>
  198 + <width>71</width>
  199 + <height>20</height>
  200 + </rect>
  201 + </property>
  202 + <property name="text">
  203 + <string>Condenser NA</string>
  204 + </property>
  205 + </widget>
  206 + <widget class="QDoubleSpinBox" name="spinCondNAo">
  207 + <property name="geometry">
  208 + <rect>
  209 + <x>160</x>
  210 + <y>20</y>
  211 + <width>62</width>
  212 + <height>22</height>
  213 + </rect>
  214 + </property>
  215 + <property name="maximum">
  216 + <double>1.000000000000000</double>
  217 + </property>
  218 + <property name="singleStep">
  219 + <double>0.010000000000000</double>
  220 + </property>
  221 + <property name="value">
  222 + <double>0.600000000000000</double>
  223 + </property>
  224 + </widget>
  225 + <widget class="QDoubleSpinBox" name="spinObjNAo">
  226 + <property name="geometry">
  227 + <rect>
  228 + <x>160</x>
  229 + <y>50</y>
  230 + <width>62</width>
  231 + <height>22</height>
  232 + </rect>
  233 + </property>
  234 + <property name="maximum">
  235 + <double>1.000000000000000</double>
  236 + </property>
  237 + <property name="singleStep">
  238 + <double>0.010000000000000</double>
  239 + </property>
  240 + <property name="value">
  241 + <double>0.600000000000000</double>
  242 + </property>
  243 + </widget>
  244 + <widget class="QDoubleSpinBox" name="spinObjNAi">
  245 + <property name="geometry">
  246 + <rect>
  247 + <x>80</x>
  248 + <y>50</y>
  249 + <width>62</width>
  250 + <height>22</height>
  251 + </rect>
  252 + </property>
  253 + <property name="maximum">
  254 + <double>1.000000000000000</double>
  255 + </property>
  256 + <property name="singleStep">
  257 + <double>0.010000000000000</double>
  258 + </property>
  259 + </widget>
  260 + <widget class="QRadioButton" name="radTransmissionOptics">
  261 + <property name="geometry">
  262 + <rect>
  263 + <x>20</x>
  264 + <y>80</y>
  265 + <width>82</width>
  266 + <height>17</height>
  267 + </rect>
  268 + </property>
  269 + <property name="text">
  270 + <string>Transmission</string>
  271 + </property>
  272 + <property name="checked">
  273 + <bool>true</bool>
  274 + </property>
  275 + </widget>
  276 + <widget class="QRadioButton" name="radReflectionOptics">
  277 + <property name="geometry">
  278 + <rect>
  279 + <x>150</x>
  280 + <y>80</y>
  281 + <width>82</width>
  282 + <height>17</height>
  283 + </rect>
  284 + </property>
  285 + <property name="text">
  286 + <string>Reflection</string>
  287 + </property>
  288 + </widget>
  289 + <widget class="QCheckBox" name="chkPointDetector">
  290 + <property name="geometry">
  291 + <rect>
  292 + <x>150</x>
  293 + <y>100</y>
  294 + <width>101</width>
  295 + <height>17</height>
  296 + </rect>
  297 + </property>
  298 + <property name="text">
  299 + <string>Point Detector</string>
  300 + </property>
  301 + </widget>
  302 + <widget class="QSpinBox" name="spinObjectiveSamples">
  303 + <property name="geometry">
  304 + <rect>
  305 + <x>10</x>
  306 + <y>100</y>
  307 + <width>42</width>
  308 + <height>22</height>
  309 + </rect>
  310 + </property>
  311 + <property name="maximum">
  312 + <number>999</number>
  313 + </property>
  314 + <property name="value">
  315 + <number>200</number>
  316 + </property>
  317 + </widget>
  318 + <widget class="QLabel" name="label_12">
  319 + <property name="geometry">
  320 + <rect>
  321 + <x>60</x>
  322 + <y>100</y>
  323 + <width>71</width>
  324 + <height>16</height>
  325 + </rect>
  326 + </property>
  327 + <property name="text">
  328 + <string>Obj. Samples</string>
  329 + </property>
  330 + </widget>
  331 + </widget>
  332 + <widget class="QGroupBox" name="groupBox_3">
  333 + <property name="geometry">
  334 + <rect>
  335 + <x>280</x>
  336 + <y>20</y>
  337 + <width>161</width>
  338 + <height>411</height>
  339 + </rect>
  340 + </property>
  341 + <property name="title">
  342 + <string>Display</string>
  343 + </property>
  344 + <widget class="QDoubleSpinBox" name="spinAMin">
  345 + <property name="geometry">
  346 + <rect>
  347 + <x>80</x>
  348 + <y>70</y>
  349 + <width>71</width>
  350 + <height>22</height>
  351 + </rect>
  352 + </property>
  353 + <property name="decimals">
  354 + <number>6</number>
  355 + </property>
  356 + <property name="minimum">
  357 + <double>-9999.000000000000000</double>
  358 + </property>
  359 + <property name="maximum">
  360 + <double>9999.000000000000000</double>
  361 + </property>
  362 + <property name="singleStep">
  363 + <double>0.100000000000000</double>
  364 + </property>
  365 + </widget>
  366 + <widget class="QSpinBox" name="spinNuMin">
  367 + <property name="enabled">
  368 + <bool>true</bool>
  369 + </property>
  370 + <property name="geometry">
  371 + <rect>
  372 + <x>10</x>
  373 + <y>70</y>
  374 + <width>61</width>
  375 + <height>22</height>
  376 + </rect>
  377 + </property>
  378 + <property name="minimum">
  379 + <number>1</number>
  380 + </property>
  381 + <property name="maximum">
  382 + <number>100000</number>
  383 + </property>
  384 + <property name="singleStep">
  385 + <number>10</number>
  386 + </property>
  387 + <property name="value">
  388 + <number>800</number>
  389 + </property>
  390 + </widget>
  391 + <widget class="QLabel" name="label_2">
  392 + <property name="geometry">
  393 + <rect>
  394 + <x>110</x>
  395 + <y>20</y>
  396 + <width>16</width>
  397 + <height>16</height>
  398 + </rect>
  399 + </property>
  400 + <property name="text">
  401 + <string>A</string>
  402 + </property>
  403 + </widget>
  404 + <widget class="QDoubleSpinBox" name="spinAMax">
  405 + <property name="geometry">
  406 + <rect>
  407 + <x>80</x>
  408 + <y>40</y>
  409 + <width>71</width>
  410 + <height>22</height>
  411 + </rect>
  412 + </property>
  413 + <property name="decimals">
  414 + <number>6</number>
  415 + </property>
  416 + <property name="minimum">
  417 + <double>-9999.000000000000000</double>
  418 + </property>
  419 + <property name="maximum">
  420 + <double>9999.000000000000000</double>
  421 + </property>
  422 + <property name="singleStep">
  423 + <double>0.100000000000000</double>
  424 + </property>
  425 + <property name="value">
  426 + <double>1.000000000000000</double>
  427 + </property>
  428 + </widget>
  429 + <widget class="QSpinBox" name="spinNuMax">
  430 + <property name="enabled">
  431 + <bool>true</bool>
  432 + </property>
  433 + <property name="geometry">
  434 + <rect>
  435 + <x>10</x>
  436 + <y>40</y>
  437 + <width>61</width>
  438 + <height>22</height>
  439 + </rect>
  440 + </property>
  441 + <property name="minimum">
  442 + <number>1</number>
  443 + </property>
  444 + <property name="maximum">
  445 + <number>100000</number>
  446 + </property>
  447 + <property name="singleStep">
  448 + <number>10</number>
  449 + </property>
  450 + <property name="value">
  451 + <number>4000</number>
  452 + </property>
  453 + </widget>
  454 + <widget class="QLabel" name="label">
  455 + <property name="geometry">
  456 + <rect>
  457 + <x>20</x>
  458 + <y>20</y>
  459 + <width>61</width>
  460 + <height>16</height>
  461 + </rect>
  462 + </property>
  463 + <property name="text">
  464 + <string>nu (cm^-1)</string>
  465 + </property>
  466 + </widget>
  467 + <widget class="QCheckBox" name="chkDisplayRefSpec">
  468 + <property name="geometry">
  469 + <rect>
  470 + <x>10</x>
  471 + <y>230</y>
  472 + <width>131</width>
  473 + <height>17</height>
  474 + </rect>
  475 + </property>
  476 + <property name="text">
  477 + <string>Reference Spectrum</string>
  478 + </property>
  479 + <property name="checked">
  480 + <bool>true</bool>
  481 + </property>
  482 + </widget>
  483 + <widget class="QCheckBox" name="chkDisplaySimSpec">
  484 + <property name="geometry">
  485 + <rect>
  486 + <x>10</x>
  487 + <y>170</y>
  488 + <width>131</width>
  489 + <height>17</height>
  490 + </rect>
  491 + </property>
  492 + <property name="text">
  493 + <string>Simulated Spectrum</string>
  494 + </property>
  495 + <property name="checked">
  496 + <bool>true</bool>
  497 + </property>
  498 + </widget>
  499 + <widget class="QCheckBox" name="chkDisplaySimK">
  500 + <property name="geometry">
  501 + <rect>
  502 + <x>10</x>
  503 + <y>280</y>
  504 + <width>131</width>
  505 + <height>17</height>
  506 + </rect>
  507 + </property>
  508 + <property name="text">
  509 + <string>Simulated K</string>
  510 + </property>
  511 + <property name="checked">
  512 + <bool>false</bool>
  513 + </property>
  514 + </widget>
  515 + <widget class="QDoubleSpinBox" name="spinI0Scale">
  516 + <property name="geometry">
  517 + <rect>
  518 + <x>80</x>
  519 + <y>100</y>
  520 + <width>71</width>
  521 + <height>22</height>
  522 + </rect>
  523 + </property>
  524 + <property name="decimals">
  525 + <number>6</number>
  526 + </property>
  527 + <property name="minimum">
  528 + <double>-99.989999999999995</double>
  529 + </property>
  530 + <property name="singleStep">
  531 + <double>0.010000000000000</double>
  532 + </property>
  533 + </widget>
  534 + <widget class="QLabel" name="label_10">
  535 + <property name="geometry">
  536 + <rect>
  537 + <x>10</x>
  538 + <y>100</y>
  539 + <width>71</width>
  540 + <height>16</height>
  541 + </rect>
  542 + </property>
  543 + <property name="text">
  544 + <string>I0 Scale</string>
  545 + </property>
  546 + </widget>
  547 + <widget class="QDoubleSpinBox" name="spinRefSlope">
  548 + <property name="enabled">
  549 + <bool>false</bool>
  550 + </property>
  551 + <property name="geometry">
  552 + <rect>
  553 + <x>80</x>
  554 + <y>130</y>
  555 + <width>71</width>
  556 + <height>22</height>
  557 + </rect>
  558 + </property>
  559 + <property name="decimals">
  560 + <number>6</number>
  561 + </property>
  562 + <property name="minimum">
  563 + <double>-99.989999999999995</double>
  564 + </property>
  565 + <property name="singleStep">
  566 + <double>0.000010000000000</double>
  567 + </property>
  568 + </widget>
  569 + <widget class="QLabel" name="label_11">
  570 + <property name="geometry">
  571 + <rect>
  572 + <x>10</x>
  573 + <y>130</y>
  574 + <width>71</width>
  575 + <height>16</height>
  576 + </rect>
  577 + </property>
  578 + <property name="text">
  579 + <string>Ref Slope</string>
  580 + </property>
  581 + </widget>
  582 + <widget class="QCheckBox" name="chkDisplayMatK">
  583 + <property name="geometry">
  584 + <rect>
  585 + <x>10</x>
  586 + <y>300</y>
  587 + <width>91</width>
  588 + <height>17</height>
  589 + </rect>
  590 + </property>
  591 + <property name="text">
  592 + <string>Material K</string>
  593 + </property>
  594 + </widget>
  595 + <widget class="QCheckBox" name="chkDisplaySimN">
  596 + <property name="geometry">
  597 + <rect>
  598 + <x>10</x>
  599 + <y>330</y>
  600 + <width>131</width>
  601 + <height>17</height>
  602 + </rect>
  603 + </property>
  604 + <property name="text">
  605 + <string>Simulated N</string>
  606 + </property>
  607 + <property name="checked">
  608 + <bool>false</bool>
  609 + </property>
  610 + </widget>
  611 + <widget class="QCheckBox" name="chkDisplayMatN">
  612 + <property name="geometry">
  613 + <rect>
  614 + <x>10</x>
  615 + <y>350</y>
  616 + <width>91</width>
  617 + <height>17</height>
  618 + </rect>
  619 + </property>
  620 + <property name="text">
  621 + <string>Material N</string>
  622 + </property>
  623 + </widget>
  624 + <widget class="QDoubleSpinBox" name="spinDispScaleK">
  625 + <property name="geometry">
  626 + <rect>
  627 + <x>90</x>
  628 + <y>290</y>
  629 + <width>51</width>
  630 + <height>22</height>
  631 + </rect>
  632 + </property>
  633 + <property name="singleStep">
  634 + <double>0.100000000000000</double>
  635 + </property>
  636 + </widget>
  637 + <widget class="QDoubleSpinBox" name="spinDispScaleN">
  638 + <property name="geometry">
  639 + <rect>
  640 + <x>90</x>
  641 + <y>340</y>
  642 + <width>51</width>
  643 + <height>22</height>
  644 + </rect>
  645 + </property>
  646 + <property name="singleStep">
  647 + <double>0.100000000000000</double>
  648 + </property>
  649 + </widget>
  650 + <widget class="QCheckBox" name="chkNormalize">
  651 + <property name="geometry">
  652 + <rect>
  653 + <x>10</x>
  654 + <y>380</y>
  655 + <width>70</width>
  656 + <height>17</height>
  657 + </rect>
  658 + </property>
  659 + <property name="text">
  660 + <string>Normalize</string>
  661 + </property>
  662 + </widget>
  663 + <widget class="QRadioButton" name="radDisplayAbsorbance">
  664 + <property name="geometry">
  665 + <rect>
  666 + <x>50</x>
  667 + <y>190</y>
  668 + <width>82</width>
  669 + <height>17</height>
  670 + </rect>
  671 + </property>
  672 + <property name="text">
  673 + <string>Absorbance</string>
  674 + </property>
  675 + <property name="checked">
  676 + <bool>true</bool>
  677 + </property>
  678 + </widget>
  679 + <widget class="QRadioButton" name="radDisplayIntensity">
  680 + <property name="geometry">
  681 + <rect>
  682 + <x>50</x>
  683 + <y>210</y>
  684 + <width>82</width>
  685 + <height>17</height>
  686 + </rect>
  687 + </property>
  688 + <property name="text">
  689 + <string>Intensity</string>
  690 + </property>
  691 + </widget>
  692 + <widget class="QDoubleSpinBox" name="spinNormFactor">
  693 + <property name="geometry">
  694 + <rect>
  695 + <x>90</x>
  696 + <y>380</y>
  697 + <width>62</width>
  698 + <height>22</height>
  699 + </rect>
  700 + </property>
  701 + <property name="singleStep">
  702 + <double>1.000000000000000</double>
  703 + </property>
  704 + <property name="value">
  705 + <double>1.000000000000000</double>
  706 + </property>
  707 + </widget>
  708 + </widget>
  709 + <widget class="QPushButton" name="btnFit">
  710 + <property name="geometry">
  711 + <rect>
  712 + <x>180</x>
  713 + <y>150</y>
  714 + <width>75</width>
  715 + <height>23</height>
  716 + </rect>
  717 + </property>
  718 + <property name="text">
  719 + <string>Fit</string>
  720 + </property>
  721 + </widget>
  722 + <widget class="QPushButton" name="btnSave">
  723 + <property name="geometry">
  724 + <rect>
  725 + <x>180</x>
  726 + <y>180</y>
  727 + <width>75</width>
  728 + <height>23</height>
  729 + </rect>
  730 + </property>
  731 + <property name="text">
  732 + <string>Save</string>
  733 + </property>
  734 + </widget>
  735 + <widget class="QPushButton" name="btnReset">
  736 + <property name="geometry">
  737 + <rect>
  738 + <x>180</x>
  739 + <y>210</y>
  740 + <width>75</width>
  741 + <height>23</height>
  742 + </rect>
  743 + </property>
  744 + <property name="text">
  745 + <string>Reset</string>
  746 + </property>
  747 + </widget>
  748 + <widget class="QPushButton" name="btnDistortion">
  749 + <property name="enabled">
  750 + <bool>true</bool>
  751 + </property>
  752 + <property name="geometry">
  753 + <rect>
  754 + <x>180</x>
  755 + <y>240</y>
  756 + <width>75</width>
  757 + <height>23</height>
  758 + </rect>
  759 + </property>
  760 + <property name="text">
  761 + <string>Distortion</string>
  762 + </property>
  763 + </widget>
  764 + <widget class="QPushButton" name="btnTimings">
  765 + <property name="geometry">
  766 + <rect>
  767 + <x>180</x>
  768 + <y>270</y>
  769 + <width>75</width>
  770 + <height>23</height>
  771 + </rect>
  772 + </property>
  773 + <property name="text">
  774 + <string>Timings</string>
  775 + </property>
  776 + </widget>
  777 + <widget class="QGroupBox" name="groupBox_4">
  778 + <property name="geometry">
  779 + <rect>
  780 + <x>20</x>
  781 + <y>320</y>
  782 + <width>201</width>
  783 + <height>111</height>
  784 + </rect>
  785 + </property>
  786 + <property name="title">
  787 + <string>Fit Material</string>
  788 + </property>
  789 + <widget class="QSpinBox" name="spinMaxIter">
  790 + <property name="geometry">
  791 + <rect>
  792 + <x>110</x>
  793 + <y>70</y>
  794 + <width>61</width>
  795 + <height>22</height>
  796 + </rect>
  797 + </property>
  798 + <property name="maximum">
  799 + <number>9999</number>
  800 + </property>
  801 + <property name="value">
  802 + <number>20</number>
  803 + </property>
  804 + </widget>
  805 + <widget class="QLabel" name="label_3">
  806 + <property name="geometry">
  807 + <rect>
  808 + <x>40</x>
  809 + <y>50</y>
  810 + <width>46</width>
  811 + <height>13</height>
  812 + </rect>
  813 + </property>
  814 + <property name="text">
  815 + <string>Error</string>
  816 + </property>
  817 + </widget>
  818 + <widget class="QDoubleSpinBox" name="spinError">
  819 + <property name="geometry">
  820 + <rect>
  821 + <x>20</x>
  822 + <y>70</y>
  823 + <width>71</width>
  824 + <height>22</height>
  825 + </rect>
  826 + </property>
  827 + <property name="decimals">
  828 + <number>7</number>
  829 + </property>
  830 + <property name="maximum">
  831 + <double>0.100000000000000</double>
  832 + </property>
  833 + <property name="singleStep">
  834 + <double>0.000100000000000</double>
  835 + </property>
  836 + <property name="value">
  837 + <double>0.000100000000000</double>
  838 + </property>
  839 + </widget>
  840 + <widget class="QPushButton" name="btnEstimateK">
  841 + <property name="geometry">
  842 + <rect>
  843 + <x>20</x>
  844 + <y>20</y>
  845 + <width>75</width>
  846 + <height>23</height>
  847 + </rect>
  848 + </property>
  849 + <property name="text">
  850 + <string>Estimate K</string>
  851 + </property>
  852 + </widget>
  853 + <widget class="QPushButton" name="btnResetK">
  854 + <property name="geometry">
  855 + <rect>
  856 + <x>100</x>
  857 + <y>20</y>
  858 + <width>75</width>
  859 + <height>23</height>
  860 + </rect>
  861 + </property>
  862 + <property name="text">
  863 + <string>Reset K</string>
  864 + </property>
  865 + </widget>
  866 + <widget class="QLabel" name="label_5">
  867 + <property name="geometry">
  868 + <rect>
  869 + <x>120</x>
  870 + <y>50</y>
  871 + <width>46</width>
  872 + <height>13</height>
  873 + </rect>
  874 + </property>
  875 + <property name="text">
  876 + <string>Max Iter</string>
  877 + </property>
  878 + </widget>
  879 + </widget>
  880 + </widget>
  881 + <widget class="QMenuBar" name="menuBar">
  882 + <property name="geometry">
  883 + <rect>
  884 + <x>0</x>
  885 + <y>0</y>
  886 + <width>464</width>
  887 + <height>21</height>
  888 + </rect>
  889 + </property>
  890 + <widget class="QMenu" name="menuFile">
  891 + <property name="title">
  892 + <string>Load</string>
  893 + </property>
  894 + <addaction name="mnuLoadReference"/>
  895 + <addaction name="mnuLoadMaterial"/>
  896 + </widget>
  897 + <widget class="QMenu" name="menuSave">
  898 + <property name="title">
  899 + <string>Save</string>
  900 + </property>
  901 + <addaction name="mnuSaveSim"/>
  902 + <addaction name="mnuSaveK"/>
  903 + <addaction name="mnuSaveN"/>
  904 + </widget>
  905 + <widget class="QMenu" name="menuVersion_0_6">
  906 + <property name="title">
  907 + <string>Version 0.6</string>
  908 + </property>
  909 + </widget>
  910 + <addaction name="menuFile"/>
  911 + <addaction name="menuSave"/>
  912 + <addaction name="menuVersion_0_6"/>
  913 + </widget>
  914 + <widget class="QToolBar" name="mainToolBar">
  915 + <attribute name="toolBarArea">
  916 + <enum>TopToolBarArea</enum>
  917 + </attribute>
  918 + <attribute name="toolBarBreak">
  919 + <bool>false</bool>
  920 + </attribute>
  921 + </widget>
  922 + <widget class="QStatusBar" name="statusBar"/>
  923 + <action name="mnuLoadReference">
  924 + <property name="text">
  925 + <string>Load Reference</string>
  926 + </property>
  927 + </action>
  928 + <action name="mnuLoadMaterial">
  929 + <property name="text">
  930 + <string>Load Material</string>
  931 + </property>
  932 + </action>
  933 + <action name="mnuSaveSim">
  934 + <property name="text">
  935 + <string>Simulation</string>
  936 + </property>
  937 + </action>
  938 + <action name="mnuSaveK">
  939 + <property name="text">
  940 + <string>k</string>
  941 + </property>
  942 + </action>
  943 + <action name="mnuSaveN">
  944 + <property name="text">
  945 + <string>n</string>
  946 + </property>
  947 + </action>
  948 + </widget>
  949 + <layoutdefault spacing="6" margin="11"/>
  950 + <resources>
  951 + <include location="interactivemie.qrc"/>
  952 + </resources>
  953 + <connections/>
  954 +</ui>
... ...
kPMMA.txt
Changes suppressed. Click to show
1   -600 0.0241342
2   -602 0.027446631
3   -604 0.02823961
4   -606 0.029234628
5   -608 0.025898145
6   -610 0.027709774
7   -612 0.025719063
8   -614 0.024429068
9   -616 0.02854507
10   -618 0.028690732
11   -620 0.027360949
12   -622 0.026091157
13   -624 0.028641792
14   -626 0.025692568
15   -628 0.027570268
16   -630 0.026608215
17   -632 0.025158608
18   -634 0.027824888
19   -636 0.027869757
20   -638 0.028231098
21   -640 0.027216732
22   -642 0.027256791
23   -644 0.026774291
24   -646 0.025499332
25   -648 0.026889976
26   -650 0.030071764
27   -652 0.028157525
28   -654 0.027086256
29   -656 0.023530438
30   -658 0.026059433
31   -660 0.024346599
32   -662 0.028048226
33   -664 0.026330259
34   -666 0.026601859
35   -668 0.026131422
36   -670 0.024728621
37   -672 0.02338841
38   -674 0.025137265
39   -676 0.024573728
40   -678 0.02555457
41   -680 0.026601251
42   -682 0.02396367
43   -684 0.023990388
44   -686 0.022609513
45   -688 0.02293027
46   -690 0.023659684
47   -692 0.023029444
48   -694 0.02354769
49   -696 0.022885431
50   -698 0.020916068
51   -700 0.017366832
52   -702 0.020254317
53   -704 0.02021588
54   -706 0.019612931
55   -708 0.020605736
56   -710 0.019409
57   -712 0.020098812
58   -714 0.017859943
59   -716 0.017200361
60   -718 0.017415851
61   -720 0.016738256
62   -722 0.017480257
63   -724 0.016505558
64   -726 0.017110302
65   -728 0.017027064
66   -730 0.016024705
67   -732 0.017486817
68   -734 0.01747258
69   -736 0.018679356
70   -738 0.0198481
71   -740 0.021190117
72   -742 0.023716217
73   -744 0.03056829
74   -746 0.038271622
75   -748 0.04379452
76   -750 0.044251529
77   -752 0.0407681
78   -754 0.034103515
79   -756 0.029061414
80   -758 0.02617678
81   -760 0.022539928
82   -762 0.021165925
83   -764 0.019846463
84   -766 0.018521271
85   -768 0.018036484
86   -770 0.017126223
87   -772 0.016586444
88   -774 0.016483205
89   -776 0.01531947
90   -778 0.014237011
91   -780 0.013740482
92   -782 0.012463683
93   -784 0.012601353
94   -786 0.012687382
95   -788 0.011956341
96   -790 0.012597304
97   -792 0.01301531
98   -794 0.013443559
99   -796 0.014187849
100   -798 0.014467894
101   -800 0.015065439
102   -802 0.014878516
103   -804 0.015873769
104   -806 0.016515435
105   -808 0.016709374
106   -810 0.017771403
107   -812 0.016772822
108   -814 0.015531226
109   -816 0.014555445
110   -818 0.013874898
111   -820 0.015212008
112   -822 0.016378744
113   -824 0.017775592
114   -826 0.01866164
115   -828 0.018518393
116   -830 0.016763911
117   -832 0.015599009
118   -834 0.017242919
119   -836 0.020302394
120   -838 0.023933252
121   -840 0.026400268
122   -842 0.02629389
123   -844 0.024144284
124   -846 0.022565086
125   -848 0.020193958
126   -850 0.018896857
127   -852 0.01763933
128   -854 0.016642232
129   -856 0.015634651
130   -858 0.014645714
131   -860 0.014138096
132   -862 0.014067378
133   -864 0.013168089
134   -866 0.012439437
135   -868 0.011586666
136   -870 0.011339401
137   -872 0.010914962
138   -874 0.011187976
139   -876 0.01107262
140   -878 0.010671149
141   -880 0.010509334
142   -882 0.010691428
143   -884 0.010463665
144   -886 0.010732772
145   -888 0.01113261
146   -890 0.011327793
147   -892 0.011556208
148   -894 0.011574848
149   -896 0.012311955
150   -898 0.012752431
151   -900 0.013542695
152   -902 0.014021246
153   -904 0.01526174
154   -906 0.016386114
155   -908 0.017710929
156   -910 0.01815038
157   -912 0.018485943
158   -914 0.017942962
159   -916 0.017253983
160   -918 0.01673434
161   -920 0.01576578
162   -922 0.014969642
163   -924 0.014914081
164   -926 0.014775756
165   -928 0.01494549
166   -930 0.015163243
167   -932 0.015246393
168   -934 0.01532558
169   -936 0.015787325
170   -938 0.016231344
171   -940 0.016554737
172   -942 0.017506803
173   -944 0.018319774
174   -946 0.019145212
175   -948 0.02028672
176   -950 0.021535268
177   -952 0.02275816
178   -954 0.024219016
179   -956 0.025883888
180   -958 0.028191904
181   -960 0.02973823
182   -962 0.032138566
183   -964 0.034003184
184   -966 0.03499998
185   -968 0.034104727
186   -970 0.032129204
187   -972 0.029984542
188   -974 0.028583373
189   -976 0.029296818
190   -978 0.030947438
191   -980 0.033218509
192   -982 0.035106761
193   -984 0.037063027
194   -986 0.037990186
195   -988 0.03843855
196   -990 0.038237958
197   -992 0.037541096
198   -994 0.035408946
199   -996 0.032268154
200   -998 0.027709144
201   -1000 0.022616564
202   -1002 0.017792654
203   -1004 0.013769074
204   -1006 0.010837077
205   -1008 0.009454576
206   -1010 0.008332445
207   -1012 0.008116192
208   -1014 0.007675599
209   -1016 0.007566205
210   -1018 0.007612047
211   -1020 0.007823547
212   -1022 0.007966098
213   -1024 0.00809757
214   -1026 0.008065411
215   -1028 0.007845732
216   -1030 0.008024275
217   -1032 0.008148742
218   -1034 0.00829201
219   -1036 0.008417171
220   -1038 0.008776959
221   -1040 0.008930208
222   -1042 0.009109161
223   -1044 0.009556965
224   -1046 0.010041021
225   -1048 0.010441404
226   -1050 0.011689312
227   -1052 0.013463372
228   -1054 0.016068878
229   -1056 0.019131748
230   -1058 0.022191274
231   -1060 0.024570002
232   -1062 0.025823144
233   -1064 0.025672626
234   -1066 0.024900161
235   -1068 0.023916478
236   -1070 0.022915273
237   -1072 0.021869278
238   -1074 0.021291225
239   -1076 0.020732279
240   -1078 0.020423981
241   -1080 0.019941966
242   -1082 0.019763979
243   -1084 0.020171972
244   -1086 0.020501795
245   -1088 0.020890993
246   -1090 0.020973014
247   -1092 0.021622654
248   -1094 0.021985718
249   -1096 0.022794049
250   -1098 0.023588335
251   -1100 0.024728944
252   -1102 0.025840943
253   -1104 0.027215918
254   -1106 0.028776335
255   -1108 0.030474863
256   -1110 0.032132728
257   -1112 0.03432894
258   -1114 0.03658024
259   -1116 0.039269767
260   -1118 0.042412102
261   -1120 0.04564282
262   -1122 0.048808874
263   -1124 0.052149974
264   -1126 0.056015747
265   -1128 0.060459226
266   -1130 0.066082016
267   -1132 0.073004102
268   -1134 0.082002822
269   -1136 0.092694241
270   -1138 0.105040768
271   -1140 0.119005198
272   -1142 0.134765364
273   -1144 0.151290317
274   -1146 0.166711247
275   -1148 0.177289661
276   -1150 0.177581202
277   -1152 0.168819305
278   -1154 0.153355038
279   -1156 0.137689641
280   -1158 0.124839415
281   -1160 0.114845252
282   -1162 0.107880108
283   -1164 0.102774174
284   -1166 0.099425166
285   -1168 0.097407674
286   -1170 0.09593259
287   -1172 0.095228179
288   -1174 0.094643601
289   -1176 0.093962003
290   -1178 0.092950837
291   -1180 0.092259317
292   -1182 0.092367257
293   -1184 0.09505949
294   -1186 0.10084115
295   -1188 0.108423217
296   -1190 0.11487388
297   -1192 0.117710488
298   -1194 0.115505139
299   -1196 0.108980564
300   -1198 0.099427356
301   -1200 0.088724245
302   -1202 0.077275287
303   -1204 0.065974487
304   -1206 0.055639191
305   -1208 0.046756707
306   -1210 0.040144578
307   -1212 0.035787746
308   -1214 0.033682891
309   -1216 0.033223632
310   -1218 0.034677454
311   -1220 0.036745772
312   -1222 0.038893257
313   -1224 0.041363039
314   -1226 0.044436197
315   -1228 0.048838267
316   -1230 0.054463569
317   -1232 0.06102213
318   -1234 0.068108657
319   -1236 0.074819063
320   -1238 0.080199202
321   -1240 0.083557607
322   -1242 0.084416767
323   -1244 0.082399867
324   -1246 0.078105449
325   -1248 0.072146041
326   -1250 0.065513193
327   -1252 0.059389805
328   -1254 0.054233076
329   -1256 0.05069896
330   -1258 0.048560539
331   -1260 0.048145702
332   -1262 0.049521078
333   -1264 0.051961126
334   -1266 0.055154907
335   -1268 0.058810026
336   -1270 0.062094907
337   -1272 0.063453855
338   -1274 0.061370974
339   -1276 0.056096801
340   -1278 0.048835689
341   -1280 0.041617703
342   -1282 0.035115884
343   -1284 0.029979602
344   -1286 0.02577722
345   -1288 0.022496209
346   -1290 0.020126584
347   -1292 0.018027203
348   -1294 0.016327132
349   -1296 0.014932173
350   -1298 0.013739422
351   -1300 0.01257841
352   -1302 0.011667794
353   -1304 0.010851348
354   -1306 0.010116636
355   -1308 0.009717891
356   -1310 0.009400051
357   -1312 0.009109718
358   -1314 0.00888188
359   -1316 0.008728033
360   -1318 0.008555248
361   -1320 0.008339087
362   -1322 0.008263885
363   -1324 0.008135335
364   -1326 0.008024262
365   -1328 0.00807128
366   -1330 0.008133836
367   -1332 0.008127452
368   -1334 0.008138716
369   -1336 0.008226431
370   -1338 0.008523101
371   -1340 0.008850838
372   -1342 0.008854893
373   -1344 0.009270106
374   -1346 0.009499399
375   -1348 0.010017198
376   -1350 0.01059085
377   -1352 0.011038176
378   -1354 0.011773896
379   -1356 0.012769294
380   -1358 0.013638295
381   -1360 0.014465589
382   -1362 0.01518012
383   -1364 0.015838836
384   -1366 0.015586918
385   -1368 0.015225006
386   -1370 0.014610879
387   -1372 0.014078189
388   -1374 0.013891646
389   -1376 0.01474375
390   -1378 0.016541246
391   -1380 0.019262753
392   -1382 0.02160541
393   -1384 0.022915428
394   -1386 0.023594535
395   -1388 0.023160304
396   -1390 0.021560851
397   -1392 0.019284629
398   -1394 0.017224111
399   -1396 0.015715596
400   -1398 0.01451186
401   -1400 0.013747084
402   -1402 0.012838691
403   -1404 0.011692484
404   -1406 0.010730102
405   -1408 0.009879522
406   -1410 0.009532642
407   -1412 0.009405445
408   -1414 0.009421966
409   -1416 0.009767846
410   -1418 0.010469222
411   -1420 0.012306655
412   -1422 0.014024908
413   -1424 0.017706846
414   -1426 0.022583787
415   -1428 0.029021083
416   -1430 0.037190928
417   -1432 0.044809253
418   -1434 0.049326808
419   -1436 0.046321255
420   -1438 0.046591991
421   -1440 0.044754161
422   -1442 0.045191988
423   -1444 0.047429807
424   -1446 0.05017989
425   -1448 0.051372585
426   -1450 0.051926052
427   -1452 0.048877221
428   -1454 0.045080598
429   -1456 0.038315863
430   -1458 0.036421716
431   -1460 0.035921234
432   -1462 0.033572486
433   -1464 0.030617138
434   -1466 0.029223629
435   -1468 0.028215261
436   -1470 0.027700175
437   -1472 0.026917795
438   -1474 0.029504607
439   -1476 0.030149502
440   -1478 0.032100457
441   -1480 0.033473881
442   -1482 0.035300299
443   -1484 0.036565357
444   -1486 0.036261041
445   -1488 0.033080071
446   -1490 0.027177502
447   -1492 0.022131254
448   -1494 0.01709778
449   -1496 0.013099563
450   -1498 0.010530086
451   -1500 0.008297551
452   -1502 0.006882263
453   -1504 0.005898158
454   -1506 0.007390398
455   -1508 0.005394371
456   -1510 0.00469017
457   -1512 0.004858713
458   -1514 0.004664992
459   -1516 0.005005949
460   -1518 0.004056874
461   -1520 0.004193847
462   -1522 0.003657278
463   -1524 0.00283663
464   -1526 0.002752255
465   -1528 0.002349934
466   -1530 0.002245644
467   -1532 0.002485224
468   -1534 0.002614123
469   -1536 0.002208785
470   -1538 0.003534115
471   -1540 0.00409184
472   -1542 0.003070369
473   -1544 0.00262039
474   -1546 0.002380277
475   -1548 0.00226781
476   -1550 0.002599999
477   -1552 0.002356906
478   -1554 0.003044914
479   -1556 0.002653725
480   -1558 0.006023148
481   -1560 0.004062994
482   -1562 0.002457177
483   -1564 0.002618192
484   -1566 0.002533502
485   -1568 0.002721934
486   -1570 0.002891702
487   -1572 0.002507352
488   -1574 0.002683978
489   -1576 0.003586049
490   -1578 0.002836659
491   -1580 0.002886234
492   -1582 0.002913471
493   -1584 0.003031189
494   -1586 0.003179643
495   -1588 0.003307134
496   -1590 0.003664506
497   -1592 0.003805406
498   -1594 0.004094776
499   -1596 0.00401814
500   -1598 0.00397432
501   -1600 0.004099774
502   -1602 0.00426046
503   -1604 0.004405449
504   -1606 0.004566685
505   -1608 0.004628619
506   -1610 0.004477913
507   -1612 0.004433744
508   -1614 0.004491011
509   -1616 0.005192656
510   -1618 0.004285009
511   -1620 0.004036026
512   -1622 0.004059854
513   -1624 0.004105975
514   -1626 0.003885176
515   -1628 0.003981282
516   -1630 0.003952543
517   -1632 0.003835627
518   -1634 0.004359047
519   -1636 0.004402303
520   -1638 0.004037436
521   -1640 0.003885624
522   -1642 0.004009201
523   -1644 0.003952529
524   -1646 0.004816486
525   -1648 0.004304189
526   -1650 0.003965589
527   -1652 0.006019426
528   -1654 0.004885376
529   -1656 0.004123694
530   -1658 0.004174164
531   -1660 0.004235089
532   -1662 0.004542281
533   -1664 0.004486926
534   -1666 0.004614867
535   -1668 0.004894575
536   -1670 0.005436912
537   -1672 0.005431509
538   -1674 0.005651576
539   -1676 0.006442447
540   -1678 0.006865513
541   -1680 0.007569476
542   -1682 0.008151428
543   -1684 0.009926234
544   -1686 0.010149147
545   -1688 0.010811564
546   -1690 0.011577639
547   -1692 0.012317587
548   -1694 0.013020018
549   -1696 0.014610942
550   -1698 0.015805372
551   -1700 0.016720898
552   -1702 0.02059107
553   -1704 0.022843417
554   -1706 0.026263481
555   -1708 0.031574962
556   -1710 0.03724565
557   -1712 0.044695611
558   -1714 0.051489334
559   -1716 0.064252636
560   -1718 0.079812715
561   -1720 0.111108131
562   -1722 0.134689923
563   -1724 0.159768011
564   -1726 0.178664944
565   -1728 0.189550156
566   -1730 0.187519211
567   -1732 0.184568007
568   -1734 0.148052948
569   -1736 0.174327833
570   -1738 0.157782681
571   -1740 0.130983773
572   -1742 0.111415729
573   -1744 0.081721546
574   -1746 0.057792152
575   -1748 0.038151926
576   -1750 0.026069798
577   -1752 0.017267407
578   -1754 0.012278154
579   -1756 0.009329721
580   -1758 0.007209351
581   -1760 0.00592142
582   -1762 0.005374228
583   -1764 0.004826348
584   -1766 0.004458699
585   -1768 0.004270598
586   -1770 0.003616544
587   -1772 0.003541228
588   -1774 0.002583577
589   -1776 0.002217011
590   -1778 0.001893818
591   -1780 0.001935542
592   -1782 0.001759374
593   -1784 0.001804172
594   -1786 0.001733619
595   -1788 0.001749405
596   -1790 0.001883088
597   -1792 0.001990676
598   -1794 0.00144261
599   -1796 0.001341056
600   -1798 0.001334477
601   -1800 0.001226004
602   -1802 0.001154986
603   -1804 0.000870076
604   -1806 0.000948184
605   -1808 0.000819373
606   -1810 0.000877109
607   -1812 0.000856967
608   -1814 0.000711407
609   -1816 0.000664166
610   -1818 0.000672376
611   -1820 0.000554067
612   -1822 0.000636656
613   -1824 0.000592955
614   -1826 0.000628019
615   -1828 0.000694044
616   -1830 0.000821293
617   -1832 0.000514679
618   -1834 0.000528808
619   -1836 0.000521469
620   -1838 0.000459258
621   -1840 0.000346335
622   -1842 0.000454894
623   -1844 0.000686447
624   -1846 0.000322626
625   -1848 0.00024672
626   -1850 0.00021652
627   -1852 0.000228231
628   -1854 0.000175338
629   -1856 0.00010178
630   -1858 4.80366E-05
631   -1860 0.000163555
632   -1862 0.000163557
633   -1864 3.29655E-05
634   -1866 0.000122024
635   -1868 0.000276251
636   -1870 0.000119215
637   -1872 1.50667E-05
638   -1874 -6.10E-07
639   -1876 -6.29537E-05
640   -1878 -3.01E-06
641   -1880 -6.19819E-05
642   -1882 -2.89042E-05
643   -1884 -4.73032E-05
644   -1886 2.07543E-05
645   -1888 5.82048E-05
646   -1890 9.61175E-05
647   -1892 -2.35233E-05
648   -1894 6.6847E-05
649   -1896 0.000103985
650   -1898 5.14422E-05
651   -1900 9.67797E-05
652   -1902 0.000135013
653   -1904 0.000172139
654   -1906 0.000245935
655   -1908 0.000218667
656   -1910 0.000249944
657   -1912 0.000254151
658   -1914 0.000274606
659   -1916 0.000246846
660   -1918 0.000361489
661   -1920 0.000280901
662   -1922 0.000476067
663   -1924 0.00036462
664   -1926 0.000395353
665   -1928 0.000442112
666   -1930 0.000468113
667   -1932 0.000455817
668   -1934 0.000471815
669   -1936 0.000469251
670   -1938 0.000476748
671   -1940 0.00051635
672   -1942 0.000755845
673   -1944 0.000598315
674   -1946 0.000708495
675   -1948 0.000720105
676   -1950 0.000663963
677   -1952 0.000798318
678   -1954 0.000793038
679   -1956 0.000829472
680   -1958 0.000848898
681   -1960 0.000777441
682   -1962 0.000809709
683   -1964 0.000740382
684   -1966 0.000844927
685   -1968 0.000846562
686   -1970 0.000842945
687   -1972 0.000866656
688   -1974 0.000750066
689   -1976 0.000875148
690   -1978 0.000812096
691   -1980 0.000791832
692   -1982 0.000795131
693   -1984 0.000805046
694   -1986 0.000780545
695   -1988 0.000796985
696   -1990 0.000649182
697   -1992 0.000745563
698   -1994 0.000695543
699   -1996 0.00063712
700   -1998 0.000601964
701   -2000 0.000563163
702   -2002 0.000453067
703   -2004 0.00044115
704   -2006 0.000470968
705   -2008 0.000335742
706   -2010 0.000382163
707   -2012 0.000362654
708   -2014 0.000330121
709   -2016 0.000389084
710   -2018 0.000292435
711   -2020 0.000305525
712   -2022 0.000329511
713   -2024 0.00038482
714   -2026 0.000336523
715   -2028 0.000404901
716   -2030 0.000380554
717   -2032 0.000412551
718   -2034 0.000374696
719   -2036 0.000440636
720   -2038 0.000381711
721   -2040 0.000517346
722   -2042 0.00051384
723   -2044 0.000565282
724   -2046 0.000565683
725   -2048 0.000568611
726   -2050 0.000481456
727   -2052 0.000617706
728   -2054 0.000528906
729   -2056 0.00052708
730   -2058 0.000555077
731   -2060 0.00050699
732   -2062 0.000525236
733   -2064 0.000487272
734   -2066 0.000539501
735   -2068 0.000504029
736   -2070 0.000447441
737   -2072 0.000516835
738   -2074 0.00047662
739   -2076 0.000495004
740   -2078 0.000456273
741   -2080 0.000388805
742   -2082 0.000385634
743   -2084 0.000323494
744   -2086 0.00038231
745   -2088 0.000394126
746   -2090 0.000383939
747   -2092 0.000373967
748   -2094 0.000377053
749   -2096 0.00038487
750   -2098 0.000382643
751   -2100 0.000328327
752   -2102 0.000300287
753   -2104 0.000310617
754   -2106 0.000316786
755   -2108 0.000333295
756   -2110 0.000370022
757   -2112 0.000374474
758   -2114 0.000401404
759   -2116 0.000356568
760   -2118 0.000405314
761   -2120 0.000407752
762   -2122 0.000390354
763   -2124 0.000442652
764   -2126 0.000408173
765   -2128 0.000418827
766   -2130 0.000441786
767   -2132 0.000344844
768   -2134 0.000381584
769   -2136 0.000341404
770   -2138 0.000395361
771   -2140 0.000367725
772   -2142 0.000336463
773   -2144 0.000391147
774   -2146 0.000325835
775   -2148 0.000385238
776   -2150 0.000365225
777   -2152 0.000332808
778   -2154 0.000289714
779   -2156 0.000283791
780   -2158 0.000238881
781   -2160 0.000322866
782   -2162 0.000286869
783   -2164 0.000285061
784   -2166 0.000257684
785   -2168 0.000312025
786   -2170 0.000207802
787   -2172 0.000257015
788   -2174 0.000220017
789   -2176 0.00016785
790   -2178 0.000255717
791   -2180 0.000290103
792   -2182 0.000157789
793   -2184 0.000325881
794   -2186 0.000247926
795   -2188 0.000261432
796   -2190 0.000291347
797   -2192 0.000280254
798   -2194 0.000229609
799   -2196 0.000271056
800   -2198 0.000270504
801   -2200 0.000244769
802   -2202 0.000314874
803   -2204 0.000229367
804   -2206 0.00024547
805   -2208 0.000334635
806   -2210 0.000279933
807   -2212 0.000306569
808   -2214 0.000225706
809   -2216 0.000278309
810   -2218 0.000248559
811   -2220 0.000348697
812   -2222 0.000245079
813   -2224 0.000279928
814   -2226 0.000255734
815   -2228 0.000240166
816   -2230 0.000266871
817   -2232 0.000303392
818   -2234 0.000314343
819   -2236 0.000334341
820   -2238 0.000374558
821   -2240 0.000341859
822   -2242 0.000368978
823   -2244 0.000431373
824   -2246 0.000366414
825   -2248 0.000483577
826   -2250 0.00045685
827   -2252 0.000405578
828   -2254 0.000512095
829   -2256 0.000481377
830   -2258 0.000514157
831   -2260 0.000530324
832   -2262 0.000568964
833   -2264 0.000509579
834   -2266 0.000580748
835   -2268 0.000682969
836   -2270 0.000728429
837   -2272 0.000734436
838   -2274 0.000792405
839   -2276 0.000821361
840   -2278 0.000877556
841   -2280 0.000862509
842   -2282 0.000976614
843   -2284 0.000949856
844   -2286 0.001073058
845   -2288 0.001016429
846   -2290 0.001170663
847   -2292 0.001220265
848   -2294 0.001173101
849   -2296 0.001152461
850   -2298 0.001179885
851   -2300 0.001206089
852   -2302 0.001211066
853   -2304 0.00121729
854   -2306 0.001241695
855   -2308 0.001235318
856   -2310 0.001195495
857   -2312 0.001301991
858   -2314 0.001355443
859   -2316 0.001254785
860   -2318 0.001389052
861   -2320 0.001444937
862   -2322 0.001558414
863   -2324 0.001760601
864   -2326 0.001728333
865   -2328 0.002103392
866   -2330 0.002092697
867   -2332 0.002022837
868   -2334 0.001938495
869   -2336 0.0020431
870   -2338 0.001919468
871   -2340 0.001964749
872   -2342 0.002282832
873   -2344 0.00218892
874   -2346 0.001801857
875   -2348 0.001061079
876   -2350 0.001380168
877   -2352 0.001870321
878   -2354 0.002102202
879   -2356 0.002848422
880   -2358 0.003216502
881   -2360 0.003213061
882   -2362 0.003205797
883   -2364 0.003022776
884   -2366 0.002849123
885   -2368 0.002401033
886   -2370 0.001848448
887   -2372 0.001970318
888   -2374 0.001607119
889   -2376 0.001408379
890   -2378 0.001289805
891   -2380 0.001123742
892   -2382 0.000998744
893   -2384 0.001002353
894   -2386 0.001086115
895   -2388 0.000939055
896   -2390 0.000948007
897   -2392 0.000892462
898   -2394 0.000979962
899   -2396 0.000928222
900   -2398 0.000862539
901   -2400 0.000864195
902   -2402 0.000886066
903   -2404 0.000871955
904   -2406 0.000811919
905   -2408 0.000766513
906   -2410 0.000651421
907   -2412 0.00073298
908   -2414 0.000708139
909   -2416 0.000667666
910   -2418 0.000600986
911   -2420 0.000610649
912   -2422 0.000609326
913   -2424 0.000516116
914   -2426 0.000492454
915   -2428 0.00053116
916   -2430 0.000488114
917   -2432 0.000460177
918   -2434 0.000548829
919   -2436 0.000464511
920   -2438 0.000491215
921   -2440 0.000416051
922   -2442 0.000427695
923   -2444 0.000395537
924   -2446 0.000472624
925   -2448 0.000432484
926   -2450 0.00050012
927   -2452 0.000445504
928   -2454 0.00047767
929   -2456 0.000445421
930   -2458 0.000485085
931   -2460 0.000498423
932   -2462 0.000507363
933   -2464 0.000520304
934   -2466 0.000539524
935   -2468 0.000608413
936   -2470 0.000641548
937   -2472 0.000638234
938   -2474 0.00070156
939   -2476 0.000583209
940   -2478 0.000691745
941   -2480 0.00069634
942   -2482 0.000725514
943   -2484 0.000664786
944   -2486 0.000695592
945   -2488 0.000664905
946   -2490 0.000711927
947   -2492 0.000729764
948   -2494 0.000642008
949   -2496 0.000666359
950   -2498 0.000576481
951   -2500 0.000582793
952   -2502 0.00060028
953   -2504 0.000485827
954   -2506 0.00060824
955   -2508 0.000551492
956   -2510 0.000514196
957   -2512 0.000506979
958   -2514 0.000475469
959   -2516 0.000432219
960   -2518 0.000503847
961   -2520 0.00046777
962   -2522 0.000500639
963   -2524 0.00049432
964   -2526 0.000561426
965   -2528 0.000522532
966   -2530 0.000573555
967   -2532 0.000597892
968   -2534 0.000685061
969   -2536 0.000686714
970   -2538 0.000669184
971   -2540 0.000688841
972   -2542 0.000718256
973   -2544 0.000663613
974   -2546 0.000709431
975   -2548 0.000608731
976   -2550 0.000729101
977   -2552 0.000729371
978   -2554 0.000708222
979   -2556 0.000702107
980   -2558 0.000589917
981   -2560 0.00054794
982   -2562 0.000549422
983   -2564 0.000571636
984   -2566 0.000514345
985   -2568 0.000549508
986   -2570 0.000524453
987   -2572 0.000519339
988   -2574 0.000493066
989   -2576 0.000434176
990   -2578 0.000398249
991   -2580 0.000438974
992   -2582 0.000447631
993   -2584 0.000447255
994   -2586 0.000326312
995   -2588 0.000408195
996   -2590 0.000469383
997   -2592 0.000485155
998   -2594 0.000414225
999   -2596 0.000405927
1000   -2598 0.000367873
1001   -2600 0.000355028
1002   -2602 0.000408022
1003   -2604 0.000409804
1004   -2606 0.000337436
1005   -2608 0.000348352
1006   -2610 0.00035314
1007   -2612 0.000285114
1008   -2614 0.000328725
1009   -2616 0.000270909
1010   -2618 0.000295957
1011   -2620 0.000316483
1012   -2622 0.000322541
1013   -2624 0.000283893
1014   -2626 0.000314178
1015   -2628 0.000268822
1016   -2630 0.000266477
1017   -2632 0.000268892
1018   -2634 0.0002953
1019   -2636 0.000292207
1020   -2638 0.000215858
1021   -2640 0.000294136
1022   -2642 0.000272093
1023   -2644 0.000275717
1024   -2646 0.000346284
1025   -2648 0.000283192
1026   -2650 0.000339755
1027   -2652 0.000255491
1028   -2654 0.000208977
1029   -2656 0.000272149
1030   -2658 0.000282438
1031   -2660 0.000158046
1032   -2662 0.000224042
1033   -2664 0.000228577
1034   -2666 0.00017862
1035   -2668 0.000245571
1036   -2670 0.000196986
1037   -2672 0.000252557
1038   -2674 0.000234491
1039   -2676 0.000203408
1040   -2678 0.00017293
1041   -2680 0.000159348
1042   -2682 0.000234691
1043   -2684 0.000214546
1044   -2686 0.000196188
1045   -2688 0.000157204
1046   -2690 0.000208069
1047   -2692 0.000169639
1048   -2694 0.000218734
1049   -2696 0.000218285
1050   -2698 0.000204734
1051   -2700 0.000201751
1052   -2702 0.000264115
1053   -2704 0.000234648
1054   -2706 0.000212676
1055   -2708 0.000270374
1056   -2710 0.000290756
1057   -2712 0.000240304
1058   -2714 0.000316656
1059   -2716 0.000291376
1060   -2718 0.000294754
1061   -2720 0.000351815
1062   -2722 0.000272567
1063   -2724 0.000249977
1064   -2726 0.00035259
1065   -2728 0.000384766
1066   -2730 0.000393084
1067   -2732 0.000410739
1068   -2734 0.000433305
1069   -2736 0.000404912
1070   -2738 0.000420901
1071   -2740 0.000492476
1072   -2742 0.000399805
1073   -2744 0.000456151
1074   -2746 0.00044387
1075   -2748 0.000409688
1076   -2750 0.000418955
1077   -2752 0.000424004
1078   -2754 0.000451382
1079   -2756 0.000482778
1080   -2758 0.000547175
1081   -2760 0.000552162
1082   -2762 0.000570681
1083   -2764 0.000622641
1084   -2766 0.000691426
1085   -2768 0.000597925
1086   -2770 0.000652725
1087   -2772 0.000584151
1088   -2774 0.000624201
1089   -2776 0.000699342
1090   -2778 0.000638496
1091   -2780 0.000707106
1092   -2782 0.000646861
1093   -2784 0.000709634
1094   -2786 0.000679525
1095   -2788 0.000632315
1096   -2790 0.000696032
1097   -2792 0.000664708
1098   -2794 0.000621352
1099   -2796 0.00073734
1100   -2798 0.000724259
1101   -2800 0.000739695
1102   -2802 0.000776947
1103   -2804 0.000896622
1104   -2806 0.000903473
1105   -2808 0.000879962
1106   -2810 0.000961547
1107   -2812 0.00109481
1108   -2814 0.001158287
1109   -2816 0.001209232
1110   -2818 0.001357019
1111   -2820 0.001408481
1112   -2822 0.001613266
1113   -2824 0.001685368
1114   -2826 0.001927973
1115   -2828 0.002122571
1116   -2830 0.00244482
1117   -2832 0.002763225
1118   -2834 0.003192688
1119   -2836 0.003562301
1120   -2838 0.003995446
1121   -2840 0.004252916
1122   -2842 0.004459092
1123   -2844 0.004622304
1124   -2846 0.004644934
1125   -2848 0.004645169
1126   -2850 0.004785238
1127   -2852 0.004798618
1128   -2854 0.004792012
1129   -2856 0.004820004
1130   -2858 0.004727274
1131   -2860 0.004620571
1132   -2862 0.004699273
1133   -2864 0.004703525
1134   -2866 0.004822295
1135   -2868 0.005009114
1136   -2870 0.005093301
1137   -2872 0.005139671
1138   -2874 0.005266593
1139   -2876 0.005667
1140   -2878 0.005788315
1141   -2880 0.006064578
1142   -2882 0.006338457
1143   -2884 0.006550395
1144   -2886 0.006741246
1145   -2888 0.006945089
1146   -2890 0.007130231
1147   -2892 0.007372441
1148   -2894 0.007579747
1149   -2896 0.007731345
1150   -2898 0.00819576
1151   -2900 0.008562466
1152   -2902 0.00903157
1153   -2904 0.00937914
1154   -2906 0.009851342
1155   -2908 0.010332156
1156   -2910 0.010793932
1157   -2912 0.011308225
1158   -2914 0.011939272
1159   -2916 0.012554826
1160   -2918 0.01337334
1161   -2920 0.014110037
1162   -2922 0.014829331
1163   -2924 0.01536142
1164   -2926 0.015789718
1165   -2928 0.016096233
1166   -2930 0.016316084
1167   -2932 0.016308141
1168   -2934 0.016443279
1169   -2936 0.016680791
1170   -2938 0.017027608
1171   -2940 0.017818197
1172   -2942 0.019401865
1173   -2944 0.021799227
1174   -2946 0.024186537
1175   -2948 0.025801865
1176   -2950 0.02625
1177   -2952 0.02550612
1178   -2954 0.023583511
1179   -2956 0.021342843
1180   -2958 0.01914838
1181   -2960 0.017090145
1182   -2962 0.01539656
1183   -2964 0.013855732
1184   -2966 0.012593295
1185   -2968 0.011483726
1186   -2970 0.01054501
1187   -2972 0.009914023
1188   -2974 0.009757613
1189   -2976 0.009809223
1190   -2978 0.010218257
1191   -2980 0.010809435
1192   -2982 0.011797056
1193   -2984 0.012770905
1194   -2986 0.013636468
1195   -2988 0.014480479
1196   -2990 0.01515069
1197   -2992 0.015619918
1198   -2994 0.015682193
1199   -2996 0.015754709
1200   -2998 0.015366002
1201   -3000 0.014715111
1202   -3002 0.014003
1203   -3004 0.013206518
1204   -3006 0.012292597
1205   -3008 0.011394086
1206   -3010 0.010691684
1207   -3012 0.009936019
1208   -3014 0.009296964
1209   -3016 0.008612659
1210   -3018 0.007984566
1211   -3020 0.007436537
1212   -3022 0.006815112
1213   -3024 0.006429191
1214   -3026 0.005806243
1215   -3028 0.005262323
1216   -3030 0.004768602
1217   -3032 0.004320524
1218   -3034 0.003912193
1219   -3036 0.003421985
1220   -3038 0.003098582
1221   -3040 0.002900269
1222   -3042 0.002511091
1223   -3044 0.002161083
1224   -3046 0.002025539
1225   -3048 0.001869605
1226   -3050 0.001691835
1227   -3052 0.001471398
1228   -3054 0.001359149
1229   -3056 0.00124824
1230   -3058 0.001133357
1231   -3060 0.001085935
1232   -3062 0.001030814
1233   -3064 0.00097166
1234   -3066 0.001020728
1235   -3068 0.000940853
1236   -3070 0.000807141
1237   -3072 0.000755513
1238   -3074 0.000751446
1239   -3076 0.000821568
1240   -3078 0.000793843
1241   -3080 0.000633856
1242   -3082 0.000705054
1243   -3084 0.000693464
1244   -3086 0.000648687
1245   -3088 0.00057882
1246   -3090 0.000621521
1247   -3092 0.000491364
1248   -3094 0.000437328
1249   -3096 0.000406632
1250   -3098 0.000537293
1251   -3100 0.000556879
1252   -3102 0.000452115
1253   -3104 0.000463953
1254   -3106 0.00044965
1255   -3108 0.000471158
1256   -3110 0.000432904
1257   -3112 0.00036216
1258   -3114 0.000454401
1259   -3116 0.000412792
1260   -3118 0.000349278
1261   -3120 0.000378075
1262   -3122 0.000285745
1263   -3124 0.000288687
1264   -3126 0.000338756
1265   -3128 0.000323915
1266   -3130 0.000314324
1267   -3132 0.000371908
1268   -3134 0.00034566
1269   -3136 0.000289967
1270   -3138 0.000259827
1271   -3140 0.000334098
1272   -3142 0.000249786
1273   -3144 0.000306433
1274   -3146 0.000164054
1275   -3148 0.000268845
1276   -3150 0.000311615
1277   -3152 0.000402332
1278   -3154 0.000315994
1279   -3156 0.000353941
1280   -3158 0.000336543
1281   -3160 0.000344823
1282   -3162 0.000370153
1283   -3164 0.000362917
1284   -3166 0.000298576
1285   -3168 0.000363507
1286   -3170 0.000287784
1287   -3172 0.000308446
1288   -3174 0.000250863
1289   -3176 0.000301188
1290   -3178 0.00030549
1291   -3180 0.000281667
1292   -3182 0.00027927
1293   -3184 0.00027765
1294   -3186 0.000293586
1295   -3188 0.000355302
1296   -3190 0.000335228
1297   -3192 0.000335549
1298   -3194 0.000362798
1299   -3196 0.000295649
1300   -3198 0.000373852
1301   -3200 0.000328326
1302   -3202 0.000358333
1303   -3204 0.00032544
1304   -3206 0.000387597
1305   -3208 0.000430661
1306   -3210 0.000417581
1307   -3212 0.000324994
1308   -3214 0.000444512
1309   -3216 0.000400082
1310   -3218 0.000377286
1311   -3220 0.000437329
1312   -3222 0.000356377
1313   -3224 0.000352642
1314   -3226 0.000311089
1315   -3228 0.000382579
1316   -3230 0.000329813
1317   -3232 0.000447714
1318   -3234 0.000472512
1319   -3236 0.000457032
1320   -3238 0.000472607
1321   -3240 0.000363677
1322   -3242 0.000394328
1323   -3244 0.000461889
1324   -3246 0.000490442
1325   -3248 0.000438482
1326   -3250 0.000423751
1327   -3252 0.000433888
1328   -3254 0.000499297
1329   -3256 0.000498987
1330   -3258 0.000465415
1331   -3260 0.000421804
1332   -3262 0.000414397
1333   -3264 0.000405735
1334   -3266 0.000487632
1335   -3268 0.000512952
1336   -3270 0.000538537
1337   -3272 0.000552512
1338   -3274 0.000565302
1339   -3276 0.00052271
1340   -3278 0.000486071
1341   -3280 0.000553016
1342   -3282 0.000551074
1343   -3284 0.000550423
1344   -3286 0.000552049
1345   -3288 0.000582685
1346   -3290 0.000602594
1347   -3292 0.00065031
1348   -3294 0.000492417
1349   -3296 0.000568134
1350   -3298 0.000560644
1351   -3300 0.000606052
1352   -3302 0.000632562
1353   -3304 0.000613536
1354   -3306 0.000629737
1355   -3308 0.000723508
1356   -3310 0.000610128
1357   -3312 0.000629599
1358   -3314 0.00061646
1359   -3316 0.000644116
1360   -3318 0.000657711
1361   -3320 0.000671348
1362   -3322 0.000732666
1363   -3324 0.000591952
1364   -3326 0.000639223
1365   -3328 0.000631524
1366   -3330 0.000664578
1367   -3332 0.000750598
1368   -3334 0.000710665
1369   -3336 0.000775822
1370   -3338 0.000768051
1371   -3340 0.000722316
1372   -3342 0.000659833
1373   -3344 0.000705481
1374   -3346 0.000739379
1375   -3348 0.000754306
1376   -3350 0.000858934
1377   -3352 0.000773878
1378   -3354 0.000745424
1379   -3356 0.000749742
1380   -3358 0.00082974
1381   -3360 0.000824431
1382   -3362 0.000877307
1383   -3364 0.000932521
1384   -3366 0.00087025
1385   -3368 0.000887279
1386   -3370 0.000847555
1387   -3372 0.000884819
1388   -3374 0.00087596
1389   -3376 0.000857088
1390   -3378 0.00093776
1391   -3380 0.001039654
1392   -3382 0.001065518
1393   -3384 0.00099205
1394   -3386 0.00099477
1395   -3388 0.000961683
1396   -3390 0.001041186
1397   -3392 0.001128488
1398   -3394 0.001144315
1399   -3396 0.001224228
1400   -3398 0.001154251
1401   -3400 0.001138032
1402   -3402 0.001173604
1403   -3404 0.001248265
1404   -3406 0.001356015
1405   -3408 0.001285042
1406   -3410 0.001316454
1407   -3412 0.001415994
1408   -3414 0.001463886
1409   -3416 0.001644794
1410   -3418 0.001713653
1411   -3420 0.001730308
1412   -3422 0.001932657
1413   -3424 0.001949152
1414   -3426 0.002006968
1415   -3428 0.0020619
1416   -3430 0.002087098
1417   -3432 0.002206993
1418   -3434 0.001964774
1419   -3436 0.002028821
1420   -3438 0.002393625
1421   -3440 0.002708104
1422   -3442 0.002798177
1423   -3444 0.002983385
1424   -3446 0.00291298
1425   -3448 0.002991802
1426   -3450 0.003001868
1427   -3452 0.003042922
1428   -3454 0.002947307
1429   -3456 0.003051547
1430   -3458 0.00264556
1431   -3460 0.002413914
1432   -3462 0.002811906
1433   -3464 0.002335021
1434   -3466 0.001661673
1435   -3468 0.001509012
1436   -3470 0.002093659
1437   -3472 0.002451124
1438   -3474 0.002367439
1439   -3476 0.002393187
1440   -3478 0.001892594
1441   -3480 0.002007355
1442   -3482 0.002249049
1443   -3484 0.002021025
1444   -3486 0.001697064
1445   -3488 0.001840785
1446   -3490 0.001717791
1447   -3492 0.001588541
1448   -3494 0.001424759
1449   -3496 0.001349834
1450   -3498 0.001273596
1451   -3500 0.001208783
1452   -3502 0.001134414
1453   -3504 0.001144532
1454   -3506 0.001002239
1455   -3508 0.001010699
1456   -3510 0.001003586
1457   -3512 0.000904709
1458   -3514 0.000965619
1459   -3516 0.000937276
1460   -3518 0.00097229
1461   -3520 0.000924807
1462   -3522 0.00095119
1463   -3524 0.000890108
1464   -3526 0.000873585
1465   -3528 0.000885436
1466   -3530 0.000885047
1467   -3532 0.000952793
1468   -3534 0.001030164
1469   -3536 0.000992343
1470   -3538 0.000971817
1471   -3540 0.000915465
1472   -3542 0.000959877
1473   -3544 0.001059664
1474   -3546 0.001041402
1475   -3548 0.00090259
1476   -3550 0.000980567
1477   -3552 0.000914447
1478   -3554 0.00080593
1479   -3556 0.000844328
1480   -3558 0.000743256
1481   -3560 0.000855686
1482   -3562 0.000738947
1483   -3564 0.000834279
1484   -3566 0.001144887
1485   -3568 0.000842023
1486   -3570 0.00067585
1487   -3572 0.000602224
1488   -3574 0.000682329
1489   -3576 0.000581809
1490   -3578 0.000568449
1491   -3580 0.000575447
1492   -3582 0.000481773
1493   -3584 0.000581484
1494   -3586 0.00081874
1495   -3588 0.000617644
1496   -3590 0.000442477
1497   -3592 0.000640158
1498   -3594 0.000675461
1499   -3596 0.00051728
1500   -3598 0.000597346
1501   -3600 0.000584266
1502   -3602 0.0004527
1503   -3604 0.000522512
1504   -3606 0.000624314
1505   -3608 0.000574119
1506   -3610 0.000608948
1507   -3612 0.0008001
1508   -3614 0.000712729
1509   -3616 0.000617938
1510   -3618 0.000826828
1511   -3620 0.000760759
1512   -3622 0.000538546
1513   -3624 0.000557439
1514   -3626 0.0007446
1515   -3628 0.00119225
1516   -3630 0.000526519
1517   -3632 0.000556606
1518   -3634 0.000556875
1519   -3636 0.000506369
1520   -3638 0.000552368
1521   -3640 0.000484705
1522   -3642 0.000499876
1523   -3644 0.000531957
1524   -3646 0.001003344
1525   -3648 0.000945893
1526   -3650 0.000999296
1527   -3652 0.000369562
1528   -3654 0.000439893
1529   -3656 0.000386363
1530   -3658 0.000306059
1531   -3660 0.000268561
1532   -3662 0.000200995
1533   -3664 0.000216152
1534   -3666 0.00031073
1535   -3668 0.000539568
1536   -3670 0.000482811
1537   -3672 0.000170902
1538   -3674 0.001357086
1539   -3676 0.00034876
1540   -3678 0.000117241
1541   -3680 0.000137332
1542   -3682 0.000159181
1543   -3684 0.000118508
1544   -3686 0.000149121
1545   -3688 0.000421635
1546   -3690 0.000330956
1547   -3692 -1.81766E-05
1548   -3694 -2.72672E-05
1549   -3696 -6.55202E-05
1550   -3698 -8.60E-06
1551   -3700 1.51871E-05
1552   -3702 2.32458E-05
1553   -3704 -0.000101734
1554   -3706 -5.30903E-05
1555   -3708 0.000113641
1556   -3710 0.000309234
1557   -3712 0.000106649
1558   -3714 -3.12E-06
1559   -3716 -5.76521E-05
1560   -3718 0.000110276
1561   -3720 9.06626E-05
1562   -3722 9.32628E-05
1563   -3724 -1.2309E-05
1564   -3726 4.60304E-05
1565   -3728 -8.27521E-05
1566   -3730 0.000105094
1567   -3732 0.000359337
1568   -3734 0.000615865
1569   -3736 0.000442528
1570   -3738 3.18536E-05
1571   -3740 3.5789E-05
1572   -3742 0.000292863
1573   -3744 0.000969885
1574   -3746 0.000136573
1575   -3748 0.000457883
1576   -3750 0.00039287
1577   -3752 0.000280102
1578   -3754 8.33166E-05
1579   -3756 0.000108764
1580   -3758 0.00020727
1581   -3760 7.00378E-05
1582   -3762 -5.27051E-05
1583   -3764 0.000139553
1584   -3766 -1.72393E-05
1585   -3768 7.03872E-05
1586   -3770 -2.01502E-05
1587   -3772 -0.000120557
1588   -3774 -8.82563E-05
1589   -3776 -2.43E-06
1590   -3778 0.00019793
1591   -3780 4.93405E-05
1592   -3782 1.94903E-05
1593   -3784 1.86442E-05
1594   -3786 -0.000137666
1595   -3788 -3.29324E-05
1596   -3790 -9.87411E-05
1597   -3792 -1.07826E-05
1598   -3794 2.08248E-05
1599   -3796 0.000114587
1600   -3798 7.00175E-05
1601   -3800 0.000491793
1602   -3802 6.04807E-05
1603   -3804 3.25705E-05
1604   -3806 0.000310394
1605   -3808 2.15496E-05
1606   -3810 8.00694E-05
1607   -3812 0.000109453
1608   -3814 0.00030066
1609   -3816 0.000393264
1610   -3818 0.000178967
1611   -3820 0.000808506
1612   -3822 0.000105035
1613   -3824 8.46296E-05
1614   -3826 0.000121773
1615   -3828 0.000135065
1616   -3830 0.000274273
1617   -3832 8.69895E-05
1618   -3834 0.000222838
1619   -3836 0.000601996
1620   -3838 0.000338187
1621   -3840 0.00024193
1622   -3842 0.000133521
1623   -3844 8.45357E-05
1624   -3846 1.83423E-05
1625   -3848 3.48799E-05
1626   -3850 0.000272218
1627   -3852 0.001030866
1628   -3854 0.000469528
1629   -3856 0.000142735
1630   -3858 6.34538E-05
1631   -3860 0.000145079
1632   -3862 0.000227556
1633   -3864 0.000296134
1634   -3866 0.000137378
1635   -3868 0.000451376
1636   -3870 0.000226189
1637   -3872 0.000119799
1638   -3874 0.000122617
1639   -3876 5.18662E-05
1640   -3878 0.000219086
1641   -3880 0.000268173
1642   -3882 0.000210735
1643   -3884 0.000346726
1644   -3886 0.000183689
1645   -3888 0.000124343
1646   -3890 0.000288181
1647   -3892 1.78834E-05
1648   -3894 9.95453E-05
1649   -3896 0.000185088
1650   -3898 0.000404097
1651   -3900 0.000218476
1652   -3902 0.000267402
1653   -3904 0.000295706
1654   -3906 0.000103094
1655   -3908 0.000101332
1656   -3910 0.000105612
1657   -3912 5.01633E-05
1658   -3914 5.69529E-05
1659   -3916 0.000170528
1660   -3918 9.52556E-05
1661   -3920 0.000168842
1662   -3922 0.00010632
1663   -3924 0.000344961
1664   -3926 7.59984E-05
1665   -3928 0.000221155
1666   -3930 8.75421E-05
1667   -3932 0.000298592
1668   -3934 9.37313E-05
1669   -3936 0.000114365
1670   -3938 0.000223073
1671   -3940 0.000267331
1672   -3942 0.000273424
1673   -3944 0.000143308
1674   -3946 0.000155693
1675   -3948 0.000195926
1676   -3950 0.00020435
1677   -3952 0.000132183
1678   -3954 0.000197331
1679   -3956 0.000248508
1680   -3958 0.000140694
1681   -3960 0.000166407
1682   -3962 0.000118974
1683   -3964 7.31663E-05
1684   -3966 0.00011566
1685   -3968 7.56379E-05
1686   -3970 0.000137593
1687   -3972 0.000116022
1688   -3974 0.000186931
1689   -3976 0.000201803
1690   -3978 0.000150322
1691   -3980 0.000141396
1692   -3982 0.000187293
1693   -3984 0.000263054
1694   -3986 0.000212817
1695   -3988 0.000210708
1696   -3990 0.000217985
1697   -3992 0.000192881
1698   -3994 0.000182579
1699   -3996 0.000164746
1700   -3998 0.000200347
1701   -4000 0.000253085
1702   -4002 0.000171612
1703   -4004 0.000149877
1704   -4006 0.000208808
1705   -4008 0.000140164
1706   -4010 0.000188787
1707   -4012 0.000168944
1708   -4014 0.000177989
1709   -4016 0.000163891
1710   -4018 0.000158359
1711   -4020 0.000136663
1712   -4022 0.000216707
1713   -4024 0.000191577
1714   -4026 0.000150521
1715   -4028 0.000122795
1716   -4030 0.000181619
1717   -4032 0.000211165
1718   -4034 0.000247671
1719   -4036 0.000213884
1720   -4038 0.000193577
1721   -4040 0.000142549
1722   -4042 0.000158466
1723   -4044 0.000246274
1724   -4046 0.000177406
1725   -4048 0.000166641
1726   -4050 0.000176623
1727   -4052 0.000228601
1728   -4054 0.000144074
1729   -4056 0.000218833
1730   -4058 0.000200763
1731   -4060 0.000151771
1732   -4062 0.00015336
1733   -4064 0.000139108
1734   -4066 0.000169462
1735   -4068 0.000123463
1736   -4070 0.000202624
1737   -4072 0.000208393
1738   -4074 0.000167816
1739   -4076 0.000174958
1740   -4078 0.000210896
1741   -4080 0.000207398
1742   -4082 0.000127384
1743   -4084 0.000173693
1744   -4086 0.000200631
1745   -4088 0.000269673
1746   -4090 0.000223231
1747   -4092 0.00029172
1748   -4094 0.00031649
1749   -4096 0.000285588
1750   -4098 0.000251761
1751   -4100 0.000339028
1752   -4102 0.000298703
1753   -4104 0.00024852
1754   -4106 0.000209136
1755   -4108 0.000246085
1756   -4110 0.000282685
1757   -4112 0.000191696
1758   -4114 0.000254014
1759   -4116 0.000228422
1760   -4118 0.000306607
1761   -4120 0.000229142
1762   -4122 0.000348631
1763   -4124 0.000287556
1764   -4126 0.000264232
1765   -4128 0.000209319
1766   -4130 0.000242237
1767   -4132 0.000281044
1768   -4134 0.000321739
1769   -4136 0.000294847
1770   -4138 0.000347712
1771   -4140 0.00036883
1772   -4142 0.000328563
1773   -4144 0.000261437
1774   -4146 0.000334065
1775   -4148 0.000325497
1776   -4150 0.000275545
1777   -4152 0.000358192
1778   -4154 0.000286392
1779   -4156 0.000456376
1780   -4158 0.000388783
1781   -4160 0.000360544
1782   -4162 0.000365173
1783   -4164 0.00028698
1784   -4166 0.000371822
1785   -4168 0.000364618
1786   -4170 0.000288243
1787   -4172 0.000307984
1788   -4174 0.000332854
1789   -4176 0.00032695
1790   -4178 0.000388172
1791   -4180 0.000348726
1792   -4182 0.000368687
1793   -4184 0.000341082
1794   -4186 0.000304622
1795   -4188 0.000287432
1796   -4190 0.00031641
1797   -4192 0.000327385
1798   -4194 0.000313965
1799   -4196 0.000378199
1800   -4198 0.000292018
1801   -4200 0.000371458
1802   -4202 0.000405758
1803   -4204 0.000408023
1804   -4206 0.000371601
1805   -4208 0.000316549
1806   -4210 0.000408096
1807   -4212 0.000363203
1808   -4214 0.00032933
1809   -4216 0.00043362
1810   -4218 0.000370029
1811   -4220 0.000360431
1812   -4222 0.000390905
1813   -4224 0.000308371
1814   -4226 0.000243889
1815   -4228 0.000400749
1816   -4230 0.000232047
1817   -4232 0.00038913
1818   -4234 0.000202101
1819   -4236 0.000313043
1820   -4238 0.000234972
1821   -4240 0.000299282
1822   -4242 0.000291387
1823   -4244 0.000257221
1824   -4246 0.000254894
1825   -4248 0.000313133
1826   -4250 0.000272395
1827   -4252 0.000329282
1828   -4254 0.000211776
1829   -4256 0.000161765
1830   -4258 0.0002771
1831   -4260 0.000244175
1832   -4262 0.00024201
1833   -4264 0.000174491
1834   -4266 0.000304066
1835   -4268 0.000350939
1836   -4270 0.000355563
1837   -4272 0.000271775
1838   -4274 0.000291467
1839   -4276 0.000230176
1840   -4278 0.000394533
1841   -4280 0.000249728
1842   -4282 0.000215013
1843   -4284 0.000246479
1844   -4286 0.000326038
1845   -4288 0.000189699
1846   -4290 0.000268778
1847   -4292 0.00013331
1848   -4294 0.000323916
1849   -4296 0.000216853
1850   -4298 0.000291581
1851   -4300 0.000314194
1852   -4302 0.000279978
1853   -4304 0.00021133
1854   -4306 0.000270665
1855   -4308 0.000204827
1856   -4310 0.000296492
1857   -4312 0.000272268
1858   -4314 0.000237342
1859   -4316 0.000281693
1860   -4318 0.000289106
1861   -4320 0.000303374
1862   -4322 0.000325679
1863   -4324 0.000239933
1864   -4326 0.000314462
1865   -4328 0.000253209
1866   -4330 0.000241805
1867   -4332 0.000351215
1868   -4334 0.000286358
1869   -4336 0.000330223
1870   -4338 0.000369278
1871   -4340 0.000329129
1872   -4342 0.000275593
1873   -4344 0.00029688
1874   -4346 0.000346473
1875   -4348 0.000352509
1876   -4350 0.000355569
1877   -4352 0.000461464
1878   -4354 0.000250317
1879   -4356 0.000427547
1880   -4358 0.000434099
1881   -4360 0.000343595
1882   -4362 0.000350079
1883   -4364 0.000408112
1884   -4366 0.000350043
1885   -4368 0.000411028
1886   -4370 0.000434798
1887   -4372 0.000409623
1888   -4374 0.000423228
1889   -4376 0.00037185
1890   -4378 0.000433805
1891   -4380 0.000454019
1892   -4382 0.000443482
1893   -4384 0.000545947
1894   -4386 0.000429948
1895   -4388 0.00038776
1896   -4390 0.000416255
1897   -4392 0.00040207
1898   -4394 0.000397386
1899   -4396 0.00040638
1900   -4398 0.000369246
1901   -4400 0.000460818
1902   -4402 0.000381619
1903   -4404 0.000382068
1904   -4406 0.00032482
1905   -4408 0.000457543
1906   -4410 0.000455416
1907   -4412 0.000487212
1908   -4414 0.000417398
1909   -4416 0.000382643
1910   -4418 0.000403196
1911   -4420 0.000493331
1912   -4422 0.000341439
1913   -4424 0.000513969
1914   -4426 0.000587223
1915   -4428 0.000580159
1916   -4430 0.000557957
1917   -4432 0.000556266
1918   -4434 0.000517113
1919   -4436 0.000660822
1920   -4438 0.000569927
1921   -4440 0.000582118
1922   -4442 0.000542652
1923   -4444 0.000591509
1924   -4446 0.000512382
1925   -4448 0.000560221
1926   -4450 0.000487317
1927   -4452 0.000482114
1928   -4454 0.000461281
1929   -4456 0.000393521
1930   -4458 0.000388897
1931   -4460 0.000397314
1932   -4462 0.000315475
1933   -4464 0.000310207
1934   -4466 0.000266723
1935   -4468 0.000339416
1936   -4470 0.000292223
1937   -4472 0.000281582
1938   -4474 0.000329826
1939   -4476 0.000289373
1940   -4478 0.00021093
1941   -4480 0.000174358
1942   -4482 0.000341538
1943   -4484 0.000247057
1944   -4486 0.000273322
1945   -4488 0.000234901
1946   -4490 0.000203559
1947   -4492 0.000129721
1948   -4494 7.83785E-05
1949   -4496 0.000190952
1950   -4498 0.000131392
1951   -4500 0.000193057
1952   -4502 1.24492E-05
1953   -4504 9.08797E-05
1954   -4506 0.000144288
1955   -4508 0.000127571
1956   -4510 2.51343E-05
1957   -4512 7.48194E-05
1958   -4514 0.000103584
1959   -4516 4.19407E-05
1960   -4518 2.40009E-05
1961   -4520 0.000102142
1962   -4522 1.18914E-05
1963   -4524 5.72128E-05
1964   -4526 -8.73734E-05
1965   -4528 -1.76682E-05
1966   -4530 -4.90721E-05
1967   -4532 -4.71309E-05
1968   -4534 3.91112E-05
1969   -4536 1.34E-06
1970   -4538 9.62881E-05
1971   -4540 3.37309E-05
1972   -4542 -2.91281E-05
1973   -4544 -3.2849E-05
1974   -4546 -1.58304E-05
1975   -4548 0.000110588
1976   -4550 7.05284E-05
1977   -4552 7.94542E-05
1978   -4554 3.37392E-05
1979   -4556 -9.20E-06
1980   -4558 -2.21519E-05
1981   -4560 3.46914E-05
1982   -4562 5.61431E-05
1983   -4564 8.01E-06
1984   -4566 -0.000103626
1985   -4568 3.34905E-05
1986   -4570 -2.32184E-05
1987   -4572 -1.08982E-05
1988   -4574 4.1603E-05
1989   -4576 -5.00568E-05
1990   -4578 -6.83E-06
1991   -4580 2.7055E-05
1992   -4582 2.86344E-05
1993   -4584 5.87E-06
1994   -4586 -6.99461E-05
1995   -4588 -8.39377E-05
1996   -4590 3.60434E-05
1997   -4592 7.96765E-05
1998   -4594 -0.000177672
1999   -4596 -3.17066E-05
2000   -4598 3.72168E-05
2001   -4600 -6.88E-06
2002   -4602 -6.03735E-05
2003   -4604 4.66722E-05
2004   -4606 -3.54641E-05
2005   -4608 -1.74806E-05
2006   -4610 -1.28922E-05
2007   -4612 7.60359E-05
2008   -4614 8.66487E-05
2009   -4616 9.21211E-05
2010   -4618 -5.23373E-05
2011   -4620 -5.48989E-05
2012   -4622 -6.38442E-05
2013   -4624 3.55E-07
2014   -4626 5.57926E-05
2015   -4628 -4.49083E-05
2016   -4630 -2.67924E-05
2017   -4632 -7.71728E-05
2018   -4634 3.694E-05
2019   -4636 0.00012611
2020   -4638 -5.57319E-05
2021   -4640 -4.87582E-05
2022   -4642 9.33695E-05
2023   -4644 0.000127693
2024   -4646 -2.1893E-05
2025   -4648 3.65E-06
2026   -4650 -3.07E-06
2027   -4652 -2.23231E-05
2028   -4654 5.90752E-05
2029   -4656 1.12225E-05
2030   -4658 3.36415E-05
2031   -4660 -9.07325E-05
2032   -4662 -2.33188E-05
2033   -4664 7.71021E-05
2034   -4666 2.75205E-05
2035   -4668 5.73118E-05
2036   -4670 0.000100899
2037   -4672 5.6625E-05
2038   -4674 0.000142437
2039   -4676 -2.07439E-05
2040   -4678 -1.93856E-05
2041   -4680 9.87695E-05
2042   -4682 4.89309E-05
2043   -4684 3.68502E-05
2044   -4686 0.000153062
2045   -4688 8.76468E-05
2046   -4690 0.000112023
2047   -4692 -9.49E-06
2048   -4694 2.66218E-05
2049   -4696 -5.76107E-05
2050   -4698 -8.38058E-05
2051   -4700 -2.9238E-05
2052   -4702 -3.11E-06
2053   -4704 8.99146E-05
2054   -4706 1.31697E-05
2055   -4708 -9.5303E-05
2056   -4710 -2.87252E-05
2057   -4712 3.52673E-05
2058   -4714 0.000136868
2059   -4716 7.36812E-05
2060   -4718 4.36516E-05
2061   -4720 -4.05162E-05
2062   -4722 -2.18182E-05
2063   -4724 1.13599E-05
2064   -4726 -4.26783E-05
2065   -4728 4.49779E-05
2066   -4730 5.46657E-05
2067   -4732 6.31277E-05
2068   -4734 9.201E-05
2069   -4736 -2.84995E-05
2070   -4738 -1.96E-06
2071   -4740 4.16116E-05
2072   -4742 2.40E-06
2073   -4744 0.000106433
2074   -4746 7.86067E-05
2075   -4748 -2.31924E-05
2076   -4750 0.000110697
2077   -4752 -0.000105205
2078   -4754 -4.20045E-05
2079   -4756 5.92E-06
2080   -4758 -4.33579E-05
2081   -4760 -0.00010886
2082   -4762 -7.24948E-05
2083   -4764 3.96924E-05
2084   -4766 -0.000191847
2085   -4768 -0.000117285
2086   -4770 -6.34291E-05
2087   -4772 2.12932E-05
2088   -4774 -3.24E-06
2089   -4776 1.09424E-05
2090   -4778 -8.83467E-05
2091   -4780 3.50E-06
2092   -4782 -0.000107665
2093   -4784 -4.71369E-05
2094   -4786 -0.000105939
2095   -4788 -1.78558E-05
2096   -4790 -6.54974E-05
2097   -4792 -6.69849E-05
2098   -4794 -0.000104735
2099   -4796 6.49E-06
2100   -4798 -0.000146163
2101   -4800 8.23E-06
2102   -4802 -3.12394E-05
2103   -4804 -0.000185322
2104   -4806 -8.58323E-05
2105   -4808 -0.000100005
2106   -4810 -0.00011669
2107   -4812 -0.000133039
2108   -4814 -7.84302E-05
2109   -4816 -9.72117E-05
2110   -4818 -7.66769E-05
2111   -4820 -9.0187E-05
2112   -4822 -0.000155309
2113   -4824 2.07393E-05
2114   -4826 5.72E-06
2115   -4828 -4.57609E-05
2116   -4830 -0.000194768
2117   -4832 -0.000133392
2118   -4834 -0.000165423
2119   -4836 -0.000152181
2120   -4838 -0.00017315
2121   -4840 -6.8367E-05
2122   -4842 -0.000168049
2123   -4844 -9.85448E-05
2124   -4846 -1.83435E-05
2125   -4848 -4.66214E-05
2126   -4850 -6.72124E-05
2127   -4852 -8.60337E-05
2128   -4854 -0.000139507
2129   -4856 -7.10E-06
2130   -4858 -9.54554E-05
2131   -4860 -7.87667E-05
2132   -4862 -0.000169032
2133   -4864 4.42985E-05
2134   -4866 -5.87E-06
2135   -4868 -5.49307E-05
2136   -4870 -9.6575E-05
2137   -4872 -0.000134905
2138   -4874 -9.29933E-05
2139   -4876 -8.09305E-05
2140   -4878 -0.000291688
2141   -4880 -9.6625E-05
2142   -4882 -0.000130894
2143   -4884 -0.000118673
2144   -4886 -0.00013703
2145   -4888 -0.000117201
2146   -4890 -2.7273E-05
2147   -4892 -0.000149352
2148   -4894 -6.61949E-05
2149   -4896 -0.000129105
2150   -4898 -0.000158602
2151   -4900 -8.34552E-05
2152   -4902 -0.000109603
2153   -4904 -0.00014692
2154   -4906 -0.000183268
2155   -4908 -9.97988E-05
2156   -4910 -0.000229024
2157   -4912 -1.11176E-05
2158   -4914 -0.000155447
2159   -4916 -8.83261E-05
2160   -4918 -7.58636E-05
2161   -4920 -0.000157625
2162   -4922 -0.000196801
2163   -4924 -8.35149E-05
2164   -4926 -9.21691E-05
2165   -4928 -3.23171E-05
2166   -4930 -0.000193988
2167   -4932 -9.61135E-05
2168   -4934 -0.000101847
2169   -4936 -6.05769E-05
2170   -4938 -0.000123916
2171   -4940 -0.000132141
2172   -4942 -0.00013735
2173   -4944 -0.000136462
2174   -4946 -0.000101766
2175   -4948 -0.000154092
2176   -4950 -0.000214223
2177   -4952 -0.000117774
2178   -4954 -7.17024E-05
2179   -4956 -0.000183699
2180   -4958 -0.00017453
2181   -4960 -0.000249751
2182   -4962 -0.000132127
2183   -4964 5.13399E-05
2184   -4966 -4.20862E-05
2185   -4968 -2.52E-06
2186   -4970 -0.000180519
2187   -4972 -9.29657E-05
2188   -4974 -0.000190246
2189   -4976 -0.000125231
2190   -4978 3.1279E-05
2191   -4980 -0.000248043
2192   -4982 -0.000134352
2193   -4984 -2.83712E-05
2194   -4986 -0.000106364
2195   -4988 -0.000176678
2196   -4990 -4.92341E-05
2197   -4992 -5.76105E-05
2198   -4994 -0.000122315
2199   -4996 -0.000196789
2200   -4998 -5.34783E-05
2201   -5000 -6.5335E-05
2202   -5002 -0.000226349
2203   -5004 -0.000101908
2204   -5006 -6.35036E-05
2205   -5008 -0.000183858
2206   -5010 -1.66743E-05
2207   -5012 -0.000130706
2208   -5014 4.27E-06
2209   -5016 -3.28712E-05
2210   -5018 -0.000182452
2211   -5020 -6.57517E-05
2212   -5022 -6.14048E-05
2213   -5024 -5.15595E-05
2214   -5026 -5.28437E-05
2215   -5028 -0.000128204
2216   -5030 -8.17912E-05
2217   -5032 -5.30334E-05
2218   -5034 4.59457E-05
2219   -5036 -5.073E-05
2220   -5038 -1.4378E-05
2221   -5040 -0.000191915
2222   -5042 -7.42078E-05
2223   -5044 -0.000115069
2224   -5046 -0.000147359
2225   -5048 -5.59493E-05
2226   -5050 -0.000110795
2227   -5052 2.13693E-05
2228   -5054 -3.90667E-05
2229   -5056 -4.18254E-05
2230   -5058 -0.000221218
2231   -5060 -0.000171646
2232   -5062 -4.28584E-05
2233   -5064 -0.000103295
2234   -5066 6.28557E-05
2235   -5068 -6.38849E-05
2236   -5070 -7.2519E-05
2237   -5072 -4.04725E-05
2238   -5074 -0.000162146
2239   -5076 -6.50715E-05
2240   -5078 -4.47088E-05
2241   -5080 -8.4281E-05
2242   -5082 -8.43487E-05
2243   -5084 -0.000186466
2244   -5086 -0.000247114
2245   -5088 -3.90E-07
2246   -5090 -0.000131357
2247   -5092 -0.000165973
2248   -5094 3.69467E-05
2249   -5096 -1.92271E-05
2250   -5098 -3.22E-06
2251   -5100 -2.12904E-05
2252   -5102 -6.97464E-05
2253   -5104 -0.000102491
2254   -5106 -0.000121148
2255   -5108 -3.97039E-05
2256   -5110 -5.85939E-05
2257   -5112 -0.000273178
2258   -5114 -5.84787E-05
2259   -5116 5.61396E-05
2260   -5118 -5.16509E-05
2261   -5120 -0.00018082
2262   -5122 -5.49575E-05
2263   -5124 -0.000178501
2264   -5126 -0.000111293
2265   -5128 -0.000142361
2266   -5130 3.78E-06
2267   -5132 -5.02351E-05
2268   -5134 9.15343E-05
2269   -5136 -4.70089E-05
2270   -5138 -0.00010954
2271   -5140 1.13571E-05
2272   -5142 4.82898E-05
2273   -5144 3.77874E-05
2274   -5146 -5.93503E-05
2275   -5148 -0.000164972
2276   -5150 -8.57053E-05
2277   -5152 -0.000197877
2278   -5154 -1.85536E-05
2279   -5156 -0.000278435
2280   -5158 -5.9856E-05
2281   -5160 -5.08827E-05
2282   -5162 0.000122482
2283   -5164 5.08896E-05
2284   -5166 5.83805E-05
2285   -5168 -0.00012685
2286   -5170 0.000164092
2287   -5172 -0.000114154
2288   -5174 4.62051E-05
2289   -5176 5.11492E-05
2290   -5178 -4.62975E-05
2291   -5180 0.000174738
2292   -5182 -0.000105599
2293   -5184 -2.24336E-05
2294   -5186 6.56395E-05
2295   -5188 -5.17781E-05
2296   -5190 7.28549E-05
2297   -5192 -6.157E-05
2298   -5194 2.61121E-05
2299   -5196 0.000121307
2300   -5198 3.9461E-05
2301   -5200 6.95204E-05
2302   -5202 -0.000152101
2303   -5204 -1.45664E-05
2304   -5206 -2.81734E-05
2305   -5208 3.3733E-05
2306   -5210 -0.000191675
2307   -5212 -0.000238876
2308   -5214 5.27E-06
2309   -5216 -5.55352E-05
2310   -5218 -0.000242827
2311   -5220 3.41334E-05
2312   -5222 -0.000214394
2313   -5224 1.97708E-05
2314   -5226 8.8285E-05
2315   -5228 0.000103699
2316   -5230 -6.78999E-05
2317   -5232 -6.29237E-05
2318   -5234 5.72257E-05
2319   -5236 -1.89721E-05
2320   -5238 -0.000113873
2321   -5240 -4.68908E-05
2322   -5242 -3.77538E-05
2323   -5244 0.000139638
2324   -5246 -4.43735E-05
2325   -5248 -0.000102626
2326   -5250 -2.08864E-05
2327   -5252 7.16191E-05
2328   -5254 -0.000179139
2329   -5256 -0.000204764
2330   -5258 5.62019E-05
2331   -5260 6.92956E-05
2332   -5262 -0.00011329
2333   -5264 -2.34642E-05
2334   -5266 4.14054E-05
2335   -5268 1.74697E-05
2336   -5270 -0.000238236
2337   -5272 -9.28767E-05
2338   -5274 -7.16975E-05
2339   -5276 -0.000127366
2340   -5278 -0.000230925
2341   -5280 -2.65856E-05
2342   -5282 -6.2476E-05
2343   -5284 -7.327E-05
2344   -5286 1.91461E-05
2345   -5288 -7.2295E-05
2346   -5290 -0.000147312
2347   -5292 -7.62531E-05
2348   -5294 -0.000144729
2349   -5296 -0.000126474
2350   -5298 -2.27904E-05
2351   -5300 -0.000112916
2352   -5302 -8.64288E-05
2353   -5304 5.86161E-05
2354   -5306 -0.000139173
2355   -5308 9.46683E-05
2356   -5310 -0.000149661
2357   -5312 -0.000271663
2358   -5314 1.51686E-05
2359   -5316 -5.13603E-05
2360   -5318 4.16107E-05
2361   -5320 -0.00018097
2362   -5322 -0.000168231
2363   -5324 -8.75568E-05
2364   -5326 1.26443E-05
2365   -5328 -2.70E-06
2366   -5330 -0.000102704
2367   -5332 -3.18529E-05
2368   -5334 -0.000107168
2369   -5336 -3.44404E-05
2370   -5338 5.39579E-05
2371   -5340 -9.77379E-05
2372   -5342 0.000125462
2373   -5344 4.98398E-05
2374   -5346 -0.000146261
2375   -5348 -0.000171159
2376   -5350 -1.69326E-05
2377   -5352 0.000177523
2378   -5354 -7.21671E-05
2379   -5356 -0.000260525
2380   -5358 -0.000169717
2381   -5360 -0.000120504
2382   -5362 -0.000136292
2383   -5364 -8.95291E-05
2384   -5366 -0.000137501
2385   -5368 2.8667E-05
2386   -5370 -8.19487E-05
2387   -5372 -0.000148664
2388   -5374 -2.76867E-05
2389   -5376 -7.21953E-05
2390   -5378 -9.64493E-05
2391   -5380 -0.000148179
2392   -5382 -5.98436E-05
2393   -5384 -0.000124761
2394   -5386 -0.000202081
2395   -5388 -0.000166304
2396   -5390 -0.000210005
2397   -5392 -0.00010521
2398   -5394 -7.30E-07
2399   -5396 0.000138772
2400   -5398 -6.01E-06
2401   -5400 -0.000188874
2402   -5402 -5.08203E-05
2403   -5404 -0.000270553
2404   -5406 -0.000140069
2405   -5408 -0.000148844
2406   -5410 9.32963E-05
2407   -5412 -0.000131394
2408   -5414 -0.00011106
2409   -5416 -9.04442E-05
2410   -5418 -0.000154567
2411   -5420 -8.9573E-05
2412   -5422 -0.000150372
2413   -5424 -5.82735E-05
2414   -5426 -0.000166476
2415   -5428 -1.28661E-05
2416   -5430 6.85E-06
2417   -5432 -7.06364E-05
2418   -5434 -0.000111032
2419   -5436 -0.000211053
2420   -5438 -8.24E-06
2421   -5440 -7.89619E-05
2422   -5442 1.04035E-05
2423   -5444 0.000147427
2424   -5446 -9.76797E-05
2425   -5448 -0.000136429
2426   -5450 -0.000211055
2427   -5452 -0.000161586
2428   -5454 -5.84473E-05
2429   -5456 -5.15973E-05
2430   -5458 -2.10924E-05
2431   -5460 4.70888E-05
2432   -5462 -0.000356925
2433   -5464 -0.000285499
2434   -5466 -9.7915E-05
2435   -5468 -7.49916E-05
2436   -5470 -7.99851E-05
2437   -5472 -0.000156726
2438   -5474 7.08954E-05
2439   -5476 -0.000235041
2440   -5478 4.11383E-05
2441   -5480 -8.73586E-05
2442   -5482 -0.000263069
2443   -5484 -0.000131456
2444   -5486 -0.000217176
2445   -5488 -0.000123259
2446   -5490 -0.000162573
2447   -5492 8.80588E-05
2448   -5494 -5.13835E-05
2449   -5496 -0.000177107
2450   -5498 -1.08686E-05
2451   -5500 -0.00013401
2452   -5502 -2.17232E-05
2453   -5504 -0.000204563
2454   -5506 -0.000130573
2455   -5508 -0.000138882
2456   -5510 -4.71656E-05
2457   -5512 -0.000226241
2458   -5514 -0.000158162
2459   -5516 -0.00016349
2460   -5518 -0.00022113
2461   -5520 -1.90E-06
2462   -5522 -8.43313E-05
2463   -5524 -0.000294269
2464   -5526 -8.10355E-05
2465   -5528 -0.0001755
2466   -5530 -0.000149491
2467   -5532 -0.000185625
2468   -5534 -0.000181539
2469   -5536 -0.000227489
2470   -5538 -0.000142212
2471   -5540 -6.22151E-05
2472   -5542 -4.10673E-05
2473   -5544 -0.000129738
2474   -5546 -0.000165541
2475   -5548 -0.000120703
2476   -5550 -0.000250116
2477   -5552 -0.000189888
2478   -5554 -9.45214E-05
2479   -5556 -0.000206709
2480   -5558 -0.000114229
2481   -5560 -2.74E-06
2482   -5562 -0.000174771
2483   -5564 -0.000215381
2484   -5566 -0.000435337
2485   -5568 -7.92925E-05
2486   -5570 -0.000264598
2487   -5572 -5.21323E-05
2488   -5574 -0.000184079
2489   -5576 -0.000195211
2490   -5578 6.14E-06
2491   -5580 -1.34219E-05
2492   -5582 -0.000142205
2493   -5584 -0.000201266
2494   -5586 -0.000136273
2495   -5588 -4.36936E-05
2496   -5590 -0.000177113
2497   -5592 -0.000192107
2498   -5594 -0.000285436
2499   -5596 -0.000206806
2500   -5598 -0.000143489
2501   -5600 -0.000197125
2502   -5602 -0.000227679
2503   -5604 -0.000228332
2504   -5606 -6.73004E-05
2505   -5608 -0.00010937
2506   -5610 -0.000349687
2507   -5612 -0.000177179
2508   -5614 -0.00025193
2509   -5616 -5.64675E-05
2510   -5618 -0.000170188
2511   -5620 -0.000230005
2512   -5622 -0.00040001
2513   -5624 -3.67655E-05
2514   -5626 -7.16761E-05
2515   -5628 -0.000397345
2516   -5630 -4.36E-07
2517   -5632 -4.1559E-05
2518   -5634 -0.000190926
2519   -5636 -0.000371965
2520   -5638 -0.00024466
2521   -5640 2.96284E-05
2522   -5642 -3.24397E-05
2523   -5644 -0.000369574
2524   -5646 -9.12484E-05
2525   -5648 -0.000200854
2526   -5650 -0.0002112
2527   -5652 -0.00010615
2528   -5654 -0.0002109
2529   -5656 -0.000131312
2530   -5658 -7.34227E-05
2531   -5660 -0.000125623
2532   -5662 -0.000222683
2533   -5664 -3.11127E-05
2534   -5666 -0.000142646
2535   -5668 -9.98779E-05
2536   -5670 -2.86769E-05
2537   -5672 -0.000218787
2538   -5674 -7.01801E-05
2539   -5676 -0.000370383
2540   -5678 1.93936E-05
2541   -5680 -0.000236552
2542   -5682 -0.000114162
2543   -5684 -1.40634E-05
2544   -5686 -9.94189E-05
2545   -5688 5.44862E-05
2546   -5690 -9.22632E-05
2547   -5692 -0.000235726
2548   -5694 -0.000286721
2549   -5696 -9.80563E-05
2550   -5698 -0.000186885
2551   -5700 -8.91076E-05
2552   -5702 -0.000116416
2553   -5704 -0.00014795
2554   -5706 2.03924E-05
2555   -5708 -9.58288E-05
2556   -5710 -6.8708E-05
2557   -5712 -0.000150654
2558   -5714 -3.29562E-05
2559   -5716 -0.000217313
2560   -5718 1.36356E-05
2561   -5720 -4.4006E-05
2562   -5722 -0.000146933
2563   -5724 -3.21571E-05
2564   -5726 -0.000122156
2565   -5728 -0.000269322
2566   -5730 -0.000197751
2567   -5732 -0.000130912
2568   -5734 -0.000154111
2569   -5736 -9.53856E-05
2570   -5738 -0.000240261
2571   -5740 -0.000161401
2572   -5742 6.45E-06
2573   -5744 -0.000184411
2574   -5746 -0.000245277
2575   -5748 -0.000212489
2576   -5750 -4.43252E-05
2577   -5752 -0.000107688
2578   -5754 1.07502E-05
2579   -5756 -0.000167197
2580   -5758 -6.68704E-05
2581   -5760 -4.80992E-05
2582   -5762 -5.66434E-05
2583   -5764 -0.000228705
2584   -5766 -0.000265847
2585   -5768 -9.75073E-05
2586   -5770 -0.000122477
2587   -5772 -0.00013384
2588   -5774 -0.00030111
2589   -5776 -6.26301E-05
2590   -5778 3.12553E-05
2591   -5780 -5.04101E-05
2592   -5782 -0.000160911
2593   -5784 -3.53197E-05
2594   -5786 -0.000214252
2595   -5788 2.99878E-05
2596   -5790 -0.000147791
2597   -5792 -4.13023E-05
2598   -5794 -6.57403E-05
2599   -5796 -0.000122902
2600   -5798 2.21647E-05
2601   -5800 -6.32159E-05
2602   -5802 -6.96488E-05
2603   -5804 -0.000176959
2604   -5806 -0.000104603
2605   -5808 -2.97849E-05
2606   -5810 -2.13517E-05
2607   -5812 -0.000310097
2608   -5814 -0.000234544
2609   -5816 -0.000306688
2610   -5818 -0.000134224
2611   -5820 -4.62987E-05
2612   -5822 -8.32075E-05
2613   -5824 -0.000124491
2614   -5826 -0.000227533
2615   -5828 7.63E-06
2616   -5830 -0.000100538
2617   -5832 -0.000209111
2618   -5834 -6.65844E-05
2619   -5836 -0.000147125
2620   -5838 -0.000133334
2621   -5840 -8.70E-06
2622   -5842 -2.23727E-05
2623   -5844 -0.000315383
2624   -5846 -0.000185853
2625   -5848 0.000154914
2626   -5850 -0.000121906
2627   -5852 -6.5162E-05
2628   -5854 -0.000181952
2629   -5856 -4.16013E-05
2630   -5858 -3.0724E-05
2631   -5860 3.03096E-05
2632   -5862 6.01019E-05
2633   -5864 -0.000205749
2634   -5866 -7.91329E-05
2635   -5868 -3.1756E-05
2636   -5870 -0.000153925
2637   -5872 -4.92637E-05
2638   -5874 8.94E-06
2639   -5876 0.000167884
2640   -5878 2.81044E-05
2641   -5880 -0.000172485
2642   -5882 3.85173E-05
2643   -5884 -0.000199897
2644   -5886 5.97079E-05
2645   -5888 1.12013E-05
2646   -5890 -0.000182001
2647   -5892 -0.000170865
2648   -5894 2.87266E-05
2649   -5896 0.000188198
2650   -5898 0.000162068
2651   -5900 6.77282E-05
2652   -5902 -0.000100557
2653   -5904 0.000172774
2654   -5906 5.45068E-05
2655   -5908 6.71451E-05
2656   -5910 1.42267E-05
2657   -5912 0.000159991
2658   -5914 0.000176915
2659   -5916 0.000201461
2660   -5918 7.24557E-05
2661   -5920 -0.000214255
2662   -5922 0.000185476
2663   -5924 5.55465E-05
2664   -5926 5.85444E-05
2665   -5928 2.38107E-05
2666   -5930 0.000209259
2667   -5932 2.68625E-05
2668   -5934 6.93668E-05
2669   -5936 -0.00010269
2670   -5938 0.000204459
2671   -5940 4.3037E-05
2672   -5942 0.000134317
2673   -5944 0.00011353
2674   -5946 -1.1138E-05
2675   -5948 -0.00021765
2676   -5950 0.000113405
2677   -5952 -6.84037E-05
2678   -5954 -6.10258E-05
2679   -5956 0.000128848
2680   -5958 6.24606E-05
2681   -5960 -1.7243E-05
2682   -5962 -9.28901E-05
2683   -5964 -0.000124651
2684   -5966 -0.000180665
2685   -5968 0.000142526
2686   -5970 -0.000128998
2687   -5972 0.000184577
2688   -5974 -3.74491E-05
2689   -5976 -0.00013039
2690   -5978 2.31888E-05
2691   -5980 0.000132512
2692   -5982 -0.000132757
2693   -5984 -0.000164463
2694   -5986 8.58551E-05
2695   -5988 -0.000140773
2696   -5990 -4.35385E-05
2697   -5992 7.0978E-05
2698   -5994 -6.24E-06
2699   -5996 0.000148403
2700   -5998 0.000188021
2701   -6000 2.66254E-05
2702   -6002 8.84368E-05
2703   -6004 3.65224E-05
2704   -6006 5.78793E-05
2705   -6008 3.50034E-05
2706   -6010 5.62399E-05
2707   -6012 -5.14362E-05
2708   -6014 0.00034933
2709   -6016 0.000168918
2710   -6018 5.34508E-05
2711   -6020 0.000122075
2712   -6022 -4.05053E-05
2713   -6024 8.9883E-05
2714   -6026 0.000161734
2715   -6028 -7.37436E-05
2716   -6030 -4.95E-06
2717   -6032 0.00022485
2718   -6034 -0.000253566
2719   -6036 0.000122794
2720   -6038 -2.70286E-05
2721   -6040 7.11802E-05
2722   -6042 0.000129984
2723   -6044 1.57E-06
2724   -6046 -0.000117867
2725   -6048 -2.15324E-05
2726   -6050 -1.38764E-05
2727   -6052 6.69437E-05
2728   -6054 -0.000117569
2729   -6056 1.94807E-05
2730   -6058 -1.96687E-05
2731   -6060 -0.000147066
2732   -6062 5.52879E-05
2733   -6064 -3.51488E-05
2734   -6066 1.65759E-05
2735   -6068 0.000194312
2736   -6070 -9.75251E-05
2737   -6072 -0.000286519
2738   -6074 -0.000133893
2739   -6076 -0.000144305
2740   -6078 -0.000206774
2741   -6080 9.70323E-05
2742   -6082 0.000105616
2743   -6084 7.76744E-05
2744   -6086 -1.85213E-05
2745   -6088 2.1601E-05
2746   -6090 2.86444E-05
2747   -6092 -7.78625E-05
2748   -6094 -0.000103451
2749   -6096 5.06513E-05
2750   -6098 -0.000126614
2751   -6100 -0.000291543
2752   -6102 -3.20512E-05
2753   -6104 -0.00034077
2754   -6106 4.78E-06
2755   -6108 -0.00021435
2756   -6110 -3.06885E-05
2757   -6112 -0.00013895
2758   -6114 -6.48402E-05
2759   -6116 -7.10551E-05
2760   -6118 -0.000288181
2761   -6120 -6.09779E-05
2762   -6122 -0.000224615
2763   -6124 -8.03908E-05
2764   -6126 -7.04685E-05
2765   -6128 7.00613E-05
2766   -6130 -0.000187151
2767   -6132 -0.00015411
2768   -6134 -0.000142311
2769   -6136 0.000311664
2770   -6138 0.000185075
2771   -6140 0.000302768
2772   -6142 -0.000104647
2773   -6144 0.000119734
2774   -6146 -4.93308E-05
2775   -6148 1.16225E-05
2776   -6150 -0.000114402
2777   -6152 -0.00021231
2778   -6154 7.1843E-05
2779   -6156 -5.21411E-05
2780   -6158 -8.98771E-05
2781   -6160 0.000148557
2782   -6162 -5.44653E-05
2783   -6164 -0.00012796
2784   -6166 9.70156E-05
2785   -6168 -0.000101064
2786   -6170 -0.00013553
2787   -6172 9.9476E-05
2788   -6174 1.62078E-05
2789   -6176 -4.40928E-05
2790   -6178 0.000102579
2791   -6180 1.77941E-05
2792   -6182 -0.000149253
2793   -6184 -8.96427E-05
2794   -6186 -0.000108399
2795   -6188 6.41861E-05
2796   -6190 0.000121833
2797   -6192 -2.42281E-05
2798   -6194 -0.000112157
2799   -6196 -2.51081E-05
2800   -6198 -3.95046E-05
2801   -6200 0.000178628
2802   -6202 -0.000148793
2803   -6204 -9.57E-06
2804   -6206 -7.90421E-05
2805   -6208 -8.07858E-05
2806   -6210 -4.14175E-05
2807   -6212 -7.21446E-05
2808   -6214 0.000149076
2809   -6216 3.91353E-05
2810   -6218 -0.000114591
2811   -6220 -9.9288E-05
2812   -6222 -0.000113439
2813   -6224 -2.5277E-05
2814   -6226 -8.29E-07
2815   -6228 8.26896E-05
2816   -6230 -6.24E-06
2817   -6232 0.000107177
2818   -6234 -3.60E-06
2819   -6236 0.000162593
2820   -6238 -5.28839E-05
2821   -6240 -0.000174024
2822   -6242 -0.000101802
2823   -6244 1.47698E-05
2824   -6246 4.79099E-05
2825   -6248 -8.95552E-05
2826   -6250 0.000146406
2827   -6252 0.000106973
2828   -6254 7.08576E-05
2829   -6256 -5.01693E-05
2830   -6258 5.31355E-05
2831   -6260 -0.000233967
2832   -6262 4.08849E-05
2833   -6264 -7.93998E-05
2834   -6266 0.00014663
2835   -6268 -4.49E-07
2836   -6270 0.000121188
2837   -6272 -4.01289E-05
2838   -6274 9.46038E-05
2839   -6276 4.40081E-05
2840   -6278 8.76714E-05
2841   -6280 -0.000191742
2842   -6282 -0.000105518
2843   -6284 -4.94007E-05
2844   -6286 -4.65298E-05
2845   -6288 1.22E-07
2846   -6290 0.000159264
2847   -6292 3.10034E-05
2848   -6294 6.24514E-05
2849   -6296 -2.04794E-05
2850   -6298 -0.000228969
2851   -6300 7.75386E-05
2852   -6302 -8.37533E-05
2853   -6304 -4.76962E-05
2854   -6306 0.000134281
2855   -6308 -9.41E-06
2856   -6310 -0.000141126
2857   -6312 -0.000133436
2858   -6314 9.32692E-05
2859   -6316 0.000130775
2860   -6318 0.000198152
2861   -6320 -5.79899E-05
2862   -6322 -4.41423E-05
2863   -6324 0.000143831
2864   -6326 0.000107897
2865   -6328 1.79488E-05
2866   -6330 -0.000148111
2867   -6332 0.000107348
2868   -6334 -2.49393E-05
2869   -6336 -0.000148447
2870   -6338 0.000163246
2871   -6340 2.64628E-05
2872   -6342 6.50765E-05
2873   -6344 -5.74688E-05
2874   -6346 9.16788E-05
2875   -6348 0.000115457
2876   -6350 2.51624E-05
2877   -6352 -6.82336E-05
2878   -6354 0.000175589
2879   -6356 -2.47157E-05
2880   -6358 0.000300847
2881   -6360 4.29191E-05
2882   -6362 -0.000102159
2883   -6364 -0.000150186
2884   -6366 -0.000137124
2885   -6368 -3.6448E-05
2886   -6370 6.31217E-05
2887   -6372 -2.17468E-05
2888   -6374 0.00020514
2889   -6376 -0.000288874
2890   -6378 -0.000196896
2891   -6380 5.33731E-05
2892   -6382 -0.00018922
2893   -6384 5.94367E-05
2894   -6386 0.00018609
2895   -6388 -0.000231268
2896   -6390 0.000188414
2897   -6392 8.58249E-05
2898   -6394 0.000322554
2899   -6396 -8.18526E-05
2900   -6398 6.46391E-05
2901   -6400 -3.654E-05
2902   -6402 -5.43539E-05
2903   -6404 0.00011808
2904   -6406 -0.000111429
2905   -6408 3.37446E-05
2906   -6410 0.000103862
2907   -6412 -2.73016E-05
2908   -6414 0.000148599
2909   -6416 -0.000175049
2910   -6418 -7.87E-06
2911   -6420 -1.44832E-05
2912   -6422 -8.69714E-05
2913   -6424 7.46194E-05
2914   -6426 -8.40362E-05
2915   -6428 0.000255133
2916   -6430 -7.29877E-05
2917   -6432 0.000251098
2918   -6434 -6.47746E-05
2919   -6436 -0.000116293
2920   -6438 0.000176731
2921   -6440 -8.31E-06
2922   -6442 -0.000133431
2923   -6444 -0.000148146
2924   -6446 1.85739E-05
2925   -6448 -7.49236E-05
2926   -6450 7.86825E-05
2927   -6452 0.000150351
2928   -6454 8.30916E-05
2929   -6456 -2.89466E-05
2930   -6458 2.75E-07
2931   -6460 -7.6078E-05
2932   -6462 0.000127013
2933   -6464 0.000125654
2934   -6466 -9.06547E-05
2935   -6468 -0.000245214
2936   -6470 -9.9701E-05
2937   -6472 -7.93695E-05
2938   -6474 -0.000114213
2939   -6476 0.000128301
2940   -6478 -7.09795E-05
2941   -6480 0.00014139
2942   -6482 6.9353E-05
2943   -6484 0.000113504
2944   -6486 -0.000222003
2945   -6488 0.00011384
2946   -6490 5.82324E-05
2947   -6492 -4.78533E-05
2948   -6494 -0.000172427
2949   -6496 3.94829E-05
2950   -6498 -0.000207402
2951   -6500 -0.000158524
2952   -6502 7.13359E-05
2953   -6504 -0.00015144
2954   -6506 -0.000166462
2955   -6508 -1.63887E-05
2956   -6510 8.49982E-05
2957   -6512 -0.000133497
2958   -6514 -2.65249E-05
2959   -6516 -0.000187609
2960   -6518 -1.77176E-05
2961   -6520 -0.000139934
2962   -6522 1.97547E-05
2963   -6524 -0.000213204
2964   -6526 -2.25511E-05
2965   -6528 -5.93047E-05
2966   -6530 -0.000104047
2967   -6532 -0.000306345
2968   -6534 -3.98042E-05
2969   -6536 -7.78457E-05
2970   -6538 -7.13E-06
2971   -6540 -0.000280079
2972   -6542 0.000154768
2973   -6544 9.83578E-05
2974   -6546 0.000181306
2975   -6548 -0.000133643
2976   -6550 0.000105885
2977   -6552 -0.000157576
2978   -6554 -9.20987E-05
2979   -6556 -5.51079E-05
2980   -6558 -3.02747E-05
2981   -6560 -7.17904E-05
2982   -6562 -0.000280564
2983   -6564 -6.67912E-05
2984   -6566 0.000184375
2985   -6568 -8.73372E-05
2986   -6570 -0.000100174
2987   -6572 -2.82062E-05
2988   -6574 -8.84695E-05
2989   -6576 0.000144169
2990   -6578 -0.000240943
2991   -6580 -0.000139581
2992   -6582 0.000120571
2993   -6584 0.000138317
2994   -6586 -0.00022769
2995   -6588 -0.000275816
2996   -6590 0.00010466
2997   -6592 7.78823E-05
2998   -6594 -5.28282E-05
2999   -6596 -2.40E-06
3000   -6598 0.000117892
3001   -6600 -4.19631E-05
3002   -6602 -0.000315964
3003   -6604 -0.000410462
3004   -6606 -0.000120959
3005   -6608 9.99E-06
3006   -6610 4.37964E-05
3007   -6612 -3.31902E-05
3008   -6614 -8.51607E-05
3009   -6616 -0.000154694
3010   -6618 -9.29603E-05
3011   -6620 5.289E-05
3012   -6622 -0.000125816
3013   -6624 -0.000314679
3014   -6626 -0.00016154
3015   -6628 -0.000141162
3016   -6630 -0.000119437
3017   -6632 -0.0001569
3018   -6634 -0.000166503
3019   -6636 0.000112686
3020   -6638 1.99608E-05
3021   -6640 4.35539E-05
3022   -6642 -0.000166097
3023   -6644 -4.87333E-05
3024   -6646 -0.000336465
3025   -6648 -0.00029665
3026   -6650 -0.000145957
3027   -6652 7.43624E-05
3028   -6654 -0.000223543
3029   -6656 0.000141507
3030   -6658 0.000143548
3031   -6660 -0.000207983
3032   -6662 -3.80663E-05
3033   -6664 -0.000115808
3034   -6666 -0.000371392
3035   -6668 -0.000146251
3036   -6670 -0.000330336
3037   -6672 -0.000268665
3038   -6674 -8.44355E-05
3039   -6676 -1.45736E-05
3040   -6678 -0.000355467
3041   -6680 -0.000112196
3042   -6682 2.59378E-05
3043   -6684 -5.07584E-05
3044   -6686 -2.74706E-05
3045   -6688 -0.000184275
3046   -6690 -8.74E-06
3047   -6692 -2.95378E-05
3048   -6694 2.54E-06
3049   -6696 -0.000101312
3050   -6698 -0.000211174
3051   -6700 -0.000164924
3052   -6702 -0.000398584
3053   -6704 -0.000146533
3054   -6706 -0.000348778
3055   -6708 -0.000143255
3056   -6710 0.000147283
3057   -6712 -9.8179E-05
3058   -6714 9.34795E-05
3059   -6716 -0.000150882
3060   -6718 -0.000297166
3061   -6720 1.32743E-05
3062   -6722 -0.000120746
3063   -6724 -8.11384E-05
3064   -6726 -0.000325532
3065   -6728 -0.000194586
3066   -6730 -0.00012466
3067   -6732 -4.78812E-05
3068   -6734 -9.19999E-05
3069   -6736 -0.000107843
3070   -6738 -6.23358E-05
3071   -6740 -0.000286347
3072   -6742 -3.71682E-05
3073   -6744 -4.80E-06
3074   -6746 -0.000319234
3075   -6748 -0.000279883
3076   -6750 -0.000272827
3077   -6752 -0.000101761
3078   -6754 -0.000146361
3079   -6756 -0.000266156
3080   -6758 0.000102535
3081   -6760 -0.000386606
3082   -6762 -0.00018995
3083   -6764 -0.000215715
3084   -6766 -0.00023779
3085   -6768 -0.000211241
3086   -6770 -0.000283036
3087   -6772 -0.000106436
3088   -6774 -0.000187373
3089   -6776 -0.000190231
3090   -6778 -1.71093E-05
3091   -6780 -0.000351549
3092   -6782 -0.000167132
3093   -6784 6.03858E-05
3094   -6786 -0.000311376
3095   -6788 -0.000142106
3096   -6790 -1.62293E-05
3097   -6792 -0.000231522
3098   -6794 -8.28732E-05
3099   -6796 -0.000337511
3100   -6798 -0.000203157
3101   -6800 -3.72712E-05
3102   -6802 -0.000234517
3103   -6804 -1.30E-06
3104   -6806 -8.99819E-05
3105   -6808 -3.03547E-05
3106   -6810 -7.82862E-05
3107   -6812 -0.000275055
3108   -6814 8.78416E-05
3109   -6816 -0.000124671
3110   -6818 -0.000332395
3111   -6820 -0.000120407
3112   -6822 -0.000196254
3113   -6824 -0.000143466
3114   -6826 -0.00023199
3115   -6828 -2.32556E-05
3116   -6830 -0.000506958
3117   -6832 1.30E-06
3118   -6834 -0.000349053
3119   -6836 -0.000105324
3120   -6838 -0.000365336
3121   -6840 -0.000376516
3122   -6842 -0.000268123
3123   -6844 -0.000216535
3124   -6846 -0.000149111
3125   -6848 -0.000224848
3126   -6850 -0.000219525
3127   -6852 3.8059E-05
3128   -6854 -0.000306124
3129   -6856 -0.000480935
3130   -6858 -7.56657E-05
3131   -6860 -0.000234094
3132   -6862 -8.62146E-05
3133   -6864 -4.34679E-05
3134   -6866 -6.9076E-05
3135   -6868 -0.000343807
3136   -6870 -2.52463E-05
3137   -6872 0.00013412
3138   -6874 -0.000136273
3139   -6876 -6.21612E-05
3140   -6878 -0.000382671
3141   -6880 -3.57982E-05
3142   -6882 -0.000173088
3143   -6884 9.16434E-05
3144   -6886 -0.000290802
3145   -6888 -0.00033873
3146   -6890 -0.000100816
3147   -6892 -0.000332355
3148   -6894 -2.15443E-05
3149   -6896 -0.000139886
3150   -6898 -0.000147969
3151   -6900 -0.000250801
3152   -6902 -0.000287541
3153   -6904 3.96189E-05
3154   -6906 -0.00043964
3155   -6908 -0.000144297
3156   -6910 -0.000259311
3157   -6912 -0.000307546
3158   -6914 -0.000207326
3159   -6916 -0.000311028
3160   -6918 1.09E-06
3161   -6920 -0.000316103
3162   -6922 -0.000116125
3163   -6924 -0.0004364
3164   -6926 -0.00019726
3165   -6928 2.21665E-05
3166   -6930 -0.000196139
3167   -6932 -0.000150559
3168   -6934 -0.00021327
3169   -6936 -0.000242659
3170   -6938 -0.000324069
3171   -6940 -0.000156015
3172   -6942 -0.000114122
3173   -6944 -0.000116531
3174   -6946 -0.0002098
3175   -6948 -0.000403686
3176   -6950 -0.000428051
3177   -6952 -0.000205227
3178   -6954 -0.000263236
3179   -6956 -7.86915E-05
3180   -6958 -0.000295775
3181   -6960 -0.000232486
3182   -6962 -0.000143043
3183   -6964 -0.000239739
3184   -6966 -0.000219405
3185   -6968 -0.000354447
3186   -6970 9.11346E-05
3187   -6972 -0.00030139
3188   -6974 -0.00035907
3189   -6976 -0.000467083
3190   -6978 -2.82218E-05
3191   -6980 -7.5117E-05
3192   -6982 -0.000384305
3193   -6984 -0.000260206
3194   -6986 -0.000183068
3195   -6988 -0.000267272
3196   -6990 -0.000436363
3197   -6992 0.000209017
3198   -6994 0.000133107
3199   -6996 -0.000135045
3200   -6998 -0.00045575
  1 +600 0.0241342
  2 +602 0.027446631
  3 +604 0.02823961
  4 +606 0.029234628
  5 +608 0.025898145
  6 +610 0.027709774
  7 +612 0.025719063
  8 +614 0.024429068
  9 +616 0.02854507
  10 +618 0.028690732
  11 +620 0.027360949
  12 +622 0.026091157
  13 +624 0.028641792
  14 +626 0.025692568
  15 +628 0.027570268
  16 +630 0.026608215
  17 +632 0.025158608
  18 +634 0.027824888
  19 +636 0.027869757
  20 +638 0.028231098
  21 +640 0.027216732
  22 +642 0.027256791
  23 +644 0.026774291
  24 +646 0.025499332
  25 +648 0.026889976
  26 +650 0.030071764
  27 +652 0.028157525
  28 +654 0.027086256
  29 +656 0.023530438
  30 +658 0.026059433
  31 +660 0.024346599
  32 +662 0.028048226
  33 +664 0.026330259
  34 +666 0.026601859
  35 +668 0.026131422
  36 +670 0.024728621
  37 +672 0.02338841
  38 +674 0.025137265
  39 +676 0.024573728
  40 +678 0.02555457
  41 +680 0.026601251
  42 +682 0.02396367
  43 +684 0.023990388
  44 +686 0.022609513
  45 +688 0.02293027
  46 +690 0.023659684
  47 +692 0.023029444
  48 +694 0.02354769
  49 +696 0.022885431
  50 +698 0.020916068
  51 +700 0.017366832
  52 +702 0.020254317
  53 +704 0.02021588
  54 +706 0.019612931
  55 +708 0.020605736
  56 +710 0.019409
  57 +712 0.020098812
  58 +714 0.017859943
  59 +716 0.017200361
  60 +718 0.017415851
  61 +720 0.016738256
  62 +722 0.017480257
  63 +724 0.016505558
  64 +726 0.017110302
  65 +728 0.017027064
  66 +730 0.016024705
  67 +732 0.017486817
  68 +734 0.01747258
  69 +736 0.018679356
  70 +738 0.0198481
  71 +740 0.021190117
  72 +742 0.023716217
  73 +744 0.03056829
  74 +746 0.038271622
  75 +748 0.04379452
  76 +750 0.044251529
  77 +752 0.0407681
  78 +754 0.034103515
  79 +756 0.029061414
  80 +758 0.02617678
  81 +760 0.022539928
  82 +762 0.021165925
  83 +764 0.019846463
  84 +766 0.018521271
  85 +768 0.018036484
  86 +770 0.017126223
  87 +772 0.016586444
  88 +774 0.016483205
  89 +776 0.01531947
  90 +778 0.014237011
  91 +780 0.013740482
  92 +782 0.012463683
  93 +784 0.012601353
  94 +786 0.012687382
  95 +788 0.011956341
  96 +790 0.012597304
  97 +792 0.01301531
  98 +794 0.013443559
  99 +796 0.014187849
  100 +798 0.014467894
  101 +800 0.015065439
  102 +802 0.014878516
  103 +804 0.015873769
  104 +806 0.016515435
  105 +808 0.016709374
  106 +810 0.017771403
  107 +812 0.016772822
  108 +814 0.015531226
  109 +816 0.014555445
  110 +818 0.013874898
  111 +820 0.015212008
  112 +822 0.016378744
  113 +824 0.017775592
  114 +826 0.01866164
  115 +828 0.018518393
  116 +830 0.016763911
  117 +832 0.015599009
  118 +834 0.017242919
  119 +836 0.020302394
  120 +838 0.023933252
  121 +840 0.026400268
  122 +842 0.02629389
  123 +844 0.024144284
  124 +846 0.022565086
  125 +848 0.020193958
  126 +850 0.018896857
  127 +852 0.01763933
  128 +854 0.016642232
  129 +856 0.015634651
  130 +858 0.014645714
  131 +860 0.014138096
  132 +862 0.014067378
  133 +864 0.013168089
  134 +866 0.012439437
  135 +868 0.011586666
  136 +870 0.011339401
  137 +872 0.010914962
  138 +874 0.011187976
  139 +876 0.01107262
  140 +878 0.010671149
  141 +880 0.010509334
  142 +882 0.010691428
  143 +884 0.010463665
  144 +886 0.010732772
  145 +888 0.01113261
  146 +890 0.011327793
  147 +892 0.011556208
  148 +894 0.011574848
  149 +896 0.012311955
  150 +898 0.012752431
  151 +900 0.013542695
  152 +902 0.014021246
  153 +904 0.01526174
  154 +906 0.016386114
  155 +908 0.017710929
  156 +910 0.01815038
  157 +912 0.018485943
  158 +914 0.017942962
  159 +916 0.017253983
  160 +918 0.01673434
  161 +920 0.01576578
  162 +922 0.014969642
  163 +924 0.014914081
  164 +926 0.014775756
  165 +928 0.01494549
  166 +930 0.015163243
  167 +932 0.015246393
  168 +934 0.01532558
  169 +936 0.015787325
  170 +938 0.016231344
  171 +940 0.016554737
  172 +942 0.017506803
  173 +944 0.018319774
  174 +946 0.019145212
  175 +948 0.02028672
  176 +950 0.021535268
  177 +952 0.02275816
  178 +954 0.024219016
  179 +956 0.025883888
  180 +958 0.028191904
  181 +960 0.02973823
  182 +962 0.032138566
  183 +964 0.034003184
  184 +966 0.03499998
  185 +968 0.034104727
  186 +970 0.032129204
  187 +972 0.029984542
  188 +974 0.028583373
  189 +976 0.029296818
  190 +978 0.030947438
  191 +980 0.033218509
  192 +982 0.035106761
  193 +984 0.037063027
  194 +986 0.037990186
  195 +988 0.03843855
  196 +990 0.038237958
  197 +992 0.037541096
  198 +994 0.035408946
  199 +996 0.032268154
  200 +998 0.027709144
  201 +1000 0.022616564
  202 +1002 0.017792654
  203 +1004 0.013769074
  204 +1006 0.010837077
  205 +1008 0.009454576
  206 +1010 0.008332445
  207 +1012 0.008116192
  208 +1014 0.007675599
  209 +1016 0.007566205
  210 +1018 0.007612047
  211 +1020 0.007823547
  212 +1022 0.007966098
  213 +1024 0.00809757
  214 +1026 0.008065411
  215 +1028 0.007845732
  216 +1030 0.008024275
  217 +1032 0.008148742
  218 +1034 0.00829201
  219 +1036 0.008417171
  220 +1038 0.008776959
  221 +1040 0.008930208
  222 +1042 0.009109161
  223 +1044 0.009556965
  224 +1046 0.010041021
  225 +1048 0.010441404
  226 +1050 0.011689312
  227 +1052 0.013463372
  228 +1054 0.016068878
  229 +1056 0.019131748
  230 +1058 0.022191274
  231 +1060 0.024570002
  232 +1062 0.025823144
  233 +1064 0.025672626
  234 +1066 0.024900161
  235 +1068 0.023916478
  236 +1070 0.022915273
  237 +1072 0.021869278
  238 +1074 0.021291225
  239 +1076 0.020732279
  240 +1078 0.020423981
  241 +1080 0.019941966
  242 +1082 0.019763979
  243 +1084 0.020171972
  244 +1086 0.020501795
  245 +1088 0.020890993
  246 +1090 0.020973014
  247 +1092 0.021622654
  248 +1094 0.021985718
  249 +1096 0.022794049
  250 +1098 0.023588335
  251 +1100 0.024728944
  252 +1102 0.025840943
  253 +1104 0.027215918
  254 +1106 0.028776335
  255 +1108 0.030474863
  256 +1110 0.032132728
  257 +1112 0.03432894
  258 +1114 0.03658024
  259 +1116 0.039269767
  260 +1118 0.042412102
  261 +1120 0.04564282
  262 +1122 0.048808874
  263 +1124 0.052149974
  264 +1126 0.056015747
  265 +1128 0.060459226
  266 +1130 0.066082016
  267 +1132 0.073004102
  268 +1134 0.082002822
  269 +1136 0.092694241
  270 +1138 0.105040768
  271 +1140 0.119005198
  272 +1142 0.134765364
  273 +1144 0.151290317
  274 +1146 0.166711247
  275 +1148 0.177289661
  276 +1150 0.177581202
  277 +1152 0.168819305
  278 +1154 0.153355038
  279 +1156 0.137689641
  280 +1158 0.124839415
  281 +1160 0.114845252
  282 +1162 0.107880108
  283 +1164 0.102774174
  284 +1166 0.099425166
  285 +1168 0.097407674
  286 +1170 0.09593259
  287 +1172 0.095228179
  288 +1174 0.094643601
  289 +1176 0.093962003
  290 +1178 0.092950837
  291 +1180 0.092259317
  292 +1182 0.092367257
  293 +1184 0.09505949
  294 +1186 0.10084115
  295 +1188 0.108423217
  296 +1190 0.11487388
  297 +1192 0.117710488
  298 +1194 0.115505139
  299 +1196 0.108980564
  300 +1198 0.099427356
  301 +1200 0.088724245
  302 +1202 0.077275287
  303 +1204 0.065974487
  304 +1206 0.055639191
  305 +1208 0.046756707
  306 +1210 0.040144578
  307 +1212 0.035787746
  308 +1214 0.033682891
  309 +1216 0.033223632
  310 +1218 0.034677454
  311 +1220 0.036745772
  312 +1222 0.038893257
  313 +1224 0.041363039
  314 +1226 0.044436197
  315 +1228 0.048838267
  316 +1230 0.054463569
  317 +1232 0.06102213
  318 +1234 0.068108657
  319 +1236 0.074819063
  320 +1238 0.080199202
  321 +1240 0.083557607
  322 +1242 0.084416767
  323 +1244 0.082399867
  324 +1246 0.078105449
  325 +1248 0.072146041
  326 +1250 0.065513193
  327 +1252 0.059389805
  328 +1254 0.054233076
  329 +1256 0.05069896
  330 +1258 0.048560539
  331 +1260 0.048145702
  332 +1262 0.049521078
  333 +1264 0.051961126
  334 +1266 0.055154907
  335 +1268 0.058810026
  336 +1270 0.062094907
  337 +1272 0.063453855
  338 +1274 0.061370974
  339 +1276 0.056096801
  340 +1278 0.048835689
  341 +1280 0.041617703
  342 +1282 0.035115884
  343 +1284 0.029979602
  344 +1286 0.02577722
  345 +1288 0.022496209
  346 +1290 0.020126584
  347 +1292 0.018027203
  348 +1294 0.016327132
  349 +1296 0.014932173
  350 +1298 0.013739422
  351 +1300 0.01257841
  352 +1302 0.011667794
  353 +1304 0.010851348
  354 +1306 0.010116636
  355 +1308 0.009717891
  356 +1310 0.009400051
  357 +1312 0.009109718
  358 +1314 0.00888188
  359 +1316 0.008728033
  360 +1318 0.008555248
  361 +1320 0.008339087
  362 +1322 0.008263885
  363 +1324 0.008135335
  364 +1326 0.008024262
  365 +1328 0.00807128
  366 +1330 0.008133836
  367 +1332 0.008127452
  368 +1334 0.008138716
  369 +1336 0.008226431
  370 +1338 0.008523101
  371 +1340 0.008850838
  372 +1342 0.008854893
  373 +1344 0.009270106
  374 +1346 0.009499399
  375 +1348 0.010017198
  376 +1350 0.01059085
  377 +1352 0.011038176
  378 +1354 0.011773896
  379 +1356 0.012769294
  380 +1358 0.013638295
  381 +1360 0.014465589
  382 +1362 0.01518012
  383 +1364 0.015838836
  384 +1366 0.015586918
  385 +1368 0.015225006
  386 +1370 0.014610879
  387 +1372 0.014078189
  388 +1374 0.013891646
  389 +1376 0.01474375
  390 +1378 0.016541246
  391 +1380 0.019262753
  392 +1382 0.02160541
  393 +1384 0.022915428
  394 +1386 0.023594535
  395 +1388 0.023160304
  396 +1390 0.021560851
  397 +1392 0.019284629
  398 +1394 0.017224111
  399 +1396 0.015715596
  400 +1398 0.01451186
  401 +1400 0.013747084
  402 +1402 0.012838691
  403 +1404 0.011692484
  404 +1406 0.010730102
  405 +1408 0.009879522
  406 +1410 0.009532642
  407 +1412 0.009405445
  408 +1414 0.009421966
  409 +1416 0.009767846
  410 +1418 0.010469222
  411 +1420 0.012306655
  412 +1422 0.014024908
  413 +1424 0.017706846
  414 +1426 0.022583787
  415 +1428 0.029021083
  416 +1430 0.037190928
  417 +1432 0.044809253
  418 +1434 0.049326808
  419 +1436 0.046321255
  420 +1438 0.046591991
  421 +1440 0.044754161
  422 +1442 0.045191988
  423 +1444 0.047429807
  424 +1446 0.05017989
  425 +1448 0.051372585
  426 +1450 0.051926052
  427 +1452 0.048877221
  428 +1454 0.045080598
  429 +1456 0.038315863
  430 +1458 0.036421716
  431 +1460 0.035921234
  432 +1462 0.033572486
  433 +1464 0.030617138
  434 +1466 0.029223629
  435 +1468 0.028215261
  436 +1470 0.027700175
  437 +1472 0.026917795
  438 +1474 0.029504607
  439 +1476 0.030149502
  440 +1478 0.032100457
  441 +1480 0.033473881
  442 +1482 0.035300299
  443 +1484 0.036565357
  444 +1486 0.036261041
  445 +1488 0.033080071
  446 +1490 0.027177502
  447 +1492 0.022131254
  448 +1494 0.01709778
  449 +1496 0.013099563
  450 +1498 0.010530086
  451 +1500 0.008297551
  452 +1502 0.006882263
  453 +1504 0.005898158
  454 +1506 0.007390398
  455 +1508 0.005394371
  456 +1510 0.00469017
  457 +1512 0.004858713
  458 +1514 0.004664992
  459 +1516 0.005005949
  460 +1518 0.004056874
  461 +1520 0.004193847
  462 +1522 0.003657278
  463 +1524 0.00283663
  464 +1526 0.002752255
  465 +1528 0.002349934
  466 +1530 0.002245644
  467 +1532 0.002485224
  468 +1534 0.002614123
  469 +1536 0.002208785
  470 +1538 0.003534115
  471 +1540 0.00409184
  472 +1542 0.003070369
  473 +1544 0.00262039
  474 +1546 0.002380277
  475 +1548 0.00226781
  476 +1550 0.002599999
  477 +1552 0.002356906
  478 +1554 0.003044914
  479 +1556 0.002653725
  480 +1558 0.006023148
  481 +1560 0.004062994
  482 +1562 0.002457177
  483 +1564 0.002618192
  484 +1566 0.002533502
  485 +1568 0.002721934
  486 +1570 0.002891702
  487 +1572 0.002507352
  488 +1574 0.002683978
  489 +1576 0.003586049
  490 +1578 0.002836659
  491 +1580 0.002886234
  492 +1582 0.002913471
  493 +1584 0.003031189
  494 +1586 0.003179643
  495 +1588 0.003307134
  496 +1590 0.003664506
  497 +1592 0.003805406
  498 +1594 0.004094776
  499 +1596 0.00401814
  500 +1598 0.00397432
  501 +1600 0.004099774
  502 +1602 0.00426046
  503 +1604 0.004405449
  504 +1606 0.004566685
  505 +1608 0.004628619
  506 +1610 0.004477913
  507 +1612 0.004433744
  508 +1614 0.004491011
  509 +1616 0.005192656
  510 +1618 0.004285009
  511 +1620 0.004036026
  512 +1622 0.004059854
  513 +1624 0.004105975
  514 +1626 0.003885176
  515 +1628 0.003981282
  516 +1630 0.003952543
  517 +1632 0.003835627
  518 +1634 0.004359047
  519 +1636 0.004402303
  520 +1638 0.004037436
  521 +1640 0.003885624
  522 +1642 0.004009201
  523 +1644 0.003952529
  524 +1646 0.004816486
  525 +1648 0.004304189
  526 +1650 0.003965589
  527 +1652 0.006019426
  528 +1654 0.004885376
  529 +1656 0.004123694
  530 +1658 0.004174164
  531 +1660 0.004235089
  532 +1662 0.004542281
  533 +1664 0.004486926
  534 +1666 0.004614867
  535 +1668 0.004894575
  536 +1670 0.005436912
  537 +1672 0.005431509
  538 +1674 0.005651576
  539 +1676 0.006442447
  540 +1678 0.006865513
  541 +1680 0.007569476
  542 +1682 0.008151428
  543 +1684 0.009926234
  544 +1686 0.010149147
  545 +1688 0.010811564
  546 +1690 0.011577639
  547 +1692 0.012317587
  548 +1694 0.013020018
  549 +1696 0.014610942
  550 +1698 0.015805372
  551 +1700 0.016720898
  552 +1702 0.02059107
  553 +1704 0.022843417
  554 +1706 0.026263481
  555 +1708 0.031574962
  556 +1710 0.03724565
  557 +1712 0.044695611
  558 +1714 0.051489334
  559 +1716 0.064252636
  560 +1718 0.079812715
  561 +1720 0.111108131
  562 +1722 0.134689923
  563 +1724 0.159768011
  564 +1726 0.178664944
  565 +1728 0.189550156
  566 +1730 0.187519211
  567 +1732 0.184568007
  568 +1734 0.148052948
  569 +1736 0.174327833
  570 +1738 0.157782681
  571 +1740 0.130983773
  572 +1742 0.111415729
  573 +1744 0.081721546
  574 +1746 0.057792152
  575 +1748 0.038151926
  576 +1750 0.026069798
  577 +1752 0.017267407
  578 +1754 0.012278154
  579 +1756 0.009329721
  580 +1758 0.007209351
  581 +1760 0.00592142
  582 +1762 0.005374228
  583 +1764 0.004826348
  584 +1766 0.004458699
  585 +1768 0.004270598
  586 +1770 0.003616544
  587 +1772 0.003541228
  588 +1774 0.002583577
  589 +1776 0.002217011
  590 +1778 0.001893818
  591 +1780 0.001935542
  592 +1782 0.001759374
  593 +1784 0.001804172
  594 +1786 0.001733619
  595 +1788 0.001749405
  596 +1790 0.001883088
  597 +1792 0.001990676
  598 +1794 0.00144261
  599 +1796 0.001341056
  600 +1798 0.001334477
  601 +1800 0.001226004
  602 +1802 0.001154986
  603 +1804 0.000870076
  604 +1806 0.000948184
  605 +1808 0.000819373
  606 +1810 0.000877109
  607 +1812 0.000856967
  608 +1814 0.000711407
  609 +1816 0.000664166
  610 +1818 0.000672376
  611 +1820 0.000554067
  612 +1822 0.000636656
  613 +1824 0.000592955
  614 +1826 0.000628019
  615 +1828 0.000694044
  616 +1830 0.000821293
  617 +1832 0.000514679
  618 +1834 0.000528808
  619 +1836 0.000521469
  620 +1838 0.000459258
  621 +1840 0.000346335
  622 +1842 0.000454894
  623 +1844 0.000686447
  624 +1846 0.000322626
  625 +1848 0.00024672
  626 +1850 0.00021652
  627 +1852 0.000228231
  628 +1854 0.000175338
  629 +1856 0.00010178
  630 +1858 4.80366E-05
  631 +1860 0.000163555
  632 +1862 0.000163557
  633 +1864 3.29655E-05
  634 +1866 0.000122024
  635 +1868 0.000276251
  636 +1870 0.000119215
  637 +1872 1.50667E-05
  638 +1874 -6.10E-07
  639 +1876 -6.29537E-05
  640 +1878 -3.01E-06
  641 +1880 -6.19819E-05
  642 +1882 -2.89042E-05
  643 +1884 -4.73032E-05
  644 +1886 2.07543E-05
  645 +1888 5.82048E-05
  646 +1890 9.61175E-05
  647 +1892 -2.35233E-05
  648 +1894 6.6847E-05
  649 +1896 0.000103985
  650 +1898 5.14422E-05
  651 +1900 9.67797E-05
  652 +1902 0.000135013
  653 +1904 0.000172139
  654 +1906 0.000245935
  655 +1908 0.000218667
  656 +1910 0.000249944
  657 +1912 0.000254151
  658 +1914 0.000274606
  659 +1916 0.000246846
  660 +1918 0.000361489
  661 +1920 0.000280901
  662 +1922 0.000476067
  663 +1924 0.00036462
  664 +1926 0.000395353
  665 +1928 0.000442112
  666 +1930 0.000468113
  667 +1932 0.000455817
  668 +1934 0.000471815
  669 +1936 0.000469251
  670 +1938 0.000476748
  671 +1940 0.00051635
  672 +1942 0.000755845
  673 +1944 0.000598315
  674 +1946 0.000708495
  675 +1948 0.000720105
  676 +1950 0.000663963
  677 +1952 0.000798318
  678 +1954 0.000793038
  679 +1956 0.000829472
  680 +1958 0.000848898
  681 +1960 0.000777441
  682 +1962 0.000809709
  683 +1964 0.000740382
  684 +1966 0.000844927
  685 +1968 0.000846562
  686 +1970 0.000842945
  687 +1972 0.000866656
  688 +1974 0.000750066
  689 +1976 0.000875148
  690 +1978 0.000812096
  691 +1980 0.000791832
  692 +1982 0.000795131
  693 +1984 0.000805046
  694 +1986 0.000780545
  695 +1988 0.000796985
  696 +1990 0.000649182
  697 +1992 0.000745563
  698 +1994 0.000695543
  699 +1996 0.00063712
  700 +1998 0.000601964
  701 +2000 0.000563163
  702 +2002 0.000453067
  703 +2004 0.00044115
  704 +2006 0.000470968
  705 +2008 0.000335742
  706 +2010 0.000382163
  707 +2012 0.000362654
  708 +2014 0.000330121
  709 +2016 0.000389084
  710 +2018 0.000292435
  711 +2020 0.000305525
  712 +2022 0.000329511
  713 +2024 0.00038482
  714 +2026 0.000336523
  715 +2028 0.000404901
  716 +2030 0.000380554
  717 +2032 0.000412551
  718 +2034 0.000374696
  719 +2036 0.000440636
  720 +2038 0.000381711
  721 +2040 0.000517346
  722 +2042 0.00051384
  723 +2044 0.000565282
  724 +2046 0.000565683
  725 +2048 0.000568611
  726 +2050 0.000481456
  727 +2052 0.000617706
  728 +2054 0.000528906
  729 +2056 0.00052708
  730 +2058 0.000555077
  731 +2060 0.00050699
  732 +2062 0.000525236
  733 +2064 0.000487272
  734 +2066 0.000539501
  735 +2068 0.000504029
  736 +2070 0.000447441
  737 +2072 0.000516835
  738 +2074 0.00047662
  739 +2076 0.000495004
  740 +2078 0.000456273
  741 +2080 0.000388805
  742 +2082 0.000385634
  743 +2084 0.000323494
  744 +2086 0.00038231
  745 +2088 0.000394126
  746 +2090 0.000383939
  747 +2092 0.000373967
  748 +2094 0.000377053
  749 +2096 0.00038487
  750 +2098 0.000382643
  751 +2100 0.000328327
  752 +2102 0.000300287
  753 +2104 0.000310617
  754 +2106 0.000316786
  755 +2108 0.000333295
  756 +2110 0.000370022
  757 +2112 0.000374474
  758 +2114 0.000401404
  759 +2116 0.000356568
  760 +2118 0.000405314
  761 +2120 0.000407752
  762 +2122 0.000390354
  763 +2124 0.000442652
  764 +2126 0.000408173
  765 +2128 0.000418827
  766 +2130 0.000441786
  767 +2132 0.000344844
  768 +2134 0.000381584
  769 +2136 0.000341404
  770 +2138 0.000395361
  771 +2140 0.000367725
  772 +2142 0.000336463
  773 +2144 0.000391147
  774 +2146 0.000325835
  775 +2148 0.000385238
  776 +2150 0.000365225
  777 +2152 0.000332808
  778 +2154 0.000289714
  779 +2156 0.000283791
  780 +2158 0.000238881
  781 +2160 0.000322866
  782 +2162 0.000286869
  783 +2164 0.000285061
  784 +2166 0.000257684
  785 +2168 0.000312025
  786 +2170 0.000207802
  787 +2172 0.000257015
  788 +2174 0.000220017
  789 +2176 0.00016785
  790 +2178 0.000255717
  791 +2180 0.000290103
  792 +2182 0.000157789
  793 +2184 0.000325881
  794 +2186 0.000247926
  795 +2188 0.000261432
  796 +2190 0.000291347
  797 +2192 0.000280254
  798 +2194 0.000229609
  799 +2196 0.000271056
  800 +2198 0.000270504
  801 +2200 0.000244769
  802 +2202 0.000314874
  803 +2204 0.000229367
  804 +2206 0.00024547
  805 +2208 0.000334635
  806 +2210 0.000279933
  807 +2212 0.000306569
  808 +2214 0.000225706
  809 +2216 0.000278309
  810 +2218 0.000248559
  811 +2220 0.000348697
  812 +2222 0.000245079
  813 +2224 0.000279928
  814 +2226 0.000255734
  815 +2228 0.000240166
  816 +2230 0.000266871
  817 +2232 0.000303392
  818 +2234 0.000314343
  819 +2236 0.000334341
  820 +2238 0.000374558
  821 +2240 0.000341859
  822 +2242 0.000368978
  823 +2244 0.000431373
  824 +2246 0.000366414
  825 +2248 0.000483577
  826 +2250 0.00045685
  827 +2252 0.000405578
  828 +2254 0.000512095
  829 +2256 0.000481377
  830 +2258 0.000514157
  831 +2260 0.000530324
  832 +2262 0.000568964
  833 +2264 0.000509579
  834 +2266 0.000580748
  835 +2268 0.000682969
  836 +2270 0.000728429
  837 +2272 0.000734436
  838 +2274 0.000792405
  839 +2276 0.000821361
  840 +2278 0.000877556
  841 +2280 0.000862509
  842 +2282 0.000976614
  843 +2284 0.000949856
  844 +2286 0.001073058
  845 +2288 0.001016429
  846 +2290 0.001170663
  847 +2292 0.001220265
  848 +2294 0.001173101
  849 +2296 0.001152461
  850 +2298 0.001179885
  851 +2300 0.001206089
  852 +2302 0.001211066
  853 +2304 0.00121729
  854 +2306 0.001241695
  855 +2308 0.001235318
  856 +2310 0.001195495
  857 +2312 0.001301991
  858 +2314 0.001355443
  859 +2316 0.001254785
  860 +2318 0.001389052
  861 +2320 0.001444937
  862 +2322 0.001558414
  863 +2324 0.001760601
  864 +2326 0.001728333
  865 +2328 0.002103392
  866 +2330 0.002092697
  867 +2332 0.002022837
  868 +2334 0.001938495
  869 +2336 0.0020431
  870 +2338 0.001919468
  871 +2340 0.001964749
  872 +2342 0.002282832
  873 +2344 0.00218892
  874 +2346 0.001801857
  875 +2348 0.001061079
  876 +2350 0.001380168
  877 +2352 0.001870321
  878 +2354 0.002102202
  879 +2356 0.002848422
  880 +2358 0.003216502
  881 +2360 0.003213061
  882 +2362 0.003205797
  883 +2364 0.003022776
  884 +2366 0.002849123
  885 +2368 0.002401033
  886 +2370 0.001848448
  887 +2372 0.001970318
  888 +2374 0.001607119
  889 +2376 0.001408379
  890 +2378 0.001289805
  891 +2380 0.001123742
  892 +2382 0.000998744
  893 +2384 0.001002353
  894 +2386 0.001086115
  895 +2388 0.000939055
  896 +2390 0.000948007
  897 +2392 0.000892462
  898 +2394 0.000979962
  899 +2396 0.000928222
  900 +2398 0.000862539
  901 +2400 0.000864195
  902 +2402 0.000886066
  903 +2404 0.000871955
  904 +2406 0.000811919
  905 +2408 0.000766513
  906 +2410 0.000651421
  907 +2412 0.00073298
  908 +2414 0.000708139
  909 +2416 0.000667666
  910 +2418 0.000600986
  911 +2420 0.000610649
  912 +2422 0.000609326
  913 +2424 0.000516116
  914 +2426 0.000492454
  915 +2428 0.00053116
  916 +2430 0.000488114
  917 +2432 0.000460177
  918 +2434 0.000548829
  919 +2436 0.000464511
  920 +2438 0.000491215
  921 +2440 0.000416051
  922 +2442 0.000427695
  923 +2444 0.000395537
  924 +2446 0.000472624
  925 +2448 0.000432484
  926 +2450 0.00050012
  927 +2452 0.000445504
  928 +2454 0.00047767
  929 +2456 0.000445421
  930 +2458 0.000485085
  931 +2460 0.000498423
  932 +2462 0.000507363
  933 +2464 0.000520304
  934 +2466 0.000539524
  935 +2468 0.000608413
  936 +2470 0.000641548
  937 +2472 0.000638234
  938 +2474 0.00070156
  939 +2476 0.000583209
  940 +2478 0.000691745
  941 +2480 0.00069634
  942 +2482 0.000725514
  943 +2484 0.000664786
  944 +2486 0.000695592
  945 +2488 0.000664905
  946 +2490 0.000711927
  947 +2492 0.000729764
  948 +2494 0.000642008
  949 +2496 0.000666359
  950 +2498 0.000576481
  951 +2500 0.000582793
  952 +2502 0.00060028
  953 +2504 0.000485827
  954 +2506 0.00060824
  955 +2508 0.000551492
  956 +2510 0.000514196
  957 +2512 0.000506979
  958 +2514 0.000475469
  959 +2516 0.000432219
  960 +2518 0.000503847
  961 +2520 0.00046777
  962 +2522 0.000500639
  963 +2524 0.00049432
  964 +2526 0.000561426
  965 +2528 0.000522532
  966 +2530 0.000573555
  967 +2532 0.000597892
  968 +2534 0.000685061
  969 +2536 0.000686714
  970 +2538 0.000669184
  971 +2540 0.000688841
  972 +2542 0.000718256
  973 +2544 0.000663613
  974 +2546 0.000709431
  975 +2548 0.000608731
  976 +2550 0.000729101
  977 +2552 0.000729371
  978 +2554 0.000708222
  979 +2556 0.000702107
  980 +2558 0.000589917
  981 +2560 0.00054794
  982 +2562 0.000549422
  983 +2564 0.000571636
  984 +2566 0.000514345
  985 +2568 0.000549508
  986 +2570 0.000524453
  987 +2572 0.000519339
  988 +2574 0.000493066
  989 +2576 0.000434176
  990 +2578 0.000398249
  991 +2580 0.000438974
  992 +2582 0.000447631
  993 +2584 0.000447255
  994 +2586 0.000326312
  995 +2588 0.000408195
  996 +2590 0.000469383
  997 +2592 0.000485155
  998 +2594 0.000414225
  999 +2596 0.000405927
  1000 +2598 0.000367873
  1001 +2600 0.000355028
  1002 +2602 0.000408022
  1003 +2604 0.000409804
  1004 +2606 0.000337436
  1005 +2608 0.000348352
  1006 +2610 0.00035314
  1007 +2612 0.000285114
  1008 +2614 0.000328725
  1009 +2616 0.000270909
  1010 +2618 0.000295957
  1011 +2620 0.000316483
  1012 +2622 0.000322541
  1013 +2624 0.000283893
  1014 +2626 0.000314178
  1015 +2628 0.000268822
  1016 +2630 0.000266477
  1017 +2632 0.000268892
  1018 +2634 0.0002953
  1019 +2636 0.000292207
  1020 +2638 0.000215858
  1021 +2640 0.000294136
  1022 +2642 0.000272093
  1023 +2644 0.000275717
  1024 +2646 0.000346284
  1025 +2648 0.000283192
  1026 +2650 0.000339755
  1027 +2652 0.000255491
  1028 +2654 0.000208977
  1029 +2656 0.000272149
  1030 +2658 0.000282438
  1031 +2660 0.000158046
  1032 +2662 0.000224042
  1033 +2664 0.000228577
  1034 +2666 0.00017862
  1035 +2668 0.000245571
  1036 +2670 0.000196986
  1037 +2672 0.000252557
  1038 +2674 0.000234491
  1039 +2676 0.000203408
  1040 +2678 0.00017293
  1041 +2680 0.000159348
  1042 +2682 0.000234691
  1043 +2684 0.000214546
  1044 +2686 0.000196188
  1045 +2688 0.000157204
  1046 +2690 0.000208069
  1047 +2692 0.000169639
  1048 +2694 0.000218734
  1049 +2696 0.000218285
  1050 +2698 0.000204734
  1051 +2700 0.000201751
  1052 +2702 0.000264115
  1053 +2704 0.000234648
  1054 +2706 0.000212676
  1055 +2708 0.000270374
  1056 +2710 0.000290756
  1057 +2712 0.000240304
  1058 +2714 0.000316656
  1059 +2716 0.000291376
  1060 +2718 0.000294754
  1061 +2720 0.000351815
  1062 +2722 0.000272567
  1063 +2724 0.000249977
  1064 +2726 0.00035259
  1065 +2728 0.000384766
  1066 +2730 0.000393084
  1067 +2732 0.000410739
  1068 +2734 0.000433305
  1069 +2736 0.000404912
  1070 +2738 0.000420901
  1071 +2740 0.000492476
  1072 +2742 0.000399805
  1073 +2744 0.000456151
  1074 +2746 0.00044387
  1075 +2748 0.000409688
  1076 +2750 0.000418955
  1077 +2752 0.000424004
  1078 +2754 0.000451382
  1079 +2756 0.000482778
  1080 +2758 0.000547175
  1081 +2760 0.000552162
  1082 +2762 0.000570681
  1083 +2764 0.000622641
  1084 +2766 0.000691426
  1085 +2768 0.000597925
  1086 +2770 0.000652725
  1087 +2772 0.000584151
  1088 +2774 0.000624201
  1089 +2776 0.000699342
  1090 +2778 0.000638496
  1091 +2780 0.000707106
  1092 +2782 0.000646861
  1093 +2784 0.000709634
  1094 +2786 0.000679525
  1095 +2788 0.000632315
  1096 +2790 0.000696032
  1097 +2792 0.000664708
  1098 +2794 0.000621352
  1099 +2796 0.00073734
  1100 +2798 0.000724259
  1101 +2800 0.000739695
  1102 +2802 0.000776947
  1103 +2804 0.000896622
  1104 +2806 0.000903473
  1105 +2808 0.000879962
  1106 +2810 0.000961547
  1107 +2812 0.00109481
  1108 +2814 0.001158287
  1109 +2816 0.001209232
  1110 +2818 0.001357019
  1111 +2820 0.001408481
  1112 +2822 0.001613266
  1113 +2824 0.001685368
  1114 +2826 0.001927973
  1115 +2828 0.002122571
  1116 +2830 0.00244482
  1117 +2832 0.002763225
  1118 +2834 0.003192688
  1119 +2836 0.003562301
  1120 +2838 0.003995446
  1121 +2840 0.004252916
  1122 +2842 0.004459092
  1123 +2844 0.004622304
  1124 +2846 0.004644934
  1125 +2848 0.004645169
  1126 +2850 0.004785238
  1127 +2852 0.004798618
  1128 +2854 0.004792012
  1129 +2856 0.004820004
  1130 +2858 0.004727274
  1131 +2860 0.004620571
  1132 +2862 0.004699273
  1133 +2864 0.004703525
  1134 +2866 0.004822295
  1135 +2868 0.005009114
  1136 +2870 0.005093301
  1137 +2872 0.005139671
  1138 +2874 0.005266593
  1139 +2876 0.005667
  1140 +2878 0.005788315
  1141 +2880 0.006064578
  1142 +2882 0.006338457
  1143 +2884 0.006550395
  1144 +2886 0.006741246
  1145 +2888 0.006945089
  1146 +2890 0.007130231
  1147 +2892 0.007372441
  1148 +2894 0.007579747
  1149 +2896 0.007731345
  1150 +2898 0.00819576
  1151 +2900 0.008562466
  1152 +2902 0.00903157
  1153 +2904 0.00937914
  1154 +2906 0.009851342
  1155 +2908 0.010332156
  1156 +2910 0.010793932
  1157 +2912 0.011308225
  1158 +2914 0.011939272
  1159 +2916 0.012554826
  1160 +2918 0.01337334
  1161 +2920 0.014110037
  1162 +2922 0.014829331
  1163 +2924 0.01536142
  1164 +2926 0.015789718
  1165 +2928 0.016096233
  1166 +2930 0.016316084
  1167 +2932 0.016308141
  1168 +2934 0.016443279
  1169 +2936 0.016680791
  1170 +2938 0.017027608
  1171 +2940 0.017818197
  1172 +2942 0.019401865
  1173 +2944 0.021799227
  1174 +2946 0.024186537
  1175 +2948 0.025801865
  1176 +2950 0.02625
  1177 +2952 0.02550612
  1178 +2954 0.023583511
  1179 +2956 0.021342843
  1180 +2958 0.01914838
  1181 +2960 0.017090145
  1182 +2962 0.01539656
  1183 +2964 0.013855732
  1184 +2966 0.012593295
  1185 +2968 0.011483726
  1186 +2970 0.01054501
  1187 +2972 0.009914023
  1188 +2974 0.009757613
  1189 +2976 0.009809223
  1190 +2978 0.010218257
  1191 +2980 0.010809435
  1192 +2982 0.011797056
  1193 +2984 0.012770905
  1194 +2986 0.013636468
  1195 +2988 0.014480479
  1196 +2990 0.01515069
  1197 +2992 0.015619918
  1198 +2994 0.015682193
  1199 +2996 0.015754709
  1200 +2998 0.015366002
  1201 +3000 0.014715111
  1202 +3002 0.014003
  1203 +3004 0.013206518
  1204 +3006 0.012292597
  1205 +3008 0.011394086
  1206 +3010 0.010691684
  1207 +3012 0.009936019
  1208 +3014 0.009296964
  1209 +3016 0.008612659
  1210 +3018 0.007984566
  1211 +3020 0.007436537
  1212 +3022 0.006815112
  1213 +3024 0.006429191
  1214 +3026 0.005806243
  1215 +3028 0.005262323
  1216 +3030 0.004768602
  1217 +3032 0.004320524
  1218 +3034 0.003912193
  1219 +3036 0.003421985
  1220 +3038 0.003098582
  1221 +3040 0.002900269
  1222 +3042 0.002511091
  1223 +3044 0.002161083
  1224 +3046 0.002025539
  1225 +3048 0.001869605
  1226 +3050 0.001691835
  1227 +3052 0.001471398
  1228 +3054 0.001359149
  1229 +3056 0.00124824
  1230 +3058 0.001133357
  1231 +3060 0.001085935
  1232 +3062 0.001030814
  1233 +3064 0.00097166
  1234 +3066 0.001020728
  1235 +3068 0.000940853
  1236 +3070 0.000807141
  1237 +3072 0.000755513
  1238 +3074 0.000751446
  1239 +3076 0.000821568
  1240 +3078 0.000793843
  1241 +3080 0.000633856
  1242 +3082 0.000705054
  1243 +3084 0.000693464
  1244 +3086 0.000648687
  1245 +3088 0.00057882
  1246 +3090 0.000621521
  1247 +3092 0.000491364
  1248 +3094 0.000437328
  1249 +3096 0.000406632
  1250 +3098 0.000537293
  1251 +3100 0.000556879
  1252 +3102 0.000452115
  1253 +3104 0.000463953
  1254 +3106 0.00044965
  1255 +3108 0.000471158
  1256 +3110 0.000432904
  1257 +3112 0.00036216
  1258 +3114 0.000454401
  1259 +3116 0.000412792
  1260 +3118 0.000349278
  1261 +3120 0.000378075
  1262 +3122 0.000285745
  1263 +3124 0.000288687
  1264 +3126 0.000338756
  1265 +3128 0.000323915
  1266 +3130 0.000314324
  1267 +3132 0.000371908
  1268 +3134 0.00034566
  1269 +3136 0.000289967
  1270 +3138 0.000259827
  1271 +3140 0.000334098
  1272 +3142 0.000249786
  1273 +3144 0.000306433
  1274 +3146 0.000164054
  1275 +3148 0.000268845
  1276 +3150 0.000311615
  1277 +3152 0.000402332
  1278 +3154 0.000315994
  1279 +3156 0.000353941
  1280 +3158 0.000336543
  1281 +3160 0.000344823
  1282 +3162 0.000370153
  1283 +3164 0.000362917
  1284 +3166 0.000298576
  1285 +3168 0.000363507
  1286 +3170 0.000287784
  1287 +3172 0.000308446
  1288 +3174 0.000250863
  1289 +3176 0.000301188
  1290 +3178 0.00030549
  1291 +3180 0.000281667
  1292 +3182 0.00027927
  1293 +3184 0.00027765
  1294 +3186 0.000293586
  1295 +3188 0.000355302
  1296 +3190 0.000335228
  1297 +3192 0.000335549
  1298 +3194 0.000362798
  1299 +3196 0.000295649
  1300 +3198 0.000373852
  1301 +3200 0.000328326
  1302 +3202 0.000358333
  1303 +3204 0.00032544
  1304 +3206 0.000387597
  1305 +3208 0.000430661
  1306 +3210 0.000417581
  1307 +3212 0.000324994
  1308 +3214 0.000444512
  1309 +3216 0.000400082
  1310 +3218 0.000377286
  1311 +3220 0.000437329
  1312 +3222 0.000356377
  1313 +3224 0.000352642
  1314 +3226 0.000311089
  1315 +3228 0.000382579
  1316 +3230 0.000329813
  1317 +3232 0.000447714
  1318 +3234 0.000472512
  1319 +3236 0.000457032
  1320 +3238 0.000472607
  1321 +3240 0.000363677
  1322 +3242 0.000394328
  1323 +3244 0.000461889
  1324 +3246 0.000490442
  1325 +3248 0.000438482
  1326 +3250 0.000423751
  1327 +3252 0.000433888
  1328 +3254 0.000499297
  1329 +3256 0.000498987
  1330 +3258 0.000465415
  1331 +3260 0.000421804
  1332 +3262 0.000414397
  1333 +3264 0.000405735
  1334 +3266 0.000487632
  1335 +3268 0.000512952
  1336 +3270 0.000538537
  1337 +3272 0.000552512
  1338 +3274 0.000565302
  1339 +3276 0.00052271
  1340 +3278 0.000486071
  1341 +3280 0.000553016
  1342 +3282 0.000551074
  1343 +3284 0.000550423
  1344 +3286 0.000552049
  1345 +3288 0.000582685
  1346 +3290 0.000602594
  1347 +3292 0.00065031
  1348 +3294 0.000492417
  1349 +3296 0.000568134
  1350 +3298 0.000560644
  1351 +3300 0.000606052
  1352 +3302 0.000632562
  1353 +3304 0.000613536
  1354 +3306 0.000629737
  1355 +3308 0.000723508
  1356 +3310 0.000610128
  1357 +3312 0.000629599
  1358 +3314 0.00061646
  1359 +3316 0.000644116
  1360 +3318 0.000657711
  1361 +3320 0.000671348
  1362 +3322 0.000732666
  1363 +3324 0.000591952
  1364 +3326 0.000639223
  1365 +3328 0.000631524
  1366 +3330 0.000664578
  1367 +3332 0.000750598
  1368 +3334 0.000710665
  1369 +3336 0.000775822
  1370 +3338 0.000768051
  1371 +3340 0.000722316
  1372 +3342 0.000659833
  1373 +3344 0.000705481
  1374 +3346 0.000739379
  1375 +3348 0.000754306
  1376 +3350 0.000858934
  1377 +3352 0.000773878
  1378 +3354 0.000745424
  1379 +3356 0.000749742
  1380 +3358 0.00082974
  1381 +3360 0.000824431
  1382 +3362 0.000877307
  1383 +3364 0.000932521
  1384 +3366 0.00087025
  1385 +3368 0.000887279
  1386 +3370 0.000847555
  1387 +3372 0.000884819
  1388 +3374 0.00087596
  1389 +3376 0.000857088
  1390 +3378 0.00093776
  1391 +3380 0.001039654
  1392 +3382 0.001065518
  1393 +3384 0.00099205
  1394 +3386 0.00099477
  1395 +3388 0.000961683
  1396 +3390 0.001041186
  1397 +3392 0.001128488
  1398 +3394 0.001144315
  1399 +3396 0.001224228
  1400 +3398 0.001154251
  1401 +3400 0.001138032
  1402 +3402 0.001173604
  1403 +3404 0.001248265
  1404 +3406 0.001356015
  1405 +3408 0.001285042
  1406 +3410 0.001316454
  1407 +3412 0.001415994
  1408 +3414 0.001463886
  1409 +3416 0.001644794
  1410 +3418 0.001713653
  1411 +3420 0.001730308
  1412 +3422 0.001932657
  1413 +3424 0.001949152
  1414 +3426 0.002006968
  1415 +3428 0.0020619
  1416 +3430 0.002087098
  1417 +3432 0.002206993
  1418 +3434 0.001964774
  1419 +3436 0.002028821
  1420 +3438 0.002393625
  1421 +3440 0.002708104
  1422 +3442 0.002798177
  1423 +3444 0.002983385
  1424 +3446 0.00291298
  1425 +3448 0.002991802
  1426 +3450 0.003001868
  1427 +3452 0.003042922
  1428 +3454 0.002947307
  1429 +3456 0.003051547
  1430 +3458 0.00264556
  1431 +3460 0.002413914
  1432 +3462 0.002811906
  1433 +3464 0.002335021
  1434 +3466 0.001661673
  1435 +3468 0.001509012
  1436 +3470 0.002093659
  1437 +3472 0.002451124
  1438 +3474 0.002367439
  1439 +3476 0.002393187
  1440 +3478 0.001892594
  1441 +3480 0.002007355
  1442 +3482 0.002249049
  1443 +3484 0.002021025
  1444 +3486 0.001697064
  1445 +3488 0.001840785
  1446 +3490 0.001717791
  1447 +3492 0.001588541
  1448 +3494 0.001424759
  1449 +3496 0.001349834
  1450 +3498 0.001273596
  1451 +3500 0.001208783
  1452 +3502 0.001134414
  1453 +3504 0.001144532
  1454 +3506 0.001002239
  1455 +3508 0.001010699
  1456 +3510 0.001003586
  1457 +3512 0.000904709
  1458 +3514 0.000965619
  1459 +3516 0.000937276
  1460 +3518 0.00097229
  1461 +3520 0.000924807
  1462 +3522 0.00095119
  1463 +3524 0.000890108
  1464 +3526 0.000873585
  1465 +3528 0.000885436
  1466 +3530 0.000885047
  1467 +3532 0.000952793
  1468 +3534 0.001030164
  1469 +3536 0.000992343
  1470 +3538 0.000971817
  1471 +3540 0.000915465
  1472 +3542 0.000959877
  1473 +3544 0.001059664
  1474 +3546 0.001041402
  1475 +3548 0.00090259
  1476 +3550 0.000980567
  1477 +3552 0.000914447
  1478 +3554 0.00080593
  1479 +3556 0.000844328
  1480 +3558 0.000743256
  1481 +3560 0.000855686
  1482 +3562 0.000738947
  1483 +3564 0.000834279
  1484 +3566 0.001144887
  1485 +3568 0.000842023
  1486 +3570 0.00067585
  1487 +3572 0.000602224
  1488 +3574 0.000682329
  1489 +3576 0.000581809
  1490 +3578 0.000568449
  1491 +3580 0.000575447
  1492 +3582 0.000481773
  1493 +3584 0.000581484
  1494 +3586 0.00081874
  1495 +3588 0.000617644
  1496 +3590 0.000442477
  1497 +3592 0.000640158
  1498 +3594 0.000675461
  1499 +3596 0.00051728
  1500 +3598 0.000597346
  1501 +3600 0.000584266
  1502 +3602 0.0004527
  1503 +3604 0.000522512
  1504 +3606 0.000624314
  1505 +3608 0.000574119
  1506 +3610 0.000608948
  1507 +3612 0.0008001
  1508 +3614 0.000712729
  1509 +3616 0.000617938
  1510 +3618 0.000826828
  1511 +3620 0.000760759
  1512 +3622 0.000538546
  1513 +3624 0.000557439
  1514 +3626 0.0007446
  1515 +3628 0.00119225
  1516 +3630 0.000526519
  1517 +3632 0.000556606
  1518 +3634 0.000556875
  1519 +3636 0.000506369
  1520 +3638 0.000552368
  1521 +3640 0.000484705
  1522 +3642 0.000499876
  1523 +3644 0.000531957
  1524 +3646 0.001003344
  1525 +3648 0.000945893
  1526 +3650 0.000999296
  1527 +3652 0.000369562
  1528 +3654 0.000439893
  1529 +3656 0.000386363
  1530 +3658 0.000306059
  1531 +3660 0.000268561
  1532 +3662 0.000200995
  1533 +3664 0.000216152
  1534 +3666 0.00031073
  1535 +3668 0.000539568
  1536 +3670 0.000482811
  1537 +3672 0.000170902
  1538 +3674 0.001357086
  1539 +3676 0.00034876
  1540 +3678 0.000117241
  1541 +3680 0.000137332
  1542 +3682 0.000159181
  1543 +3684 0.000118508
  1544 +3686 0.000149121
  1545 +3688 0.000421635
  1546 +3690 0.000330956
  1547 +3692 -1.81766E-05
  1548 +3694 -2.72672E-05
  1549 +3696 -6.55202E-05
  1550 +3698 -8.60E-06
  1551 +3700 1.51871E-05
  1552 +3702 2.32458E-05
  1553 +3704 -0.000101734
  1554 +3706 -5.30903E-05
  1555 +3708 0.000113641
  1556 +3710 0.000309234
  1557 +3712 0.000106649
  1558 +3714 -3.12E-06
  1559 +3716 -5.76521E-05
  1560 +3718 0.000110276
  1561 +3720 9.06626E-05
  1562 +3722 9.32628E-05
  1563 +3724 -1.2309E-05
  1564 +3726 4.60304E-05
  1565 +3728 -8.27521E-05
  1566 +3730 0.000105094
  1567 +3732 0.000359337
  1568 +3734 0.000615865
  1569 +3736 0.000442528
  1570 +3738 3.18536E-05
  1571 +3740 3.5789E-05
  1572 +3742 0.000292863
  1573 +3744 0.000969885
  1574 +3746 0.000136573
  1575 +3748 0.000457883
  1576 +3750 0.00039287
  1577 +3752 0.000280102
  1578 +3754 8.33166E-05
  1579 +3756 0.000108764
  1580 +3758 0.00020727
  1581 +3760 7.00378E-05
  1582 +3762 -5.27051E-05
  1583 +3764 0.000139553
  1584 +3766 -1.72393E-05
  1585 +3768 7.03872E-05
  1586 +3770 -2.01502E-05
  1587 +3772 -0.000120557
  1588 +3774 -8.82563E-05
  1589 +3776 -2.43E-06
  1590 +3778 0.00019793
  1591 +3780 4.93405E-05
  1592 +3782 1.94903E-05
  1593 +3784 1.86442E-05
  1594 +3786 -0.000137666
  1595 +3788 -3.29324E-05
  1596 +3790 -9.87411E-05
  1597 +3792 -1.07826E-05
  1598 +3794 2.08248E-05
  1599 +3796 0.000114587
  1600 +3798 7.00175E-05
  1601 +3800 0.000491793
  1602 +3802 6.04807E-05
  1603 +3804 3.25705E-05
  1604 +3806 0.000310394
  1605 +3808 2.15496E-05
  1606 +3810 8.00694E-05
  1607 +3812 0.000109453
  1608 +3814 0.00030066
  1609 +3816 0.000393264
  1610 +3818 0.000178967
  1611 +3820 0.000808506
  1612 +3822 0.000105035
  1613 +3824 8.46296E-05
  1614 +3826 0.000121773
  1615 +3828 0.000135065
  1616 +3830 0.000274273
  1617 +3832 8.69895E-05
  1618 +3834 0.000222838
  1619 +3836 0.000601996
  1620 +3838 0.000338187
  1621 +3840 0.00024193
  1622 +3842 0.000133521
  1623 +3844 8.45357E-05
  1624 +3846 1.83423E-05
  1625 +3848 3.48799E-05
  1626 +3850 0.000272218
  1627 +3852 0.001030866
  1628 +3854 0.000469528
  1629 +3856 0.000142735
  1630 +3858 6.34538E-05
  1631 +3860 0.000145079
  1632 +3862 0.000227556
  1633 +3864 0.000296134
  1634 +3866 0.000137378
  1635 +3868 0.000451376
  1636 +3870 0.000226189
  1637 +3872 0.000119799
  1638 +3874 0.000122617
  1639 +3876 5.18662E-05
  1640 +3878 0.000219086
  1641 +3880 0.000268173
  1642 +3882 0.000210735
  1643 +3884 0.000346726
  1644 +3886 0.000183689
  1645 +3888 0.000124343
  1646 +3890 0.000288181
  1647 +3892 1.78834E-05
  1648 +3894 9.95453E-05
  1649 +3896 0.000185088
  1650 +3898 0.000404097
  1651 +3900 0.000218476
  1652 +3902 0.000267402
  1653 +3904 0.000295706
  1654 +3906 0.000103094
  1655 +3908 0.000101332
  1656 +3910 0.000105612
  1657 +3912 5.01633E-05
  1658 +3914 5.69529E-05
  1659 +3916 0.000170528
  1660 +3918 9.52556E-05
  1661 +3920 0.000168842
  1662 +3922 0.00010632
  1663 +3924 0.000344961
  1664 +3926 7.59984E-05
  1665 +3928 0.000221155
  1666 +3930 8.75421E-05
  1667 +3932 0.000298592
  1668 +3934 9.37313E-05
  1669 +3936 0.000114365
  1670 +3938 0.000223073
  1671 +3940 0.000267331
  1672 +3942 0.000273424
  1673 +3944 0.000143308
  1674 +3946 0.000155693
  1675 +3948 0.000195926
  1676 +3950 0.00020435
  1677 +3952 0.000132183
  1678 +3954 0.000197331
  1679 +3956 0.000248508
  1680 +3958 0.000140694
  1681 +3960 0.000166407
  1682 +3962 0.000118974
  1683 +3964 7.31663E-05
  1684 +3966 0.00011566
  1685 +3968 7.56379E-05
  1686 +3970 0.000137593
  1687 +3972 0.000116022
  1688 +3974 0.000186931
  1689 +3976 0.000201803
  1690 +3978 0.000150322
  1691 +3980 0.000141396
  1692 +3982 0.000187293
  1693 +3984 0.000263054
  1694 +3986 0.000212817
  1695 +3988 0.000210708
  1696 +3990 0.000217985
  1697 +3992 0.000192881
  1698 +3994 0.000182579
  1699 +3996 0.000164746
  1700 +3998 0.000200347
  1701 +4000 0.000253085
  1702 +4002 0.000171612
  1703 +4004 0.000149877
  1704 +4006 0.000208808
  1705 +4008 0.000140164
  1706 +4010 0.000188787
  1707 +4012 0.000168944
  1708 +4014 0.000177989
  1709 +4016 0.000163891
  1710 +4018 0.000158359
  1711 +4020 0.000136663
  1712 +4022 0.000216707
  1713 +4024 0.000191577
  1714 +4026 0.000150521
  1715 +4028 0.000122795
  1716 +4030 0.000181619
  1717 +4032 0.000211165
  1718 +4034 0.000247671
  1719 +4036 0.000213884
  1720 +4038 0.000193577
  1721 +4040 0.000142549
  1722 +4042 0.000158466
  1723 +4044 0.000246274
  1724 +4046 0.000177406
  1725 +4048 0.000166641
  1726 +4050 0.000176623
  1727 +4052 0.000228601
  1728 +4054 0.000144074
  1729 +4056 0.000218833
  1730 +4058 0.000200763
  1731 +4060 0.000151771
  1732 +4062 0.00015336
  1733 +4064 0.000139108
  1734 +4066 0.000169462
  1735 +4068 0.000123463
  1736 +4070 0.000202624
  1737 +4072 0.000208393
  1738 +4074 0.000167816
  1739 +4076 0.000174958
  1740 +4078 0.000210896
  1741 +4080 0.000207398
  1742 +4082 0.000127384
  1743 +4084 0.000173693
  1744 +4086 0.000200631
  1745 +4088 0.000269673
  1746 +4090 0.000223231
  1747 +4092 0.00029172
  1748 +4094 0.00031649
  1749 +4096 0.000285588
  1750 +4098 0.000251761
  1751 +4100 0.000339028
  1752 +4102 0.000298703
  1753 +4104 0.00024852
  1754 +4106 0.000209136
  1755 +4108 0.000246085
  1756 +4110 0.000282685
  1757 +4112 0.000191696
  1758 +4114 0.000254014
  1759 +4116 0.000228422
  1760 +4118 0.000306607
  1761 +4120 0.000229142
  1762 +4122 0.000348631
  1763 +4124 0.000287556
  1764 +4126 0.000264232
  1765 +4128 0.000209319
  1766 +4130 0.000242237
  1767 +4132 0.000281044
  1768 +4134 0.000321739
  1769 +4136 0.000294847
  1770 +4138 0.000347712
  1771 +4140 0.00036883
  1772 +4142 0.000328563
  1773 +4144 0.000261437
  1774 +4146 0.000334065
  1775 +4148 0.000325497
  1776 +4150 0.000275545
  1777 +4152 0.000358192
  1778 +4154 0.000286392
  1779 +4156 0.000456376
  1780 +4158 0.000388783
  1781 +4160 0.000360544
  1782 +4162 0.000365173
  1783 +4164 0.00028698
  1784 +4166 0.000371822
  1785 +4168 0.000364618
  1786 +4170 0.000288243
  1787 +4172 0.000307984
  1788 +4174 0.000332854
  1789 +4176 0.00032695
  1790 +4178 0.000388172
  1791 +4180 0.000348726
  1792 +4182 0.000368687
  1793 +4184 0.000341082
  1794 +4186 0.000304622
  1795 +4188 0.000287432
  1796 +4190 0.00031641
  1797 +4192 0.000327385
  1798 +4194 0.000313965
  1799 +4196 0.000378199
  1800 +4198 0.000292018
  1801 +4200 0.000371458
  1802 +4202 0.000405758
  1803 +4204 0.000408023
  1804 +4206 0.000371601
  1805 +4208 0.000316549
  1806 +4210 0.000408096
  1807 +4212 0.000363203
  1808 +4214 0.00032933
  1809 +4216 0.00043362
  1810 +4218 0.000370029
  1811 +4220 0.000360431
  1812 +4222 0.000390905
  1813 +4224 0.000308371
  1814 +4226 0.000243889
  1815 +4228 0.000400749
  1816 +4230 0.000232047
  1817 +4232 0.00038913
  1818 +4234 0.000202101
  1819 +4236 0.000313043
  1820 +4238 0.000234972
  1821 +4240 0.000299282
  1822 +4242 0.000291387
  1823 +4244 0.000257221
  1824 +4246 0.000254894
  1825 +4248 0.000313133
  1826 +4250 0.000272395
  1827 +4252 0.000329282
  1828 +4254 0.000211776
  1829 +4256 0.000161765
  1830 +4258 0.0002771
  1831 +4260 0.000244175
  1832 +4262 0.00024201
  1833 +4264 0.000174491
  1834 +4266 0.000304066
  1835 +4268 0.000350939
  1836 +4270 0.000355563
  1837 +4272 0.000271775
  1838 +4274 0.000291467
  1839 +4276 0.000230176
  1840 +4278 0.000394533
  1841 +4280 0.000249728
  1842 +4282 0.000215013
  1843 +4284 0.000246479
  1844 +4286 0.000326038
  1845 +4288 0.000189699
  1846 +4290 0.000268778
  1847 +4292 0.00013331
  1848 +4294 0.000323916
  1849 +4296 0.000216853
  1850 +4298 0.000291581
  1851 +4300 0.000314194
  1852 +4302 0.000279978
  1853 +4304 0.00021133
  1854 +4306 0.000270665
  1855 +4308 0.000204827
  1856 +4310 0.000296492
  1857 +4312 0.000272268
  1858 +4314 0.000237342
  1859 +4316 0.000281693
  1860 +4318 0.000289106
  1861 +4320 0.000303374
  1862 +4322 0.000325679
  1863 +4324 0.000239933
  1864 +4326 0.000314462
  1865 +4328 0.000253209
  1866 +4330 0.000241805
  1867 +4332 0.000351215
  1868 +4334 0.000286358
  1869 +4336 0.000330223
  1870 +4338 0.000369278
  1871 +4340 0.000329129
  1872 +4342 0.000275593
  1873 +4344 0.00029688
  1874 +4346 0.000346473
  1875 +4348 0.000352509
  1876 +4350 0.000355569
  1877 +4352 0.000461464
  1878 +4354 0.000250317
  1879 +4356 0.000427547
  1880 +4358 0.000434099
  1881 +4360 0.000343595
  1882 +4362 0.000350079
  1883 +4364 0.000408112
  1884 +4366 0.000350043
  1885 +4368 0.000411028
  1886 +4370 0.000434798
  1887 +4372 0.000409623
  1888 +4374 0.000423228
  1889 +4376 0.00037185
  1890 +4378 0.000433805
  1891 +4380 0.000454019
  1892 +4382 0.000443482
  1893 +4384 0.000545947
  1894 +4386 0.000429948
  1895 +4388 0.00038776
  1896 +4390 0.000416255
  1897 +4392 0.00040207
  1898 +4394 0.000397386
  1899 +4396 0.00040638
  1900 +4398 0.000369246
  1901 +4400 0.000460818
  1902 +4402 0.000381619
  1903 +4404 0.000382068
  1904 +4406 0.00032482
  1905 +4408 0.000457543
  1906 +4410 0.000455416
  1907 +4412 0.000487212
  1908 +4414 0.000417398
  1909 +4416 0.000382643
  1910 +4418 0.000403196
  1911 +4420 0.000493331
  1912 +4422 0.000341439
  1913 +4424 0.000513969
  1914 +4426 0.000587223
  1915 +4428 0.000580159
  1916 +4430 0.000557957
  1917 +4432 0.000556266
  1918 +4434 0.000517113
  1919 +4436 0.000660822
  1920 +4438 0.000569927
  1921 +4440 0.000582118
  1922 +4442 0.000542652
  1923 +4444 0.000591509
  1924 +4446 0.000512382
  1925 +4448 0.000560221
  1926 +4450 0.000487317
  1927 +4452 0.000482114
  1928 +4454 0.000461281
  1929 +4456 0.000393521
  1930 +4458 0.000388897
  1931 +4460 0.000397314
  1932 +4462 0.000315475
  1933 +4464 0.000310207
  1934 +4466 0.000266723
  1935 +4468 0.000339416
  1936 +4470 0.000292223
  1937 +4472 0.000281582
  1938 +4474 0.000329826
  1939 +4476 0.000289373
  1940 +4478 0.00021093
  1941 +4480 0.000174358
  1942 +4482 0.000341538
  1943 +4484 0.000247057
  1944 +4486 0.000273322
  1945 +4488 0.000234901
  1946 +4490 0.000203559
  1947 +4492 0.000129721
  1948 +4494 7.83785E-05
  1949 +4496 0.000190952
  1950 +4498 0.000131392
  1951 +4500 0.000193057
  1952 +4502 1.24492E-05
  1953 +4504 9.08797E-05
  1954 +4506 0.000144288
  1955 +4508 0.000127571
  1956 +4510 2.51343E-05
  1957 +4512 7.48194E-05
  1958 +4514 0.000103584
  1959 +4516 4.19407E-05
  1960 +4518 2.40009E-05
  1961 +4520 0.000102142
  1962 +4522 1.18914E-05
  1963 +4524 5.72128E-05
  1964 +4526 -8.73734E-05
  1965 +4528 -1.76682E-05
  1966 +4530 -4.90721E-05
  1967 +4532 -4.71309E-05
  1968 +4534 3.91112E-05
  1969 +4536 1.34E-06
  1970 +4538 9.62881E-05
  1971 +4540 3.37309E-05
  1972 +4542 -2.91281E-05
  1973 +4544 -3.2849E-05
  1974 +4546 -1.58304E-05
  1975 +4548 0.000110588
  1976 +4550 7.05284E-05
  1977 +4552 7.94542E-05
  1978 +4554 3.37392E-05
  1979 +4556 -9.20E-06
  1980 +4558 -2.21519E-05
  1981 +4560 3.46914E-05
  1982 +4562 5.61431E-05
  1983 +4564 8.01E-06
  1984 +4566 -0.000103626
  1985 +4568 3.34905E-05
  1986 +4570 -2.32184E-05
  1987 +4572 -1.08982E-05
  1988 +4574 4.1603E-05
  1989 +4576 -5.00568E-05
  1990 +4578 -6.83E-06
  1991 +4580 2.7055E-05
  1992 +4582 2.86344E-05
  1993 +4584 5.87E-06
  1994 +4586 -6.99461E-05
  1995 +4588 -8.39377E-05
  1996 +4590 3.60434E-05
  1997 +4592 7.96765E-05
  1998 +4594 -0.000177672
  1999 +4596 -3.17066E-05
  2000 +4598 3.72168E-05
  2001 +4600 -6.88E-06
  2002 +4602 -6.03735E-05
  2003 +4604 4.66722E-05
  2004 +4606 -3.54641E-05
  2005 +4608 -1.74806E-05
  2006 +4610 -1.28922E-05
  2007 +4612 7.60359E-05
  2008 +4614 8.66487E-05
  2009 +4616 9.21211E-05
  2010 +4618 -5.23373E-05
  2011 +4620 -5.48989E-05
  2012 +4622 -6.38442E-05
  2013 +4624 3.55E-07
  2014 +4626 5.57926E-05
  2015 +4628 -4.49083E-05
  2016 +4630 -2.67924E-05
  2017 +4632 -7.71728E-05
  2018 +4634 3.694E-05
  2019 +4636 0.00012611
  2020 +4638 -5.57319E-05
  2021 +4640 -4.87582E-05
  2022 +4642 9.33695E-05
  2023 +4644 0.000127693
  2024 +4646 -2.1893E-05
  2025 +4648 3.65E-06
  2026 +4650 -3.07E-06
  2027 +4652 -2.23231E-05
  2028 +4654 5.90752E-05
  2029 +4656 1.12225E-05
  2030 +4658 3.36415E-05
  2031 +4660 -9.07325E-05
  2032 +4662 -2.33188E-05
  2033 +4664 7.71021E-05
  2034 +4666 2.75205E-05
  2035 +4668 5.73118E-05
  2036 +4670 0.000100899
  2037 +4672 5.6625E-05
  2038 +4674 0.000142437
  2039 +4676 -2.07439E-05
  2040 +4678 -1.93856E-05
  2041 +4680 9.87695E-05
  2042 +4682 4.89309E-05
  2043 +4684 3.68502E-05
  2044 +4686 0.000153062
  2045 +4688 8.76468E-05
  2046 +4690 0.000112023
  2047 +4692 -9.49E-06
  2048 +4694 2.66218E-05
  2049 +4696 -5.76107E-05
  2050 +4698 -8.38058E-05
  2051 +4700 -2.9238E-05
  2052 +4702 -3.11E-06
  2053 +4704 8.99146E-05
  2054 +4706 1.31697E-05
  2055 +4708 -9.5303E-05
  2056 +4710 -2.87252E-05
  2057 +4712 3.52673E-05
  2058 +4714 0.000136868
  2059 +4716 7.36812E-05
  2060 +4718 4.36516E-05
  2061 +4720 -4.05162E-05
  2062 +4722 -2.18182E-05
  2063 +4724 1.13599E-05
  2064 +4726 -4.26783E-05
  2065 +4728 4.49779E-05
  2066 +4730 5.46657E-05
  2067 +4732 6.31277E-05
  2068 +4734 9.201E-05
  2069 +4736 -2.84995E-05
  2070 +4738 -1.96E-06
  2071 +4740 4.16116E-05
  2072 +4742 2.40E-06
  2073 +4744 0.000106433
  2074 +4746 7.86067E-05
  2075 +4748 -2.31924E-05
  2076 +4750 0.000110697
  2077 +4752 -0.000105205
  2078 +4754 -4.20045E-05
  2079 +4756 5.92E-06
  2080 +4758 -4.33579E-05
  2081 +4760 -0.00010886
  2082 +4762 -7.24948E-05
  2083 +4764 3.96924E-05
  2084 +4766 -0.000191847
  2085 +4768 -0.000117285
  2086 +4770 -6.34291E-05
  2087 +4772 2.12932E-05
  2088 +4774 -3.24E-06
  2089 +4776 1.09424E-05
  2090 +4778 -8.83467E-05
  2091 +4780 3.50E-06
  2092 +4782 -0.000107665
  2093 +4784 -4.71369E-05
  2094 +4786 -0.000105939
  2095 +4788 -1.78558E-05
  2096 +4790 -6.54974E-05
  2097 +4792 -6.69849E-05
  2098 +4794 -0.000104735
  2099 +4796 6.49E-06
  2100 +4798 -0.000146163
  2101 +4800 8.23E-06
  2102 +4802 -3.12394E-05
  2103 +4804 -0.000185322
  2104 +4806 -8.58323E-05
  2105 +4808 -0.000100005
  2106 +4810 -0.00011669
  2107 +4812 -0.000133039
  2108 +4814 -7.84302E-05
  2109 +4816 -9.72117E-05
  2110 +4818 -7.66769E-05
  2111 +4820 -9.0187E-05
  2112 +4822 -0.000155309
  2113 +4824 2.07393E-05
  2114 +4826 5.72E-06
  2115 +4828 -4.57609E-05
  2116 +4830 -0.000194768
  2117 +4832 -0.000133392
  2118 +4834 -0.000165423
  2119 +4836 -0.000152181
  2120 +4838 -0.00017315
  2121 +4840 -6.8367E-05
  2122 +4842 -0.000168049
  2123 +4844 -9.85448E-05
  2124 +4846 -1.83435E-05
  2125 +4848 -4.66214E-05
  2126 +4850 -6.72124E-05
  2127 +4852 -8.60337E-05
  2128 +4854 -0.000139507
  2129 +4856 -7.10E-06
  2130 +4858 -9.54554E-05
  2131 +4860 -7.87667E-05
  2132 +4862 -0.000169032
  2133 +4864 4.42985E-05
  2134 +4866 -5.87E-06
  2135 +4868 -5.49307E-05
  2136 +4870 -9.6575E-05
  2137 +4872 -0.000134905
  2138 +4874 -9.29933E-05
  2139 +4876 -8.09305E-05
  2140 +4878 -0.000291688
  2141 +4880 -9.6625E-05
  2142 +4882 -0.000130894
  2143 +4884 -0.000118673
  2144 +4886 -0.00013703
  2145 +4888 -0.000117201
  2146 +4890 -2.7273E-05
  2147 +4892 -0.000149352
  2148 +4894 -6.61949E-05
  2149 +4896 -0.000129105
  2150 +4898 -0.000158602
  2151 +4900 -8.34552E-05
  2152 +4902 -0.000109603
  2153 +4904 -0.00014692
  2154 +4906 -0.000183268
  2155 +4908 -9.97988E-05
  2156 +4910 -0.000229024
  2157 +4912 -1.11176E-05
  2158 +4914 -0.000155447
  2159 +4916 -8.83261E-05
  2160 +4918 -7.58636E-05
  2161 +4920 -0.000157625
  2162 +4922 -0.000196801
  2163 +4924 -8.35149E-05
  2164 +4926 -9.21691E-05
  2165 +4928 -3.23171E-05
  2166 +4930 -0.000193988
  2167 +4932 -9.61135E-05
  2168 +4934 -0.000101847
  2169 +4936 -6.05769E-05
  2170 +4938 -0.000123916
  2171 +4940 -0.000132141
  2172 +4942 -0.00013735
  2173 +4944 -0.000136462
  2174 +4946 -0.000101766
  2175 +4948 -0.000154092
  2176 +4950 -0.000214223
  2177 +4952 -0.000117774
  2178 +4954 -7.17024E-05
  2179 +4956 -0.000183699
  2180 +4958 -0.00017453
  2181 +4960 -0.000249751
  2182 +4962 -0.000132127
  2183 +4964 5.13399E-05
  2184 +4966 -4.20862E-05
  2185 +4968 -2.52E-06
  2186 +4970 -0.000180519
  2187 +4972 -9.29657E-05
  2188 +4974 -0.000190246
  2189 +4976 -0.000125231
  2190 +4978 3.1279E-05
  2191 +4980 -0.000248043
  2192 +4982 -0.000134352
  2193 +4984 -2.83712E-05
  2194 +4986 -0.000106364
  2195 +4988 -0.000176678
  2196 +4990 -4.92341E-05
  2197 +4992 -5.76105E-05
  2198 +4994 -0.000122315
  2199 +4996 -0.000196789
  2200 +4998 -5.34783E-05
  2201 +5000 -6.5335E-05
  2202 +5002 -0.000226349
  2203 +5004 -0.000101908
  2204 +5006 -6.35036E-05
  2205 +5008 -0.000183858
  2206 +5010 -1.66743E-05
  2207 +5012 -0.000130706
  2208 +5014 4.27E-06
  2209 +5016 -3.28712E-05
  2210 +5018 -0.000182452
  2211 +5020 -6.57517E-05
  2212 +5022 -6.14048E-05
  2213 +5024 -5.15595E-05
  2214 +5026 -5.28437E-05
  2215 +5028 -0.000128204
  2216 +5030 -8.17912E-05
  2217 +5032 -5.30334E-05
  2218 +5034 4.59457E-05
  2219 +5036 -5.073E-05
  2220 +5038 -1.4378E-05
  2221 +5040 -0.000191915
  2222 +5042 -7.42078E-05
  2223 +5044 -0.000115069
  2224 +5046 -0.000147359
  2225 +5048 -5.59493E-05
  2226 +5050 -0.000110795
  2227 +5052 2.13693E-05
  2228 +5054 -3.90667E-05
  2229 +5056 -4.18254E-05
  2230 +5058 -0.000221218
  2231 +5060 -0.000171646
  2232 +5062 -4.28584E-05
  2233 +5064 -0.000103295
  2234 +5066 6.28557E-05
  2235 +5068 -6.38849E-05
  2236 +5070 -7.2519E-05
  2237 +5072 -4.04725E-05
  2238 +5074 -0.000162146
  2239 +5076 -6.50715E-05
  2240 +5078 -4.47088E-05
  2241 +5080 -8.4281E-05
  2242 +5082 -8.43487E-05
  2243 +5084 -0.000186466
  2244 +5086 -0.000247114
  2245 +5088 -3.90E-07
  2246 +5090 -0.000131357
  2247 +5092 -0.000165973
  2248 +5094 3.69467E-05
  2249 +5096 -1.92271E-05
  2250 +5098 -3.22E-06
  2251 +5100 -2.12904E-05
  2252 +5102 -6.97464E-05
  2253 +5104 -0.000102491
  2254 +5106 -0.000121148
  2255 +5108 -3.97039E-05
  2256 +5110 -5.85939E-05
  2257 +5112 -0.000273178
  2258 +5114 -5.84787E-05
  2259 +5116 5.61396E-05
  2260 +5118 -5.16509E-05
  2261 +5120 -0.00018082
  2262 +5122 -5.49575E-05
  2263 +5124 -0.000178501
  2264 +5126 -0.000111293
  2265 +5128 -0.000142361
  2266 +5130 3.78E-06
  2267 +5132 -5.02351E-05
  2268 +5134 9.15343E-05
  2269 +5136 -4.70089E-05
  2270 +5138 -0.00010954
  2271 +5140 1.13571E-05
  2272 +5142 4.82898E-05
  2273 +5144 3.77874E-05
  2274 +5146 -5.93503E-05
  2275 +5148 -0.000164972
  2276 +5150 -8.57053E-05
  2277 +5152 -0.000197877
  2278 +5154 -1.85536E-05
  2279 +5156 -0.000278435
  2280 +5158 -5.9856E-05
  2281 +5160 -5.08827E-05
  2282 +5162 0.000122482
  2283 +5164 5.08896E-05
  2284 +5166 5.83805E-05
  2285 +5168 -0.00012685
  2286 +5170 0.000164092
  2287 +5172 -0.000114154
  2288 +5174 4.62051E-05
  2289 +5176 5.11492E-05
  2290 +5178 -4.62975E-05
  2291 +5180 0.000174738
  2292 +5182 -0.000105599
  2293 +5184 -2.24336E-05
  2294 +5186 6.56395E-05
  2295 +5188 -5.17781E-05
  2296 +5190 7.28549E-05
  2297 +5192 -6.157E-05
  2298 +5194 2.61121E-05
  2299 +5196 0.000121307
  2300 +5198 3.9461E-05
  2301 +5200 6.95204E-05
  2302 +5202 -0.000152101
  2303 +5204 -1.45664E-05
  2304 +5206 -2.81734E-05
  2305 +5208 3.3733E-05
  2306 +5210 -0.000191675
  2307 +5212 -0.000238876
  2308 +5214 5.27E-06
  2309 +5216 -5.55352E-05
  2310 +5218 -0.000242827
  2311 +5220 3.41334E-05
  2312 +5222 -0.000214394
  2313 +5224 1.97708E-05
  2314 +5226 8.8285E-05
  2315 +5228 0.000103699
  2316 +5230 -6.78999E-05
  2317 +5232 -6.29237E-05
  2318 +5234 5.72257E-05
  2319 +5236 -1.89721E-05
  2320 +5238 -0.000113873
  2321 +5240 -4.68908E-05
  2322 +5242 -3.77538E-05
  2323 +5244 0.000139638
  2324 +5246 -4.43735E-05
  2325 +5248 -0.000102626
  2326 +5250 -2.08864E-05
  2327 +5252 7.16191E-05
  2328 +5254 -0.000179139
  2329 +5256 -0.000204764
  2330 +5258 5.62019E-05
  2331 +5260 6.92956E-05
  2332 +5262 -0.00011329
  2333 +5264 -2.34642E-05
  2334 +5266 4.14054E-05
  2335 +5268 1.74697E-05
  2336 +5270 -0.000238236
  2337 +5272 -9.28767E-05
  2338 +5274 -7.16975E-05
  2339 +5276 -0.000127366
  2340 +5278 -0.000230925
  2341 +5280 -2.65856E-05
  2342 +5282 -6.2476E-05
  2343 +5284 -7.327E-05
  2344 +5286 1.91461E-05
  2345 +5288 -7.2295E-05
  2346 +5290 -0.000147312
  2347 +5292 -7.62531E-05
  2348 +5294 -0.000144729
  2349 +5296 -0.000126474
  2350 +5298 -2.27904E-05
  2351 +5300 -0.000112916
  2352 +5302 -8.64288E-05
  2353 +5304 5.86161E-05
  2354 +5306 -0.000139173
  2355 +5308 9.46683E-05
  2356 +5310 -0.000149661
  2357 +5312 -0.000271663
  2358 +5314 1.51686E-05
  2359 +5316 -5.13603E-05
  2360 +5318 4.16107E-05
  2361 +5320 -0.00018097
  2362 +5322 -0.000168231
  2363 +5324 -8.75568E-05
  2364 +5326 1.26443E-05
  2365 +5328 -2.70E-06
  2366 +5330 -0.000102704
  2367 +5332 -3.18529E-05
  2368 +5334 -0.000107168
  2369 +5336 -3.44404E-05
  2370 +5338 5.39579E-05
  2371 +5340 -9.77379E-05
  2372 +5342 0.000125462
  2373 +5344 4.98398E-05
  2374 +5346 -0.000146261
  2375 +5348 -0.000171159
  2376 +5350 -1.69326E-05
  2377 +5352 0.000177523
  2378 +5354 -7.21671E-05
  2379 +5356 -0.000260525
  2380 +5358 -0.000169717
  2381 +5360 -0.000120504
  2382 +5362 -0.000136292
  2383 +5364 -8.95291E-05
  2384 +5366 -0.000137501
  2385 +5368 2.8667E-05
  2386 +5370 -8.19487E-05
  2387 +5372 -0.000148664
  2388 +5374 -2.76867E-05
  2389 +5376 -7.21953E-05
  2390 +5378 -9.64493E-05
  2391 +5380 -0.000148179
  2392 +5382 -5.98436E-05
  2393 +5384 -0.000124761
  2394 +5386 -0.000202081
  2395 +5388 -0.000166304
  2396 +5390 -0.000210005
  2397 +5392 -0.00010521
  2398 +5394 -7.30E-07
  2399 +5396 0.000138772
  2400 +5398 -6.01E-06
  2401 +5400 -0.000188874
  2402 +5402 -5.08203E-05
  2403 +5404 -0.000270553
  2404 +5406 -0.000140069
  2405 +5408 -0.000148844
  2406 +5410 9.32963E-05
  2407 +5412 -0.000131394
  2408 +5414 -0.00011106
  2409 +5416 -9.04442E-05
  2410 +5418 -0.000154567
  2411 +5420 -8.9573E-05
  2412 +5422 -0.000150372
  2413 +5424 -5.82735E-05
  2414 +5426 -0.000166476
  2415 +5428 -1.28661E-05
  2416 +5430 6.85E-06
  2417 +5432 -7.06364E-05
  2418 +5434 -0.000111032
  2419 +5436 -0.000211053
  2420 +5438 -8.24E-06
  2421 +5440 -7.89619E-05
  2422 +5442 1.04035E-05
  2423 +5444 0.000147427
  2424 +5446 -9.76797E-05
  2425 +5448 -0.000136429
  2426 +5450 -0.000211055
  2427 +5452 -0.000161586
  2428 +5454 -5.84473E-05
  2429 +5456 -5.15973E-05
  2430 +5458 -2.10924E-05
  2431 +5460 4.70888E-05
  2432 +5462 -0.000356925
  2433 +5464 -0.000285499
  2434 +5466 -9.7915E-05
  2435 +5468 -7.49916E-05
  2436 +5470 -7.99851E-05
  2437 +5472 -0.000156726
  2438 +5474 7.08954E-05
  2439 +5476 -0.000235041
  2440 +5478 4.11383E-05
  2441 +5480 -8.73586E-05
  2442 +5482 -0.000263069
  2443 +5484 -0.000131456
  2444 +5486 -0.000217176
  2445 +5488 -0.000123259
  2446 +5490 -0.000162573
  2447 +5492 8.80588E-05
  2448 +5494 -5.13835E-05
  2449 +5496 -0.000177107
  2450 +5498 -1.08686E-05
  2451 +5500 -0.00013401
  2452 +5502 -2.17232E-05
  2453 +5504 -0.000204563
  2454 +5506 -0.000130573
  2455 +5508 -0.000138882
  2456 +5510 -4.71656E-05
  2457 +5512 -0.000226241
  2458 +5514 -0.000158162
  2459 +5516 -0.00016349
  2460 +5518 -0.00022113
  2461 +5520 -1.90E-06
  2462 +5522 -8.43313E-05
  2463 +5524 -0.000294269
  2464 +5526 -8.10355E-05
  2465 +5528 -0.0001755
  2466 +5530 -0.000149491
  2467 +5532 -0.000185625
  2468 +5534 -0.000181539
  2469 +5536 -0.000227489
  2470 +5538 -0.000142212
  2471 +5540 -6.22151E-05
  2472 +5542 -4.10673E-05
  2473 +5544 -0.000129738
  2474 +5546 -0.000165541
  2475 +5548 -0.000120703
  2476 +5550 -0.000250116
  2477 +5552 -0.000189888
  2478 +5554 -9.45214E-05
  2479 +5556 -0.000206709
  2480 +5558 -0.000114229
  2481 +5560 -2.74E-06
  2482 +5562 -0.000174771
  2483 +5564 -0.000215381
  2484 +5566 -0.000435337
  2485 +5568 -7.92925E-05
  2486 +5570 -0.000264598
  2487 +5572 -5.21323E-05
  2488 +5574 -0.000184079
  2489 +5576 -0.000195211
  2490 +5578 6.14E-06
  2491 +5580 -1.34219E-05
  2492 +5582 -0.000142205
  2493 +5584 -0.000201266
  2494 +5586 -0.000136273
  2495 +5588 -4.36936E-05
  2496 +5590 -0.000177113
  2497 +5592 -0.000192107
  2498 +5594 -0.000285436
  2499 +5596 -0.000206806
  2500 +5598 -0.000143489
  2501 +5600 -0.000197125
  2502 +5602 -0.000227679
  2503 +5604 -0.000228332
  2504 +5606 -6.73004E-05
  2505 +5608 -0.00010937
  2506 +5610 -0.000349687
  2507 +5612 -0.000177179
  2508 +5614 -0.00025193
  2509 +5616 -5.64675E-05
  2510 +5618 -0.000170188
  2511 +5620 -0.000230005
  2512 +5622 -0.00040001
  2513 +5624 -3.67655E-05
  2514 +5626 -7.16761E-05
  2515 +5628 -0.000397345
  2516 +5630 -4.36E-07
  2517 +5632 -4.1559E-05
  2518 +5634 -0.000190926
  2519 +5636 -0.000371965
  2520 +5638 -0.00024466
  2521 +5640 2.96284E-05
  2522 +5642 -3.24397E-05
  2523 +5644 -0.000369574
  2524 +5646 -9.12484E-05
  2525 +5648 -0.000200854
  2526 +5650 -0.0002112
  2527 +5652 -0.00010615
  2528 +5654 -0.0002109
  2529 +5656 -0.000131312
  2530 +5658 -7.34227E-05
  2531 +5660 -0.000125623
  2532 +5662 -0.000222683
  2533 +5664 -3.11127E-05
  2534 +5666 -0.000142646
  2535 +5668 -9.98779E-05
  2536 +5670 -2.86769E-05
  2537 +5672 -0.000218787
  2538 +5674 -7.01801E-05
  2539 +5676 -0.000370383
  2540 +5678 1.93936E-05
  2541 +5680 -0.000236552
  2542 +5682 -0.000114162
  2543 +5684 -1.40634E-05
  2544 +5686 -9.94189E-05
  2545 +5688 5.44862E-05
  2546 +5690 -9.22632E-05
  2547 +5692 -0.000235726
  2548 +5694 -0.000286721
  2549 +5696 -9.80563E-05
  2550 +5698 -0.000186885
  2551 +5700 -8.91076E-05
  2552 +5702 -0.000116416
  2553 +5704 -0.00014795
  2554 +5706 2.03924E-05
  2555 +5708 -9.58288E-05
  2556 +5710 -6.8708E-05
  2557 +5712 -0.000150654
  2558 +5714 -3.29562E-05
  2559 +5716 -0.000217313
  2560 +5718 1.36356E-05
  2561 +5720 -4.4006E-05
  2562 +5722 -0.000146933
  2563 +5724 -3.21571E-05
  2564 +5726 -0.000122156
  2565 +5728 -0.000269322
  2566 +5730 -0.000197751
  2567 +5732 -0.000130912
  2568 +5734 -0.000154111
  2569 +5736 -9.53856E-05
  2570 +5738 -0.000240261
  2571 +5740 -0.000161401
  2572 +5742 6.45E-06
  2573 +5744 -0.000184411
  2574 +5746 -0.000245277
  2575 +5748 -0.000212489
  2576 +5750 -4.43252E-05
  2577 +5752 -0.000107688
  2578 +5754 1.07502E-05
  2579 +5756 -0.000167197
  2580 +5758 -6.68704E-05
  2581 +5760 -4.80992E-05
  2582 +5762 -5.66434E-05
  2583 +5764 -0.000228705
  2584 +5766 -0.000265847
  2585 +5768 -9.75073E-05
  2586 +5770 -0.000122477
  2587 +5772 -0.00013384
  2588 +5774 -0.00030111
  2589 +5776 -6.26301E-05
  2590 +5778 3.12553E-05
  2591 +5780 -5.04101E-05
  2592 +5782 -0.000160911
  2593 +5784 -3.53197E-05
  2594 +5786 -0.000214252
  2595 +5788 2.99878E-05
  2596 +5790 -0.000147791
  2597 +5792 -4.13023E-05
  2598 +5794 -6.57403E-05
  2599 +5796 -0.000122902
  2600 +5798 2.21647E-05
  2601 +5800 -6.32159E-05
  2602 +5802 -6.96488E-05
  2603 +5804 -0.000176959
  2604 +5806 -0.000104603
  2605 +5808 -2.97849E-05
  2606 +5810 -2.13517E-05
  2607 +5812 -0.000310097
  2608 +5814 -0.000234544
  2609 +5816 -0.000306688
  2610 +5818 -0.000134224
  2611 +5820 -4.62987E-05
  2612 +5822 -8.32075E-05
  2613 +5824 -0.000124491
  2614 +5826 -0.000227533
  2615 +5828 7.63E-06
  2616 +5830 -0.000100538
  2617 +5832 -0.000209111
  2618 +5834 -6.65844E-05
  2619 +5836 -0.000147125
  2620 +5838 -0.000133334
  2621 +5840 -8.70E-06
  2622 +5842 -2.23727E-05
  2623 +5844 -0.000315383
  2624 +5846 -0.000185853
  2625 +5848 0.000154914
  2626 +5850 -0.000121906
  2627 +5852 -6.5162E-05
  2628 +5854 -0.000181952
  2629 +5856 -4.16013E-05
  2630 +5858 -3.0724E-05
  2631 +5860 3.03096E-05
  2632 +5862 6.01019E-05
  2633 +5864 -0.000205749
  2634 +5866 -7.91329E-05
  2635 +5868 -3.1756E-05
  2636 +5870 -0.000153925
  2637 +5872 -4.92637E-05
  2638 +5874 8.94E-06
  2639 +5876 0.000167884
  2640 +5878 2.81044E-05
  2641 +5880 -0.000172485
  2642 +5882 3.85173E-05
  2643 +5884 -0.000199897
  2644 +5886 5.97079E-05
  2645 +5888 1.12013E-05
  2646 +5890 -0.000182001
  2647 +5892 -0.000170865
  2648 +5894 2.87266E-05
  2649 +5896 0.000188198
  2650 +5898 0.000162068
  2651 +5900 6.77282E-05
  2652 +5902 -0.000100557
  2653 +5904 0.000172774
  2654 +5906 5.45068E-05
  2655 +5908 6.71451E-05
  2656 +5910 1.42267E-05
  2657 +5912 0.000159991
  2658 +5914 0.000176915
  2659 +5916 0.000201461
  2660 +5918 7.24557E-05
  2661 +5920 -0.000214255
  2662 +5922 0.000185476
  2663 +5924 5.55465E-05
  2664 +5926 5.85444E-05
  2665 +5928 2.38107E-05
  2666 +5930 0.000209259
  2667 +5932 2.68625E-05
  2668 +5934 6.93668E-05
  2669 +5936 -0.00010269
  2670 +5938 0.000204459
  2671 +5940 4.3037E-05
  2672 +5942 0.000134317
  2673 +5944 0.00011353
  2674 +5946 -1.1138E-05
  2675 +5948 -0.00021765
  2676 +5950 0.000113405
  2677 +5952 -6.84037E-05
  2678 +5954 -6.10258E-05
  2679 +5956 0.000128848
  2680 +5958 6.24606E-05
  2681 +5960 -1.7243E-05
  2682 +5962 -9.28901E-05
  2683 +5964 -0.000124651
  2684 +5966 -0.000180665
  2685 +5968 0.000142526
  2686 +5970 -0.000128998
  2687 +5972 0.000184577
  2688 +5974 -3.74491E-05
  2689 +5976 -0.00013039
  2690 +5978 2.31888E-05
  2691 +5980 0.000132512
  2692 +5982 -0.000132757
  2693 +5984 -0.000164463
  2694 +5986 8.58551E-05
  2695 +5988 -0.000140773
  2696 +5990 -4.35385E-05
  2697 +5992 7.0978E-05
  2698 +5994 -6.24E-06
  2699 +5996 0.000148403
  2700 +5998 0.000188021
  2701 +6000 2.66254E-05
  2702 +6002 8.84368E-05
  2703 +6004 3.65224E-05
  2704 +6006 5.78793E-05
  2705 +6008 3.50034E-05
  2706 +6010 5.62399E-05
  2707 +6012 -5.14362E-05
  2708 +6014 0.00034933
  2709 +6016 0.000168918
  2710 +6018 5.34508E-05
  2711 +6020 0.000122075
  2712 +6022 -4.05053E-05
  2713 +6024 8.9883E-05
  2714 +6026 0.000161734
  2715 +6028 -7.37436E-05
  2716 +6030 -4.95E-06
  2717 +6032 0.00022485
  2718 +6034 -0.000253566
  2719 +6036 0.000122794
  2720 +6038 -2.70286E-05
  2721 +6040 7.11802E-05
  2722 +6042 0.000129984
  2723 +6044 1.57E-06
  2724 +6046 -0.000117867
  2725 +6048 -2.15324E-05
  2726 +6050 -1.38764E-05
  2727 +6052 6.69437E-05
  2728 +6054 -0.000117569
  2729 +6056 1.94807E-05
  2730 +6058 -1.96687E-05
  2731 +6060 -0.000147066
  2732 +6062 5.52879E-05
  2733 +6064 -3.51488E-05
  2734 +6066 1.65759E-05
  2735 +6068 0.000194312
  2736 +6070 -9.75251E-05
  2737 +6072 -0.000286519
  2738 +6074 -0.000133893
  2739 +6076 -0.000144305
  2740 +6078 -0.000206774
  2741 +6080 9.70323E-05
  2742 +6082 0.000105616
  2743 +6084 7.76744E-05
  2744 +6086 -1.85213E-05
  2745 +6088 2.1601E-05
  2746 +6090 2.86444E-05
  2747 +6092 -7.78625E-05
  2748 +6094 -0.000103451
  2749 +6096 5.06513E-05
  2750 +6098 -0.000126614
  2751 +6100 -0.000291543
  2752 +6102 -3.20512E-05
  2753 +6104 -0.00034077
  2754 +6106 4.78E-06
  2755 +6108 -0.00021435
  2756 +6110 -3.06885E-05
  2757 +6112 -0.00013895
  2758 +6114 -6.48402E-05
  2759 +6116 -7.10551E-05
  2760 +6118 -0.000288181
  2761 +6120 -6.09779E-05
  2762 +6122 -0.000224615
  2763 +6124 -8.03908E-05
  2764 +6126 -7.04685E-05
  2765 +6128 7.00613E-05
  2766 +6130 -0.000187151
  2767 +6132 -0.00015411
  2768 +6134 -0.000142311
  2769 +6136 0.000311664
  2770 +6138 0.000185075
  2771 +6140 0.000302768
  2772 +6142 -0.000104647
  2773 +6144 0.000119734
  2774 +6146 -4.93308E-05
  2775 +6148 1.16225E-05
  2776 +6150 -0.000114402
  2777 +6152 -0.00021231
  2778 +6154 7.1843E-05
  2779 +6156 -5.21411E-05
  2780 +6158 -8.98771E-05
  2781 +6160 0.000148557
  2782 +6162 -5.44653E-05
  2783 +6164 -0.00012796
  2784 +6166 9.70156E-05
  2785 +6168 -0.000101064
  2786 +6170 -0.00013553
  2787 +6172 9.9476E-05
  2788 +6174 1.62078E-05
  2789 +6176 -4.40928E-05
  2790 +6178 0.000102579
  2791 +6180 1.77941E-05
  2792 +6182 -0.000149253
  2793 +6184 -8.96427E-05
  2794 +6186 -0.000108399
  2795 +6188 6.41861E-05
  2796 +6190 0.000121833
  2797 +6192 -2.42281E-05
  2798 +6194 -0.000112157
  2799 +6196 -2.51081E-05
  2800 +6198 -3.95046E-05
  2801 +6200 0.000178628
  2802 +6202 -0.000148793
  2803 +6204 -9.57E-06
  2804 +6206 -7.90421E-05
  2805 +6208 -8.07858E-05
  2806 +6210 -4.14175E-05
  2807 +6212 -7.21446E-05
  2808 +6214 0.000149076
  2809 +6216 3.91353E-05
  2810 +6218 -0.000114591
  2811 +6220 -9.9288E-05
  2812 +6222 -0.000113439
  2813 +6224 -2.5277E-05
  2814 +6226 -8.29E-07
  2815 +6228 8.26896E-05
  2816 +6230 -6.24E-06
  2817 +6232 0.000107177
  2818 +6234 -3.60E-06
  2819 +6236 0.000162593
  2820 +6238 -5.28839E-05
  2821 +6240 -0.000174024
  2822 +6242 -0.000101802
  2823 +6244 1.47698E-05
  2824 +6246 4.79099E-05
  2825 +6248 -8.95552E-05
  2826 +6250 0.000146406
  2827 +6252 0.000106973
  2828 +6254 7.08576E-05
  2829 +6256 -5.01693E-05
  2830 +6258 5.31355E-05
  2831 +6260 -0.000233967
  2832 +6262 4.08849E-05
  2833 +6264 -7.93998E-05
  2834 +6266 0.00014663
  2835 +6268 -4.49E-07
  2836 +6270 0.000121188
  2837 +6272 -4.01289E-05
  2838 +6274 9.46038E-05
  2839 +6276 4.40081E-05
  2840 +6278 8.76714E-05
  2841 +6280 -0.000191742
  2842 +6282 -0.000105518
  2843 +6284 -4.94007E-05
  2844 +6286 -4.65298E-05
  2845 +6288 1.22E-07
  2846 +6290 0.000159264
  2847 +6292 3.10034E-05
  2848 +6294 6.24514E-05
  2849 +6296 -2.04794E-05
  2850 +6298 -0.000228969
  2851 +6300 7.75386E-05
  2852 +6302 -8.37533E-05
  2853 +6304 -4.76962E-05
  2854 +6306 0.000134281
  2855 +6308 -9.41E-06
  2856 +6310 -0.000141126
  2857 +6312 -0.000133436
  2858 +6314 9.32692E-05
  2859 +6316 0.000130775
  2860 +6318 0.000198152
  2861 +6320 -5.79899E-05
  2862 +6322 -4.41423E-05
  2863 +6324 0.000143831
  2864 +6326 0.000107897
  2865 +6328 1.79488E-05
  2866 +6330 -0.000148111
  2867 +6332 0.000107348
  2868 +6334 -2.49393E-05
  2869 +6336 -0.000148447
  2870 +6338 0.000163246
  2871 +6340 2.64628E-05
  2872 +6342 6.50765E-05
  2873 +6344 -5.74688E-05
  2874 +6346 9.16788E-05
  2875 +6348 0.000115457
  2876 +6350 2.51624E-05
  2877 +6352 -6.82336E-05
  2878 +6354 0.000175589
  2879 +6356 -2.47157E-05
  2880 +6358 0.000300847
  2881 +6360 4.29191E-05
  2882 +6362 -0.000102159
  2883 +6364 -0.000150186
  2884 +6366 -0.000137124
  2885 +6368 -3.6448E-05
  2886 +6370 6.31217E-05
  2887 +6372 -2.17468E-05
  2888 +6374 0.00020514
  2889 +6376 -0.000288874
  2890 +6378 -0.000196896
  2891 +6380 5.33731E-05
  2892 +6382 -0.00018922
  2893 +6384 5.94367E-05
  2894 +6386 0.00018609
  2895 +6388 -0.000231268
  2896 +6390 0.000188414
  2897 +6392 8.58249E-05
  2898 +6394 0.000322554
  2899 +6396 -8.18526E-05
  2900 +6398 6.46391E-05
  2901 +6400 -3.654E-05
  2902 +6402 -5.43539E-05
  2903 +6404 0.00011808
  2904 +6406 -0.000111429
  2905 +6408 3.37446E-05
  2906 +6410 0.000103862
  2907 +6412 -2.73016E-05
  2908 +6414 0.000148599
  2909 +6416 -0.000175049
  2910 +6418 -7.87E-06
  2911 +6420 -1.44832E-05
  2912 +6422 -8.69714E-05
  2913 +6424 7.46194E-05
  2914 +6426 -8.40362E-05
  2915 +6428 0.000255133
  2916 +6430 -7.29877E-05
  2917 +6432 0.000251098
  2918 +6434 -6.47746E-05
  2919 +6436 -0.000116293
  2920 +6438 0.000176731
  2921 +6440 -8.31E-06
  2922 +6442 -0.000133431
  2923 +6444 -0.000148146
  2924 +6446 1.85739E-05
  2925 +6448 -7.49236E-05
  2926 +6450 7.86825E-05
  2927 +6452 0.000150351
  2928 +6454 8.30916E-05
  2929 +6456 -2.89466E-05
  2930 +6458 2.75E-07
  2931 +6460 -7.6078E-05
  2932 +6462 0.000127013
  2933 +6464 0.000125654
  2934 +6466 -9.06547E-05
  2935 +6468 -0.000245214
  2936 +6470 -9.9701E-05
  2937 +6472 -7.93695E-05
  2938 +6474 -0.000114213
  2939 +6476 0.000128301
  2940 +6478 -7.09795E-05
  2941 +6480 0.00014139
  2942 +6482 6.9353E-05
  2943 +6484 0.000113504
  2944 +6486 -0.000222003
  2945 +6488 0.00011384
  2946 +6490 5.82324E-05
  2947 +6492 -4.78533E-05
  2948 +6494 -0.000172427
  2949 +6496 3.94829E-05
  2950 +6498 -0.000207402
  2951 +6500 -0.000158524
  2952 +6502 7.13359E-05
  2953 +6504 -0.00015144
  2954 +6506 -0.000166462
  2955 +6508 -1.63887E-05
  2956 +6510 8.49982E-05
  2957 +6512 -0.000133497
  2958 +6514 -2.65249E-05
  2959 +6516 -0.000187609
  2960 +6518 -1.77176E-05
  2961 +6520 -0.000139934
  2962 +6522 1.97547E-05
  2963 +6524 -0.000213204
  2964 +6526 -2.25511E-05
  2965 +6528 -5.93047E-05
  2966 +6530 -0.000104047
  2967 +6532 -0.000306345
  2968 +6534 -3.98042E-05
  2969 +6536 -7.78457E-05
  2970 +6538 -7.13E-06
  2971 +6540 -0.000280079
  2972 +6542 0.000154768
  2973 +6544 9.83578E-05
  2974 +6546 0.000181306
  2975 +6548 -0.000133643
  2976 +6550 0.000105885
  2977 +6552 -0.000157576
  2978 +6554 -9.20987E-05
  2979 +6556 -5.51079E-05
  2980 +6558 -3.02747E-05
  2981 +6560 -7.17904E-05
  2982 +6562 -0.000280564
  2983 +6564 -6.67912E-05
  2984 +6566 0.000184375
  2985 +6568 -8.73372E-05
  2986 +6570 -0.000100174
  2987 +6572 -2.82062E-05
  2988 +6574 -8.84695E-05
  2989 +6576 0.000144169
  2990 +6578 -0.000240943
  2991 +6580 -0.000139581
  2992 +6582 0.000120571
  2993 +6584 0.000138317
  2994 +6586 -0.00022769
  2995 +6588 -0.000275816
  2996 +6590 0.00010466
  2997 +6592 7.78823E-05
  2998 +6594 -5.28282E-05
  2999 +6596 -2.40E-06
  3000 +6598 0.000117892
  3001 +6600 -4.19631E-05
  3002 +6602 -0.000315964
  3003 +6604 -0.000410462
  3004 +6606 -0.000120959
  3005 +6608 9.99E-06
  3006 +6610 4.37964E-05
  3007 +6612 -3.31902E-05
  3008 +6614 -8.51607E-05
  3009 +6616 -0.000154694
  3010 +6618 -9.29603E-05
  3011 +6620 5.289E-05
  3012 +6622 -0.000125816
  3013 +6624 -0.000314679
  3014 +6626 -0.00016154
  3015 +6628 -0.000141162
  3016 +6630 -0.000119437
  3017 +6632 -0.0001569
  3018 +6634 -0.000166503
  3019 +6636 0.000112686
  3020 +6638 1.99608E-05
  3021 +6640 4.35539E-05
  3022 +6642 -0.000166097
  3023 +6644 -4.87333E-05
  3024 +6646 -0.000336465
  3025 +6648 -0.00029665
  3026 +6650 -0.000145957
  3027 +6652 7.43624E-05
  3028 +6654 -0.000223543
  3029 +6656 0.000141507
  3030 +6658 0.000143548
  3031 +6660 -0.000207983
  3032 +6662 -3.80663E-05
  3033 +6664 -0.000115808
  3034 +6666 -0.000371392
  3035 +6668 -0.000146251
  3036 +6670 -0.000330336
  3037 +6672 -0.000268665
  3038 +6674 -8.44355E-05
  3039 +6676 -1.45736E-05
  3040 +6678 -0.000355467
  3041 +6680 -0.000112196
  3042 +6682 2.59378E-05
  3043 +6684 -5.07584E-05
  3044 +6686 -2.74706E-05
  3045 +6688 -0.000184275
  3046 +6690 -8.74E-06
  3047 +6692 -2.95378E-05
  3048 +6694 2.54E-06
  3049 +6696 -0.000101312
  3050 +6698 -0.000211174
  3051 +6700 -0.000164924
  3052 +6702 -0.000398584
  3053 +6704 -0.000146533
  3054 +6706 -0.000348778
  3055 +6708 -0.000143255
  3056 +6710 0.000147283
  3057 +6712 -9.8179E-05
  3058 +6714 9.34795E-05
  3059 +6716 -0.000150882
  3060 +6718 -0.000297166
  3061 +6720 1.32743E-05
  3062 +6722 -0.000120746
  3063 +6724 -8.11384E-05
  3064 +6726 -0.000325532
  3065 +6728 -0.000194586
  3066 +6730 -0.00012466
  3067 +6732 -4.78812E-05
  3068 +6734 -9.19999E-05
  3069 +6736 -0.000107843
  3070 +6738 -6.23358E-05
  3071 +6740 -0.000286347
  3072 +6742 -3.71682E-05
  3073 +6744 -4.80E-06
  3074 +6746 -0.000319234
  3075 +6748 -0.000279883
  3076 +6750 -0.000272827
  3077 +6752 -0.000101761
  3078 +6754 -0.000146361
  3079 +6756 -0.000266156
  3080 +6758 0.000102535
  3081 +6760 -0.000386606
  3082 +6762 -0.00018995
  3083 +6764 -0.000215715
  3084 +6766 -0.00023779
  3085 +6768 -0.000211241
  3086 +6770 -0.000283036
  3087 +6772 -0.000106436
  3088 +6774 -0.000187373
  3089 +6776 -0.000190231
  3090 +6778 -1.71093E-05
  3091 +6780 -0.000351549
  3092 +6782 -0.000167132
  3093 +6784 6.03858E-05
  3094 +6786 -0.000311376
  3095 +6788 -0.000142106
  3096 +6790 -1.62293E-05
  3097 +6792 -0.000231522
  3098 +6794 -8.28732E-05
  3099 +6796 -0.000337511
  3100 +6798 -0.000203157
  3101 +6800 -3.72712E-05
  3102 +6802 -0.000234517
  3103 +6804 -1.30E-06
  3104 +6806 -8.99819E-05
  3105 +6808 -3.03547E-05
  3106 +6810 -7.82862E-05
  3107 +6812 -0.000275055
  3108 +6814 8.78416E-05
  3109 +6816 -0.000124671
  3110 +6818 -0.000332395
  3111 +6820 -0.000120407
  3112 +6822 -0.000196254
  3113 +6824 -0.000143466
  3114 +6826 -0.00023199
  3115 +6828 -2.32556E-05
  3116 +6830 -0.000506958
  3117 +6832 1.30E-06
  3118 +6834 -0.000349053
  3119 +6836 -0.000105324
  3120 +6838 -0.000365336
  3121 +6840 -0.000376516
  3122 +6842 -0.000268123
  3123 +6844 -0.000216535
  3124 +6846 -0.000149111
  3125 +6848 -0.000224848
  3126 +6850 -0.000219525
  3127 +6852 3.8059E-05
  3128 +6854 -0.000306124
  3129 +6856 -0.000480935
  3130 +6858 -7.56657E-05
  3131 +6860 -0.000234094
  3132 +6862 -8.62146E-05
  3133 +6864 -4.34679E-05
  3134 +6866 -6.9076E-05
  3135 +6868 -0.000343807
  3136 +6870 -2.52463E-05
  3137 +6872 0.00013412
  3138 +6874 -0.000136273
  3139 +6876 -6.21612E-05
  3140 +6878 -0.000382671
  3141 +6880 -3.57982E-05
  3142 +6882 -0.000173088
  3143 +6884 9.16434E-05
  3144 +6886 -0.000290802
  3145 +6888 -0.00033873
  3146 +6890 -0.000100816
  3147 +6892 -0.000332355
  3148 +6894 -2.15443E-05
  3149 +6896 -0.000139886
  3150 +6898 -0.000147969
  3151 +6900 -0.000250801
  3152 +6902 -0.000287541
  3153 +6904 3.96189E-05
  3154 +6906 -0.00043964
  3155 +6908 -0.000144297
  3156 +6910 -0.000259311
  3157 +6912 -0.000307546
  3158 +6914 -0.000207326
  3159 +6916 -0.000311028
  3160 +6918 1.09E-06
  3161 +6920 -0.000316103
  3162 +6922 -0.000116125
  3163 +6924 -0.0004364
  3164 +6926 -0.00019726
  3165 +6928 2.21665E-05
  3166 +6930 -0.000196139
  3167 +6932 -0.000150559
  3168 +6934 -0.00021327
  3169 +6936 -0.000242659
  3170 +6938 -0.000324069
  3171 +6940 -0.000156015
  3172 +6942 -0.000114122
  3173 +6944 -0.000116531
  3174 +6946 -0.0002098
  3175 +6948 -0.000403686
  3176 +6950 -0.000428051
  3177 +6952 -0.000205227
  3178 +6954 -0.000263236
  3179 +6956 -7.86915E-05
  3180 +6958 -0.000295775
  3181 +6960 -0.000232486
  3182 +6962 -0.000143043
  3183 +6964 -0.000239739
  3184 +6966 -0.000219405
  3185 +6968 -0.000354447
  3186 +6970 9.11346E-05
  3187 +6972 -0.00030139
  3188 +6974 -0.00035907
  3189 +6976 -0.000467083
  3190 +6978 -2.82218E-05
  3191 +6980 -7.5117E-05
  3192 +6982 -0.000384305
  3193 +6984 -0.000260206
  3194 +6986 -0.000183068
  3195 +6988 -0.000267272
  3196 +6990 -0.000436363
  3197 +6992 0.000209017
  3198 +6994 0.000133107
  3199 +6996 -0.000135045
  3200 +6998 -0.00045575
3201 3201 7000 -5.24841E-05
3202 3202 \ No newline at end of file
... ...
main.cpp
1   -#include <fstream>
2   -using namespace std;
3   -#include "interactivemie.h"
4   -#include <QtGui/QApplication>
5   -#include "qtSpectrumDisplay.h"
6   -#include "globals.h"
7   -#include "rtsGUIConsole.h"
8   -#include "PerformanceData.h"
9   -#include <complex>
10   -//#include <direct.h>
11   -
12   -PerformanceData PD;
13   -
14   -qtSpectrumDisplay* gpSpectrumDisplay;
15   -
16   -vector<vector<SpecPair> > RefSpectrum;
17   -vector<SpecPair> SimSpectrum;
18   -vector<SpecPair> EtaK;
19   -vector<SpecPair> EtaN;
20   -int currentSpec = 0;
21   -
22   -double nuMin = 800;
23   -double nuMax = 4000;
24   -double dNu = 2;
25   -
26   -double aMin = 0;
27   -double aMax = 1;
28   -
29   -double scaleI0 = 1.0;
30   -double refSlope = 0.0;
31   -
32   -bool dispRefSpec = true;
33   -bool dispSimSpec = true;
34   -bool dispSimK = true;
35   -bool dispMatK = true;
36   -bool dispSimN = true;
37   -bool dispMatN = true;
38   -double dispScaleK = 1.0;
39   -double dispScaleN = 1.0;
40   -SpecType dispSimType = AbsorbanceSpecType;
41   -bool dispNormalize = false;
42   -double dispNormFactor = 1.0;
43   -
44   -
45   -//material parameters
46   -double radius = 4.0f;
47   -double baseIR = 1.49f;
48   -double cA = 1.0;
49   -//vector<SpecPair> KMaterial;
50   -//vector<SpecPair> NMaterial;
51   -bool applyMaterial = true;
52   -vector<Material> MaterialList;
53   -int currentMaterial = 0;
54   -
55   -//optical parameters
56   -double cNAi = 0.0;
57   -double cNAo = 0.6;
58   -double oNAi = 0.0;
59   -double oNAo = 0.6;
60   -OpticsType opticsMode = TransmissionOpticsType;
61   -bool pointDetector = false;
62   -int objectiveSamples = 200;
63   -
64   -//fitting parameters
65   -double minMSE = 0.00001;
66   -int maxFitIter = 20;
67   -
68   -void TempSimSpectrum()
69   -{
70   - SpecPair temp;
71   - for(int i=800; i<4000; i++)
72   - {
73   - temp.nu = i;
74   - temp.A = sin((double)i/200);
75   - SimSpectrum.push_back(temp);
76   - }
77   -}
78   -
79   -void UpdateDisplay(){
80   - gpSpectrumDisplay->updateGL();
81   -}
82   -
83   -void LoadMaterial(string fileNameK, string fileNameN, string materialName)
84   -{
85   - Material newMaterial;
86   - newMaterial.name = materialName;
87   -
88   - vector<SpecPair> KMaterial = LoadSpectrum(fileNameK.c_str());
89   - vector<SpecPair> NMaterial = LoadSpectrum(fileNameN.c_str());
90   -
91   - //make sure that the sizes are the same
92   - if(KMaterial.size() != NMaterial.size()){
93   - cout<<"Error, material properties don't match."<<endl;
94   - exit(1);
95   - }
96   -
97   - complex<double> eta;
98   - //int j;
99   - for(unsigned int i=0; i<KMaterial.size(); i++){
100   - newMaterial.nu.push_back(KMaterial[i].nu);
101   - eta = complex<double>(NMaterial[i].A, KMaterial[i].A);
102   - newMaterial.eta.push_back(eta);
103   - }
104   - MaterialList.push_back(newMaterial);
105   -
106   -}
107   -
108   -void LoadMaterial(string fileNameK, string materialName){
109   -
110   - //load the material absorbance
111   - vector<SpecPair> KMaterial = LoadSpectrum(fileNameK.c_str());
112   - vector<SpecPair> NMaterial;
113   - //KMaterial = LoadSpectrum("eta_TolueneK.txt");
114   -
115   - //compute the real IR using Kramers Kronig
116   - //copy the absorbance values into a linear array
117   - double* k = (double*)malloc(sizeof(double) * KMaterial.size());
118   - double* n = (double*)malloc(sizeof(double) * KMaterial.size());
119   - for(unsigned int i=0; i<KMaterial.size(); i++)
120   - k[i] = KMaterial[i].A;
121   -
122   - //use Kramers Kronig to determine the real part of the index of refraction
123   - cudaKramersKronig(n, k, KMaterial.size(), KMaterial[0].nu, KMaterial.back().nu, baseIR);
124   - SpecPair temp;
125   - for(unsigned int i=0; i<KMaterial.size(); i++)
126   - {
127   - temp.nu = KMaterial[i].nu;
128   - temp.A = n[i];
129   - NMaterial.push_back(temp);
130   - }
131   -
132   - //create the material
133   - Material newMaterial;
134   - newMaterial.name = materialName;
135   - complex<double> eta;
136   - for(unsigned int i=0; i<KMaterial.size(); i++){
137   - newMaterial.nu.push_back(KMaterial[i].nu);
138   - eta = complex<double>(NMaterial[i].A, KMaterial[i].A);
139   - newMaterial.eta.push_back(eta);
140   - }
141   -
142   - MaterialList.push_back(newMaterial);
143   -}
144   -
145   -void FitDisplay(){
146   - double minA = 99999.0;
147   - double maxA = -99999.0;
148   - double k, n;
149   -
150   - if(dispSimSpec)
151   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
152   - {
153   - if(SimSpectrum[i].A < minA)
154   - minA = SimSpectrum[i].A;
155   - if(SimSpectrum[i].A > maxA)
156   - maxA = SimSpectrum[i].A;
157   - }
158   -
159   - if(dispRefSpec && RefSpectrum.size() > 0)
160   - for(unsigned int i=0; i<RefSpectrum[currentSpec].size(); i++)
161   - {
162   - if(RefSpectrum[currentSpec][i].A < minA)
163   - minA = RefSpectrum[currentSpec][i].A;
164   - if(RefSpectrum[currentSpec][i].A > maxA)
165   - maxA = RefSpectrum[currentSpec][i].A;
166   - }
167   - if(dispMatK)
168   - for(unsigned int i=0; i<EtaK.size(); i++)
169   - {
170   - k = MaterialList[currentMaterial].eta[i].imag() * dispScaleK;
171   - if(k < minA)
172   - minA = k;
173   - if(k > maxA)
174   - maxA = k;
175   - }
176   - if(dispSimK)
177   - for(unsigned int i=0; i<EtaK.size(); i++)
178   - {
179   - k = EtaK[i].A * dispScaleK;
180   - if(k < minA)
181   - minA = k;
182   - if(EtaK[i].A > maxA)
183   - maxA = k;
184   - }
185   - if(dispMatN)
186   - for(unsigned int i=0; i<EtaN.size(); i++)
187   - {
188   - n = (MaterialList[currentMaterial].eta[i].real() - baseIR) * dispScaleN;
189   - if(n < minA)
190   - minA = n;
191   - if(n > maxA)
192   - maxA = n;
193   - }
194   - if(dispSimN)
195   - for(unsigned int i=0; i<EtaN.size(); i++)
196   - {
197   - n = (EtaN[i].A - baseIR) * dispScaleN;
198   - if(n < minA)
199   - minA = n;
200   - if(n > maxA)
201   - maxA = n;
202   - }
203   -
204   - aMin = minA;
205   - aMax = maxA;
206   - UpdateDisplay();
207   -}
208   -
209   -void ChangeAbsorbance(){
210   -
211   - //compute the real part of the index of refraction
212   -
213   - //copy the absorbance values into a linear array
214   - int nSamples = MaterialList[currentMaterial].eta.size();
215   - double startNu = MaterialList[currentMaterial].nu.front();
216   - double endNu = MaterialList[currentMaterial].nu.back();
217   - double* k = (double*)malloc(sizeof(double) * nSamples);
218   - double* n = (double*)malloc(sizeof(double) * nSamples);
219   - for(int i=0; i<nSamples; i++)
220   - k[i] = MaterialList[currentMaterial].eta[i].imag() * cA;
221   -
222   - //NMaterial.clear();
223   - EtaK.clear();
224   - EtaN.clear();
225   - //use Kramers Kronig to determine the real part of the index of refraction
226   - cudaKramersKronig(n, k, nSamples, startNu, endNu, baseIR);
227   -
228   - //copy the real part of the index of refraction into the vector
229   - SpecPair temp;
230   -
231   - //load the imaginary IR from the absorbance data
232   - double nu;
233   - for(int i=0; i<nSamples; i++){
234   - nu = MaterialList[currentMaterial].nu[i];
235   - if(nu >= nuMin && nu <= nuMax){
236   - temp.nu = nu;
237   - temp.A = k[i];
238   - EtaK.push_back(temp);
239   - //temp.A = NMaterial[i].A;
240   - temp.A = n[i];
241   - EtaN.push_back(temp);
242   - }
243   - }
244   -
245   - free(k);
246   - free(n);
247   -}
248   -
249   -void SetMaterial()
250   -{
251   - EtaK.clear();
252   - EtaN.clear();
253   -
254   - int nSamples = MaterialList[currentMaterial].eta.size();
255   - double nu;
256   - SpecPair temp;
257   -
258   - //initialize the current nuMin and nuMax values
259   - nuMin = MaterialList[currentMaterial].nu[0];
260   - nuMax = nuMin;
261   - for(int i=0; i<nSamples; i++){
262   - nu = MaterialList[currentMaterial].nu[i];
263   - //if(nu >= nuMin && nu <= nuMax){
264   -
265   - //update the min and max values for display
266   - if(nu < nuMin) nuMin = nu;
267   - if(nu > nuMax) nuMax = nu;
268   -
269   - temp.nu = nu;
270   - temp.A = MaterialList[currentMaterial].eta[i].imag();
271   - EtaK.push_back(temp);
272   - temp.A = MaterialList[currentMaterial].eta[i].real();
273   - EtaN.push_back(temp);
274   - }
275   - cA = 1.0;
276   -
277   -}
278   -
279   -
280   -
281   -int main(int argc, char *argv[])
282   -{
283   -
284   -
285   - //load the default project file (any previous optical settings)
286   - LoadState();
287   -
288   - //load the default materials
289   - LoadMaterial("eta_TolueneK.txt", "eta_TolueneN.txt", "Toluene");
290   - LoadMaterial("kPMMA.txt", "PMMA");
291   - //LoadMaterial("../../../../data/materials/rtsSU8_k.txt", "../../../../data/materials/rtsSU8_n.txt", "SU8");
292   - SetMaterial();
293   -
294   - //compute the analytical solution for the Mie scattered spectrum
295   - SimulateSpectrum();
296   -
297   - QApplication a(argc, argv);
298   - InteractiveMie w;
299   -
300   -
301   - w.show();
302   -
303   -
304   - w.move(0, 0);
305   - QRect frame = w.frameGeometry();
306   - QRect inside = w.geometry();
307   -
308   - //activate a console for output
309   - RedirectIOToConsole(0, frame.height(), frame.width());
310   -
311   - gpSpectrumDisplay = new qtSpectrumDisplay();
312   - gpSpectrumDisplay->move(frame.width(), 0);
313   - gpSpectrumDisplay->resize(2*inside.height(), inside.height());
314   -
315   - gpSpectrumDisplay->show();
316   -
317   - //refresh the UI
318   - w.refreshUI();
319   -
320   - return a.exec();
321   -}
  1 +#include <fstream>
  2 +using namespace std;
  3 +#include "interactivemie.h"
  4 +#include <QtGui/QApplication>
  5 +#include "qtSpectrumDisplay.h"
  6 +#include "globals.h"
  7 +#include "rtsGUIConsole.h"
  8 +#include "PerformanceData.h"
  9 +#include <complex>
  10 +//#include <direct.h>
  11 +
  12 +PerformanceData PD;
  13 +
  14 +qtSpectrumDisplay* gpSpectrumDisplay;
  15 +
  16 +vector<vector<SpecPair> > RefSpectrum;
  17 +vector<SpecPair> SimSpectrum;
  18 +vector<SpecPair> EtaK;
  19 +vector<SpecPair> EtaN;
  20 +int currentSpec = 0;
  21 +
  22 +double nuMin = 800;
  23 +double nuMax = 4000;
  24 +double dNu = 2;
  25 +
  26 +double aMin = 0;
  27 +double aMax = 1;
  28 +
  29 +double scaleI0 = 1.0;
  30 +double refSlope = 0.0;
  31 +
  32 +bool dispRefSpec = true;
  33 +bool dispSimSpec = true;
  34 +bool dispSimK = true;
  35 +bool dispMatK = true;
  36 +bool dispSimN = true;
  37 +bool dispMatN = true;
  38 +double dispScaleK = 1.0;
  39 +double dispScaleN = 1.0;
  40 +SpecType dispSimType = AbsorbanceSpecType;
  41 +bool dispNormalize = false;
  42 +double dispNormFactor = 1.0;
  43 +
  44 +
  45 +//material parameters
  46 +double radius = 4.0f;
  47 +double baseIR = 1.49f;
  48 +double cA = 1.0;
  49 +//vector<SpecPair> KMaterial;
  50 +//vector<SpecPair> NMaterial;
  51 +bool applyMaterial = true;
  52 +vector<Material> MaterialList;
  53 +int currentMaterial = 0;
  54 +
  55 +//optical parameters
  56 +double cNAi = 0.0;
  57 +double cNAo = 0.6;
  58 +double oNAi = 0.0;
  59 +double oNAo = 0.6;
  60 +OpticsType opticsMode = TransmissionOpticsType;
  61 +bool pointDetector = false;
  62 +int objectiveSamples = 200;
  63 +
  64 +//fitting parameters
  65 +double minMSE = 0.00001;
  66 +int maxFitIter = 20;
  67 +
  68 +void TempSimSpectrum()
  69 +{
  70 + SpecPair temp;
  71 + for(int i=800; i<4000; i++)
  72 + {
  73 + temp.nu = i;
  74 + temp.A = sin((double)i/200);
  75 + SimSpectrum.push_back(temp);
  76 + }
  77 +}
  78 +
  79 +void UpdateDisplay(){
  80 + gpSpectrumDisplay->updateGL();
  81 +}
  82 +
  83 +void LoadMaterial(string fileNameK, string fileNameN, string materialName)
  84 +{
  85 + Material newMaterial;
  86 + newMaterial.name = materialName;
  87 +
  88 + vector<SpecPair> KMaterial = LoadSpectrum(fileNameK.c_str());
  89 + vector<SpecPair> NMaterial = LoadSpectrum(fileNameN.c_str());
  90 +
  91 + //make sure that the sizes are the same
  92 + if(KMaterial.size() != NMaterial.size()){
  93 + cout<<"Error, material properties don't match."<<endl;
  94 + exit(1);
  95 + }
  96 +
  97 + complex<double> eta;
  98 + //int j;
  99 + for(unsigned int i=0; i<KMaterial.size(); i++){
  100 + newMaterial.nu.push_back(KMaterial[i].nu);
  101 + eta = complex<double>(NMaterial[i].A, KMaterial[i].A);
  102 + newMaterial.eta.push_back(eta);
  103 + }
  104 + MaterialList.push_back(newMaterial);
  105 +
  106 +}
  107 +
  108 +void LoadMaterial(string fileNameK, string materialName){
  109 +
  110 + //load the material absorbance
  111 + vector<SpecPair> KMaterial = LoadSpectrum(fileNameK.c_str());
  112 + vector<SpecPair> NMaterial;
  113 + //KMaterial = LoadSpectrum("eta_TolueneK.txt");
  114 +
  115 + //compute the real IR using Kramers Kronig
  116 + //copy the absorbance values into a linear array
  117 + double* k = (double*)malloc(sizeof(double) * KMaterial.size());
  118 + double* n = (double*)malloc(sizeof(double) * KMaterial.size());
  119 + for(unsigned int i=0; i<KMaterial.size(); i++)
  120 + k[i] = KMaterial[i].A;
  121 +
  122 + //use Kramers Kronig to determine the real part of the index of refraction
  123 + cudaKramersKronig(n, k, KMaterial.size(), KMaterial[0].nu, KMaterial.back().nu, baseIR);
  124 + SpecPair temp;
  125 + for(unsigned int i=0; i<KMaterial.size(); i++)
  126 + {
  127 + temp.nu = KMaterial[i].nu;
  128 + temp.A = n[i];
  129 + NMaterial.push_back(temp);
  130 + }
  131 +
  132 + //create the material
  133 + Material newMaterial;
  134 + newMaterial.name = materialName;
  135 + complex<double> eta;
  136 + for(unsigned int i=0; i<KMaterial.size(); i++){
  137 + newMaterial.nu.push_back(KMaterial[i].nu);
  138 + eta = complex<double>(NMaterial[i].A, KMaterial[i].A);
  139 + newMaterial.eta.push_back(eta);
  140 + }
  141 +
  142 + MaterialList.push_back(newMaterial);
  143 +}
  144 +
  145 +void FitDisplay(){
  146 + double minA = 99999.0;
  147 + double maxA = -99999.0;
  148 + double k, n;
  149 +
  150 + if(dispSimSpec)
  151 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  152 + {
  153 + if(SimSpectrum[i].A < minA)
  154 + minA = SimSpectrum[i].A;
  155 + if(SimSpectrum[i].A > maxA)
  156 + maxA = SimSpectrum[i].A;
  157 + }
  158 +
  159 + if(dispRefSpec && RefSpectrum.size() > 0)
  160 + for(unsigned int i=0; i<RefSpectrum[currentSpec].size(); i++)
  161 + {
  162 + if(RefSpectrum[currentSpec][i].A < minA)
  163 + minA = RefSpectrum[currentSpec][i].A;
  164 + if(RefSpectrum[currentSpec][i].A > maxA)
  165 + maxA = RefSpectrum[currentSpec][i].A;
  166 + }
  167 + if(dispMatK)
  168 + for(unsigned int i=0; i<EtaK.size(); i++)
  169 + {
  170 + k = MaterialList[currentMaterial].eta[i].imag() * dispScaleK;
  171 + if(k < minA)
  172 + minA = k;
  173 + if(k > maxA)
  174 + maxA = k;
  175 + }
  176 + if(dispSimK)
  177 + for(unsigned int i=0; i<EtaK.size(); i++)
  178 + {
  179 + k = EtaK[i].A * dispScaleK;
  180 + if(k < minA)
  181 + minA = k;
  182 + if(EtaK[i].A > maxA)
  183 + maxA = k;
  184 + }
  185 + if(dispMatN)
  186 + for(unsigned int i=0; i<EtaN.size(); i++)
  187 + {
  188 + n = (MaterialList[currentMaterial].eta[i].real() - baseIR) * dispScaleN;
  189 + if(n < minA)
  190 + minA = n;
  191 + if(n > maxA)
  192 + maxA = n;
  193 + }
  194 + if(dispSimN)
  195 + for(unsigned int i=0; i<EtaN.size(); i++)
  196 + {
  197 + n = (EtaN[i].A - baseIR) * dispScaleN;
  198 + if(n < minA)
  199 + minA = n;
  200 + if(n > maxA)
  201 + maxA = n;
  202 + }
  203 +
  204 + aMin = minA;
  205 + aMax = maxA;
  206 + UpdateDisplay();
  207 +}
  208 +
  209 +void ChangeAbsorbance(){
  210 +
  211 + //compute the real part of the index of refraction
  212 +
  213 + //copy the absorbance values into a linear array
  214 + int nSamples = MaterialList[currentMaterial].eta.size();
  215 + double startNu = MaterialList[currentMaterial].nu.front();
  216 + double endNu = MaterialList[currentMaterial].nu.back();
  217 + double* k = (double*)malloc(sizeof(double) * nSamples);
  218 + double* n = (double*)malloc(sizeof(double) * nSamples);
  219 + for(int i=0; i<nSamples; i++)
  220 + k[i] = MaterialList[currentMaterial].eta[i].imag() * cA;
  221 +
  222 + //NMaterial.clear();
  223 + EtaK.clear();
  224 + EtaN.clear();
  225 + //use Kramers Kronig to determine the real part of the index of refraction
  226 + cudaKramersKronig(n, k, nSamples, startNu, endNu, baseIR);
  227 +
  228 + //copy the real part of the index of refraction into the vector
  229 + SpecPair temp;
  230 +
  231 + //load the imaginary IR from the absorbance data
  232 + double nu;
  233 + for(int i=0; i<nSamples; i++){
  234 + nu = MaterialList[currentMaterial].nu[i];
  235 + if(nu >= nuMin && nu <= nuMax){
  236 + temp.nu = nu;
  237 + temp.A = k[i];
  238 + EtaK.push_back(temp);
  239 + //temp.A = NMaterial[i].A;
  240 + temp.A = n[i];
  241 + EtaN.push_back(temp);
  242 + }
  243 + }
  244 +
  245 + free(k);
  246 + free(n);
  247 +}
  248 +
  249 +void SetMaterial()
  250 +{
  251 + EtaK.clear();
  252 + EtaN.clear();
  253 +
  254 + int nSamples = MaterialList[currentMaterial].eta.size();
  255 + double nu;
  256 + SpecPair temp;
  257 +
  258 + //initialize the current nuMin and nuMax values
  259 + nuMin = MaterialList[currentMaterial].nu[0];
  260 + nuMax = nuMin;
  261 + for(int i=0; i<nSamples; i++){
  262 + nu = MaterialList[currentMaterial].nu[i];
  263 + //if(nu >= nuMin && nu <= nuMax){
  264 +
  265 + //update the min and max values for display
  266 + if(nu < nuMin) nuMin = nu;
  267 + if(nu > nuMax) nuMax = nu;
  268 +
  269 + temp.nu = nu;
  270 + temp.A = MaterialList[currentMaterial].eta[i].imag();
  271 + EtaK.push_back(temp);
  272 + temp.A = MaterialList[currentMaterial].eta[i].real();
  273 + EtaN.push_back(temp);
  274 + }
  275 + cA = 1.0;
  276 +
  277 +}
  278 +
  279 +
  280 +
  281 +int main(int argc, char *argv[])
  282 +{
  283 +
  284 +
  285 + //load the default project file (any previous optical settings)
  286 + LoadState();
  287 +
  288 + //load the default materials
  289 + LoadMaterial("eta_TolueneK.txt", "eta_TolueneN.txt", "Toluene");
  290 + LoadMaterial("kPMMA.txt", "PMMA");
  291 + //LoadMaterial("../../../../data/materials/rtsSU8_k.txt", "../../../../data/materials/rtsSU8_n.txt", "SU8");
  292 + SetMaterial();
  293 +
  294 + //compute the analytical solution for the Mie scattered spectrum
  295 + SimulateSpectrum();
  296 +
  297 + QApplication a(argc, argv);
  298 + InteractiveMie w;
  299 +
  300 +
  301 + w.show();
  302 +
  303 +
  304 + w.move(0, 0);
  305 + QRect frame = w.frameGeometry();
  306 + QRect inside = w.geometry();
  307 +
  308 + //activate a console for output
  309 + RedirectIOToConsole(0, frame.height(), frame.width());
  310 +
  311 + gpSpectrumDisplay = new qtSpectrumDisplay();
  312 + gpSpectrumDisplay->move(frame.width(), 0);
  313 + gpSpectrumDisplay->resize(2*inside.height(), inside.height());
  314 +
  315 + gpSpectrumDisplay->show();
  316 +
  317 + //refresh the UI
  318 + w.refreshUI();
  319 +
  320 + return a.exec();
  321 +}
... ...
qtSpectrumDisplay.cpp
1   - #include <QtGui>
2   - #include <QtOpenGL/QtOpenGL>
3   -#include <GL/glu.h>
4   -
5   - #include <math.h>
6   -
7   - #include "qtSpectrumDisplay.h"
8   -
9   - qtSpectrumDisplay::qtSpectrumDisplay(QWidget *parent)
10   - : QGLWidget(parent)
11   - {
12   - object = 0;
13   - xRot = 0;
14   - yRot = 0;
15   - zRot = 0;
16   -
17   - qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0);
18   - qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0);
19   - }
20   -
21   - qtSpectrumDisplay::~qtSpectrumDisplay()
22   - {
23   - makeCurrent();
24   - glDeleteLists(object, 1);
25   - }
26   -
27   - QSize qtSpectrumDisplay::minimumSizeHint() const
28   - {
29   - return QSize(50, 50);
30   - }
31   -
32   - QSize qtSpectrumDisplay::sizeHint() const
33   - {
34   - return QSize(400, 400);
35   - }
36   -
37   - /*void qtSpectrumDisplay::setXRotation(int angle)
38   - {
39   - normalizeAngle(&angle);
40   - if (angle != xRot) {
41   - xRot = angle;
42   - emit xRotationChanged(angle);
43   - updateGL();
44   - }
45   - }
46   -
47   - void qtSpectrumDisplay::setYRotation(int angle)
48   - {
49   - normalizeAngle(&angle);
50   - if (angle != yRot) {
51   - yRot = angle;
52   - emit yRotationChanged(angle);
53   - updateGL();
54   - }
55   - }
56   -
57   - void qtSpectrumDisplay::setZRotation(int angle)
58   - {
59   - normalizeAngle(&angle);
60   - if (angle != zRot) {
61   - zRot = angle;
62   - emit zRotationChanged(angle);
63   - updateGL();
64   - }
65   - }*/
66   -
67   - void qtSpectrumDisplay::initializeGL()
68   - {
69   - qglClearColor(qtPurple.dark());
70   - //object = makeObject();
71   - glShadeModel(GL_FLAT);
72   - glEnable(GL_DEPTH_TEST);
73   - glEnable(GL_CULL_FACE);
74   - }
75   -
76   - void qtSpectrumDisplay::printWavenumber(int xPos)
77   - {
78   - int viewParams[4];
79   - glGetIntegerv(GL_VIEWPORT, viewParams);
80   -
81   - float a = (float)xPos/(float)viewParams[2];
82   -
83   - int wn = a * (nuMax - nuMin) + nuMin;
84   - cout<<wn<<endl;
85   -
86   - }
87   -
88   - void qtSpectrumDisplay::paintGL()
89   - {
90   - glMatrixMode(GL_PROJECTION);
91   - glLoadIdentity();
92   - //glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
93   - gluOrtho2D(nuMin, nuMax, aMin, aMax);
94   - glMatrixMode(GL_MODELVIEW);
95   -
96   - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
97   - glLoadIdentity();
98   - /*glTranslated(0.0, 0.0, -10.0);
99   - glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
100   - glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
101   - glRotated(zRot / 16.0, 0.0, 0.0, 1.0);*/
102   - glLineWidth(2);
103   - if(dispSimSpec)
104   - {
105   - glColor3f(1.0, 1.0, 1.0);
106   - glBegin(GL_LINE_STRIP);
107   - for(unsigned int i=0; i<SimSpectrum.size(); i++)
108   - glVertex2f(SimSpectrum[i].nu, SimSpectrum[i].A);
109   - glEnd();
110   - }
111   - if(dispRefSpec && RefSpectrum.size() > 0)
112   - {
113   - glColor3f(0.5, 0.5, 0.5);
114   - glBegin(GL_LINE_STRIP);
115   - float nu;
116   - for(unsigned int i=0; i<RefSpectrum[currentSpec].size(); i++)
117   - {
118   - nu = RefSpectrum[currentSpec][i].nu;
119   - glVertex2f(nu, RefSpectrum[currentSpec][i].A + nu * refSlope);
120   - }
121   - glEnd();
122   - }
123   -
124   - int nSamples = MaterialList[currentMaterial].eta.size();
125   - float nu;
126   - //display absorbance
127   - if(dispMatK)
128   - {
129   -
130   - glColor3f(1.0, 0.0, 0.0);
131   - glBegin(GL_LINE_STRIP);
132   - for(int i=0; i<nSamples; i++){
133   - nu = MaterialList[currentMaterial].nu[i];
134   - glVertex2f(nu, MaterialList[currentMaterial].eta[i].imag() * dispScaleK);
135   - }
136   - glEnd();
137   - }
138   - if(dispSimK)
139   - {
140   - glColor3f(1.0, 1.0, 0.0);
141   - glBegin(GL_LINE_STRIP);
142   - for(unsigned int i=0; i<EtaK.size(); i++){
143   - glVertex2f(EtaK[i].nu, EtaK[i].A * dispScaleK);
144   - }
145   - glEnd();
146   - }
147   -
148   - //display refractive index (real)
149   - if(dispMatN)
150   - {
151   - glColor3f(0.0, 1.0, 0.0);
152   - glBegin(GL_LINE_STRIP);
153   - for(int i=0; i<nSamples; i++){
154   - nu = MaterialList[currentMaterial].nu[i];
155   - glVertex2f(nu, (MaterialList[currentMaterial].eta[i].real() - baseIR) * dispScaleN);
156   - }
157   - glEnd();
158   - }
159   - if(dispSimN)
160   - {
161   - glColor3f(0.0, 1.0, 1.0);
162   - glBegin(GL_LINE_STRIP);
163   - for(unsigned int i=0; i<EtaN.size(); i++)
164   - glVertex2f(EtaN[i].nu, (EtaN[i].A - baseIR) * dispScaleN);
165   - glEnd();
166   - }
167   -
168   -
169   - glCallList(object);
170   - }
171   -
172   - void qtSpectrumDisplay::resizeGL(int width, int height)
173   - {
174   - int side = qMin(width, height);
175   - //glViewport((width - side) / 2, (height - side) / 2, side, side);
176   - glViewport(0, 0, width, height);
177   -
178   - /*glMatrixMode(GL_PROJECTION);
179   - glLoadIdentity();
180   - //glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
181   - gluOrtho2D(nuMin, nuMax, aMin, aMax);
182   - glMatrixMode(GL_MODELVIEW);*/
183   - }
184   -
185   - void qtSpectrumDisplay::mousePressEvent(QMouseEvent *event)
186   - {
187   - lastPos = event->pos();
188   -
189   - if(event->buttons() & Qt::LeftButton)
190   - {
191   - int wn = 0;
192   - printWavenumber(event->x());
193   - }
194   - }
195   -
196   - void qtSpectrumDisplay::mouseMoveEvent(QMouseEvent *event)
197   - {
198   - int dx = event->x() - lastPos.x();
199   - int dy = event->y() - lastPos.y();
200   - /*
201   - if (event->buttons() & Qt::LeftButton) {
202   - setXRotation(xRot + 8 * dy);
203   - setYRotation(yRot + 8 * dx);
204   - } else if (event->buttons() & Qt::RightButton) {
205   - setXRotation(xRot + 8 * dy);
206   - setZRotation(zRot + 8 * dx);
207   - }*/
208   - lastPos = event->pos();
209   - }
210   -
211   - /*GLuint qtSpectrumDisplay::makeObject()
212   - {
213   - GLuint list = glGenLists(1);
214   - glNewList(list, GL_COMPILE);
215   -
216   - glBegin(GL_QUADS);
217   -
218   - GLdouble x1 = +0.06;
219   - GLdouble y1 = -0.14;
220   - GLdouble x2 = +0.14;
221   - GLdouble y2 = -0.06;
222   - GLdouble x3 = +0.08;
223   - GLdouble y3 = +0.00;
224   - GLdouble x4 = +0.30;
225   - GLdouble y4 = +0.22;
226   -
227   - quad(x1, y1, x2, y2, y2, x2, y1, x1);
228   - quad(x3, y3, x4, y4, y4, x4, y3, x3);
229   -
230   - extrude(x1, y1, x2, y2);
231   - extrude(x2, y2, y2, x2);
232   - extrude(y2, x2, y1, x1);
233   - extrude(y1, x1, x1, y1);
234   - extrude(x3, y3, x4, y4);
235   - extrude(x4, y4, y4, x4);
236   - extrude(y4, x4, y3, x3);
237   -
238   - const double Pi = 3.14159265358979323846;
239   - const int NumSectors = 200;
240   -
241   - for (int i = 0; i < NumSectors; ++i) {
242   - double angle1 = (i * 2 * Pi) / NumSectors;
243   - GLdouble x5 = 0.30 * sin(angle1);
244   - GLdouble y5 = 0.30 * cos(angle1);
245   - GLdouble x6 = 0.20 * sin(angle1);
246   - GLdouble y6 = 0.20 * cos(angle1);
247   -
248   - double angle2 = ((i + 1) * 2 * Pi) / NumSectors;
249   - GLdouble x7 = 0.20 * sin(angle2);
250   - GLdouble y7 = 0.20 * cos(angle2);
251   - GLdouble x8 = 0.30 * sin(angle2);
252   - GLdouble y8 = 0.30 * cos(angle2);
253   -
254   - quad(x5, y5, x6, y6, x7, y7, x8, y8);
255   -
256   - extrude(x6, y6, x7, y7);
257   - extrude(x8, y8, x5, y5);
258   - }
259   -
260   - glEnd();
261   -
262   - glEndList();
263   - return list;
264   - }*/
265   -
266   - void qtSpectrumDisplay::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
267   - GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4)
268   - {
269   - qglColor(qtGreen);
270   -
271   - glVertex3d(x1, y1, -0.05);
272   - glVertex3d(x2, y2, -0.05);
273   - glVertex3d(x3, y3, -0.05);
274   - glVertex3d(x4, y4, -0.05);
275   -
276   - glVertex3d(x4, y4, +0.05);
277   - glVertex3d(x3, y3, +0.05);
278   - glVertex3d(x2, y2, +0.05);
279   - glVertex3d(x1, y1, +0.05);
280   - }
281   -
282   - /*void qtSpectrumDisplay::extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
283   - {
284   - qglColor(qtGreen.dark(250 + int(100 * x1)));
285   -
286   - glVertex3d(x1, y1, +0.05);
287   - glVertex3d(x2, y2, +0.05);
288   - glVertex3d(x2, y2, -0.05);
289   - glVertex3d(x1, y1, -0.05);
290   - }*/
291   -
292   - void qtSpectrumDisplay::normalizeAngle(int *angle)
293   - {
294   - while (*angle < 0)
295   - *angle += 360 * 16;
296   - while (*angle > 360 * 16)
297   - *angle -= 360 * 16;
  1 + #include <QtGui>
  2 + #include <QtOpenGL/QtOpenGL>
  3 +#include <GL/glu.h>
  4 +
  5 + #include <math.h>
  6 +
  7 + #include "qtSpectrumDisplay.h"
  8 +
  9 + qtSpectrumDisplay::qtSpectrumDisplay(QWidget *parent)
  10 + : QGLWidget(parent)
  11 + {
  12 + object = 0;
  13 + xRot = 0;
  14 + yRot = 0;
  15 + zRot = 0;
  16 +
  17 + qtGreen = QColor::fromCmykF(0.40, 0.0, 1.0, 0.0);
  18 + qtPurple = QColor::fromCmykF(0.39, 0.39, 0.0, 0.0);
  19 + }
  20 +
  21 + qtSpectrumDisplay::~qtSpectrumDisplay()
  22 + {
  23 + makeCurrent();
  24 + glDeleteLists(object, 1);
  25 + }
  26 +
  27 + QSize qtSpectrumDisplay::minimumSizeHint() const
  28 + {
  29 + return QSize(50, 50);
  30 + }
  31 +
  32 + QSize qtSpectrumDisplay::sizeHint() const
  33 + {
  34 + return QSize(400, 400);
  35 + }
  36 +
  37 + /*void qtSpectrumDisplay::setXRotation(int angle)
  38 + {
  39 + normalizeAngle(&angle);
  40 + if (angle != xRot) {
  41 + xRot = angle;
  42 + emit xRotationChanged(angle);
  43 + updateGL();
  44 + }
  45 + }
  46 +
  47 + void qtSpectrumDisplay::setYRotation(int angle)
  48 + {
  49 + normalizeAngle(&angle);
  50 + if (angle != yRot) {
  51 + yRot = angle;
  52 + emit yRotationChanged(angle);
  53 + updateGL();
  54 + }
  55 + }
  56 +
  57 + void qtSpectrumDisplay::setZRotation(int angle)
  58 + {
  59 + normalizeAngle(&angle);
  60 + if (angle != zRot) {
  61 + zRot = angle;
  62 + emit zRotationChanged(angle);
  63 + updateGL();
  64 + }
  65 + }*/
  66 +
  67 + void qtSpectrumDisplay::initializeGL()
  68 + {
  69 + qglClearColor(qtPurple.dark());
  70 + //object = makeObject();
  71 + glShadeModel(GL_FLAT);
  72 + glEnable(GL_DEPTH_TEST);
  73 + glEnable(GL_CULL_FACE);
  74 + }
  75 +
  76 + void qtSpectrumDisplay::printWavenumber(int xPos)
  77 + {
  78 + int viewParams[4];
  79 + glGetIntegerv(GL_VIEWPORT, viewParams);
  80 +
  81 + float a = (float)xPos/(float)viewParams[2];
  82 +
  83 + int wn = a * (nuMax - nuMin) + nuMin;
  84 + cout<<wn<<endl;
  85 +
  86 + }
  87 +
  88 + void qtSpectrumDisplay::paintGL()
  89 + {
  90 + glMatrixMode(GL_PROJECTION);
  91 + glLoadIdentity();
  92 + //glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
  93 + gluOrtho2D(nuMin, nuMax, aMin, aMax);
  94 + glMatrixMode(GL_MODELVIEW);
  95 +
  96 + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  97 + glLoadIdentity();
  98 + /*glTranslated(0.0, 0.0, -10.0);
  99 + glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
  100 + glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
  101 + glRotated(zRot / 16.0, 0.0, 0.0, 1.0);*/
  102 + glLineWidth(2);
  103 + if(dispSimSpec)
  104 + {
  105 + glColor3f(1.0, 1.0, 1.0);
  106 + glBegin(GL_LINE_STRIP);
  107 + for(unsigned int i=0; i<SimSpectrum.size(); i++)
  108 + glVertex2f(SimSpectrum[i].nu, SimSpectrum[i].A);
  109 + glEnd();
  110 + }
  111 + if(dispRefSpec && RefSpectrum.size() > 0)
  112 + {
  113 + glColor3f(0.5, 0.5, 0.5);
  114 + glBegin(GL_LINE_STRIP);
  115 + float nu;
  116 + for(unsigned int i=0; i<RefSpectrum[currentSpec].size(); i++)
  117 + {
  118 + nu = RefSpectrum[currentSpec][i].nu;
  119 + glVertex2f(nu, RefSpectrum[currentSpec][i].A + nu * refSlope);
  120 + }
  121 + glEnd();
  122 + }
  123 +
  124 + int nSamples = MaterialList[currentMaterial].eta.size();
  125 + float nu;
  126 + //display absorbance
  127 + if(dispMatK)
  128 + {
  129 +
  130 + glColor3f(1.0, 0.0, 0.0);
  131 + glBegin(GL_LINE_STRIP);
  132 + for(int i=0; i<nSamples; i++){
  133 + nu = MaterialList[currentMaterial].nu[i];
  134 + glVertex2f(nu, MaterialList[currentMaterial].eta[i].imag() * dispScaleK);
  135 + }
  136 + glEnd();
  137 + }
  138 + if(dispSimK)
  139 + {
  140 + glColor3f(1.0, 1.0, 0.0);
  141 + glBegin(GL_LINE_STRIP);
  142 + for(unsigned int i=0; i<EtaK.size(); i++){
  143 + glVertex2f(EtaK[i].nu, EtaK[i].A * dispScaleK);
  144 + }
  145 + glEnd();
  146 + }
  147 +
  148 + //display refractive index (real)
  149 + if(dispMatN)
  150 + {
  151 + glColor3f(0.0, 1.0, 0.0);
  152 + glBegin(GL_LINE_STRIP);
  153 + for(int i=0; i<nSamples; i++){
  154 + nu = MaterialList[currentMaterial].nu[i];
  155 + glVertex2f(nu, (MaterialList[currentMaterial].eta[i].real() - baseIR) * dispScaleN);
  156 + }
  157 + glEnd();
  158 + }
  159 + if(dispSimN)
  160 + {
  161 + glColor3f(0.0, 1.0, 1.0);
  162 + glBegin(GL_LINE_STRIP);
  163 + for(unsigned int i=0; i<EtaN.size(); i++)
  164 + glVertex2f(EtaN[i].nu, (EtaN[i].A - baseIR) * dispScaleN);
  165 + glEnd();
  166 + }
  167 +
  168 +
  169 + glCallList(object);
  170 + }
  171 +
  172 + void qtSpectrumDisplay::resizeGL(int width, int height)
  173 + {
  174 + int side = qMin(width, height);
  175 + //glViewport((width - side) / 2, (height - side) / 2, side, side);
  176 + glViewport(0, 0, width, height);
  177 +
  178 + /*glMatrixMode(GL_PROJECTION);
  179 + glLoadIdentity();
  180 + //glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
  181 + gluOrtho2D(nuMin, nuMax, aMin, aMax);
  182 + glMatrixMode(GL_MODELVIEW);*/
  183 + }
  184 +
  185 + void qtSpectrumDisplay::mousePressEvent(QMouseEvent *event)
  186 + {
  187 + lastPos = event->pos();
  188 +
  189 + if(event->buttons() & Qt::LeftButton)
  190 + {
  191 + int wn = 0;
  192 + printWavenumber(event->x());
  193 + }
  194 + }
  195 +
  196 + void qtSpectrumDisplay::mouseMoveEvent(QMouseEvent *event)
  197 + {
  198 + int dx = event->x() - lastPos.x();
  199 + int dy = event->y() - lastPos.y();
  200 + /*
  201 + if (event->buttons() & Qt::LeftButton) {
  202 + setXRotation(xRot + 8 * dy);
  203 + setYRotation(yRot + 8 * dx);
  204 + } else if (event->buttons() & Qt::RightButton) {
  205 + setXRotation(xRot + 8 * dy);
  206 + setZRotation(zRot + 8 * dx);
  207 + }*/
  208 + lastPos = event->pos();
  209 + }
  210 +
  211 + /*GLuint qtSpectrumDisplay::makeObject()
  212 + {
  213 + GLuint list = glGenLists(1);
  214 + glNewList(list, GL_COMPILE);
  215 +
  216 + glBegin(GL_QUADS);
  217 +
  218 + GLdouble x1 = +0.06;
  219 + GLdouble y1 = -0.14;
  220 + GLdouble x2 = +0.14;
  221 + GLdouble y2 = -0.06;
  222 + GLdouble x3 = +0.08;
  223 + GLdouble y3 = +0.00;
  224 + GLdouble x4 = +0.30;
  225 + GLdouble y4 = +0.22;
  226 +
  227 + quad(x1, y1, x2, y2, y2, x2, y1, x1);
  228 + quad(x3, y3, x4, y4, y4, x4, y3, x3);
  229 +
  230 + extrude(x1, y1, x2, y2);
  231 + extrude(x2, y2, y2, x2);
  232 + extrude(y2, x2, y1, x1);
  233 + extrude(y1, x1, x1, y1);
  234 + extrude(x3, y3, x4, y4);
  235 + extrude(x4, y4, y4, x4);
  236 + extrude(y4, x4, y3, x3);
  237 +
  238 + const double Pi = 3.14159265358979323846;
  239 + const int NumSectors = 200;
  240 +
  241 + for (int i = 0; i < NumSectors; ++i) {
  242 + double angle1 = (i * 2 * Pi) / NumSectors;
  243 + GLdouble x5 = 0.30 * sin(angle1);
  244 + GLdouble y5 = 0.30 * cos(angle1);
  245 + GLdouble x6 = 0.20 * sin(angle1);
  246 + GLdouble y6 = 0.20 * cos(angle1);
  247 +
  248 + double angle2 = ((i + 1) * 2 * Pi) / NumSectors;
  249 + GLdouble x7 = 0.20 * sin(angle2);
  250 + GLdouble y7 = 0.20 * cos(angle2);
  251 + GLdouble x8 = 0.30 * sin(angle2);
  252 + GLdouble y8 = 0.30 * cos(angle2);
  253 +
  254 + quad(x5, y5, x6, y6, x7, y7, x8, y8);
  255 +
  256 + extrude(x6, y6, x7, y7);
  257 + extrude(x8, y8, x5, y5);
  258 + }
  259 +
  260 + glEnd();
  261 +
  262 + glEndList();
  263 + return list;
  264 + }*/
  265 +
  266 + void qtSpectrumDisplay::quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
  267 + GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4)
  268 + {
  269 + qglColor(qtGreen);
  270 +
  271 + glVertex3d(x1, y1, -0.05);
  272 + glVertex3d(x2, y2, -0.05);
  273 + glVertex3d(x3, y3, -0.05);
  274 + glVertex3d(x4, y4, -0.05);
  275 +
  276 + glVertex3d(x4, y4, +0.05);
  277 + glVertex3d(x3, y3, +0.05);
  278 + glVertex3d(x2, y2, +0.05);
  279 + glVertex3d(x1, y1, +0.05);
  280 + }
  281 +
  282 + /*void qtSpectrumDisplay::extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
  283 + {
  284 + qglColor(qtGreen.dark(250 + int(100 * x1)));
  285 +
  286 + glVertex3d(x1, y1, +0.05);
  287 + glVertex3d(x2, y2, +0.05);
  288 + glVertex3d(x2, y2, -0.05);
  289 + glVertex3d(x1, y1, -0.05);
  290 + }*/
  291 +
  292 + void qtSpectrumDisplay::normalizeAngle(int *angle)
  293 + {
  294 + while (*angle < 0)
  295 + *angle += 360 * 16;
  296 + while (*angle > 360 * 16)
  297 + *angle -= 360 * 16;
298 298 }
299 299 \ No newline at end of file
... ...
qtSpectrumDisplay.h
1   - #ifndef GLWIDGET_H
2   - #define GLWIDGET_H
3   -
4   -#include <QtOpenGL/QGLWidget>
5   -#include "globals.h"
6   -
7   - class qtSpectrumDisplay : public QGLWidget
8   - {
9   - Q_OBJECT
10   -
11   - public:
12   - qtSpectrumDisplay(QWidget *parent = 0);
13   - ~qtSpectrumDisplay();
14   -
15   - QSize minimumSizeHint() const;
16   - QSize sizeHint() const;
17   -
18   - public slots:
19   - /*void setXRotation(int angle);
20   - void setYRotation(int angle);
21   - void setZRotation(int angle);*/
22   -
23   - signals:
24   - void xRotationChanged(int angle);
25   - void yRotationChanged(int angle);
26   - void zRotationChanged(int angle);
27   -
28   - protected:
29   - void initializeGL();
30   - void paintGL();
31   - void resizeGL(int width, int height);
32   - void mousePressEvent(QMouseEvent *event);
33   - void mouseMoveEvent(QMouseEvent *event);
34   -
35   - private:
36   - //GLuint makeObject();
37   - void quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
38   - GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4);
39   - //void extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
40   - void normalizeAngle(int *angle);
41   - void printWavenumber(int wn);
42   -
43   - GLuint object;
44   - int xRot;
45   - int yRot;
46   - int zRot;
47   - QPoint lastPos;
48   - QColor qtGreen;
49   - QColor qtPurple;
50   - };
51   -
  1 + #ifndef GLWIDGET_H
  2 + #define GLWIDGET_H
  3 +
  4 +#include <QtOpenGL/QGLWidget>
  5 +#include "globals.h"
  6 +
  7 + class qtSpectrumDisplay : public QGLWidget
  8 + {
  9 + Q_OBJECT
  10 +
  11 + public:
  12 + qtSpectrumDisplay(QWidget *parent = 0);
  13 + ~qtSpectrumDisplay();
  14 +
  15 + QSize minimumSizeHint() const;
  16 + QSize sizeHint() const;
  17 +
  18 + public slots:
  19 + /*void setXRotation(int angle);
  20 + void setYRotation(int angle);
  21 + void setZRotation(int angle);*/
  22 +
  23 + signals:
  24 + void xRotationChanged(int angle);
  25 + void yRotationChanged(int angle);
  26 + void zRotationChanged(int angle);
  27 +
  28 + protected:
  29 + void initializeGL();
  30 + void paintGL();
  31 + void resizeGL(int width, int height);
  32 + void mousePressEvent(QMouseEvent *event);
  33 + void mouseMoveEvent(QMouseEvent *event);
  34 +
  35 + private:
  36 + //GLuint makeObject();
  37 + void quad(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2,
  38 + GLdouble x3, GLdouble y3, GLdouble x4, GLdouble y4);
  39 + //void extrude(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
  40 + void normalizeAngle(int *angle);
  41 + void printWavenumber(int wn);
  42 +
  43 + GLuint object;
  44 + int xRot;
  45 + int yRot;
  46 + int zRot;
  47 + QPoint lastPos;
  48 + QColor qtGreen;
  49 + QColor qtPurple;
  50 + };
  51 +
52 52 #endif
53 53 \ No newline at end of file
... ...
rtsGUIConsole.cpp
1   -#ifdef WIN32
2   -#include <windows.h>
3   -#include <stdio.h>
4   -#include <fcntl.h>
5   -#include <io.h>
6   -#include <iostream>
7   -#include <fstream>
8   -
9   -#ifndef _USE_OLD_IOSTREAMS
10   -
11   -using namespace std;
12   -#endif
13   -
14   -// maximum mumber of lines the output console should have
15   -
16   -static const WORD MAX_CONSOLE_LINES = 500;
17   -//#ifdef _DEBUG
18   -
19   -void RedirectIOToConsole(int Xpos, int Ypos, int Width, int Height)
20   -{
21   - int hConHandle;
22   - long lStdHandle;
23   - CONSOLE_SCREEN_BUFFER_INFO coninfo;
24   - FILE *fp;
25   - // allocate a console for this app
26   - AllocConsole();
27   - // set the screen buffer to be big enough to let us scroll text
28   - GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
29   - coninfo.dwSize.Y = MAX_CONSOLE_LINES;
30   - SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
31   - coninfo.dwSize);
32   - // redirect unbuffered STDOUT to the console
33   - lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
34   - hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
35   - fp = _fdopen( hConHandle, "w" );
36   - *stdout = *fp;
37   - setvbuf( stdout, NULL, _IONBF, 0 );
38   - // redirect unbuffered STDIN to the console
39   - lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
40   - hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
41   - fp = _fdopen( hConHandle, "r" );
42   - *stdin = *fp;
43   - setvbuf( stdin, NULL, _IONBF, 0 );
44   -
45   - // redirect unbuffered STDERR to the console
46   - lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
47   - hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
48   - fp = _fdopen( hConHandle, "w" );
49   - *stderr = *fp;
50   - setvbuf( stderr, NULL, _IONBF, 0 );
51   -
52   - // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
53   - // point to console as well
54   - ios::sync_with_stdio();
55   - //position
56   - MoveWindow(GetConsoleWindow(), Xpos, Ypos, Width, Height, true);
57   -}
58   -
59   -#else
60   -void RedirectIOToConsole(int Xpos, int Ypos, int Width, int Height)
61   -{
62   -}
63   -#endif
64   -
  1 +#ifdef WIN32
  2 +#include <windows.h>
  3 +#include <stdio.h>
  4 +#include <fcntl.h>
  5 +#include <io.h>
  6 +#include <iostream>
  7 +#include <fstream>
  8 +
  9 +#ifndef _USE_OLD_IOSTREAMS
  10 +
  11 +using namespace std;
  12 +#endif
  13 +
  14 +// maximum mumber of lines the output console should have
  15 +
  16 +static const WORD MAX_CONSOLE_LINES = 500;
  17 +//#ifdef _DEBUG
  18 +
  19 +void RedirectIOToConsole(int Xpos, int Ypos, int Width, int Height)
  20 +{
  21 + int hConHandle;
  22 + long lStdHandle;
  23 + CONSOLE_SCREEN_BUFFER_INFO coninfo;
  24 + FILE *fp;
  25 + // allocate a console for this app
  26 + AllocConsole();
  27 + // set the screen buffer to be big enough to let us scroll text
  28 + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
  29 + coninfo.dwSize.Y = MAX_CONSOLE_LINES;
  30 + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
  31 + coninfo.dwSize);
  32 + // redirect unbuffered STDOUT to the console
  33 + lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
  34 + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
  35 + fp = _fdopen( hConHandle, "w" );
  36 + *stdout = *fp;
  37 + setvbuf( stdout, NULL, _IONBF, 0 );
  38 + // redirect unbuffered STDIN to the console
  39 + lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
  40 + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
  41 + fp = _fdopen( hConHandle, "r" );
  42 + *stdin = *fp;
  43 + setvbuf( stdin, NULL, _IONBF, 0 );
  44 +
  45 + // redirect unbuffered STDERR to the console
  46 + lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
  47 + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
  48 + fp = _fdopen( hConHandle, "w" );
  49 + *stderr = *fp;
  50 + setvbuf( stderr, NULL, _IONBF, 0 );
  51 +
  52 + // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
  53 + // point to console as well
  54 + ios::sync_with_stdio();
  55 + //position
  56 + MoveWindow(GetConsoleWindow(), Xpos, Ypos, Width, Height, true);
  57 +}
  58 +
  59 +#else
  60 +void RedirectIOToConsole(int Xpos, int Ypos, int Width, int Height)
  61 +{
  62 +}
  63 +#endif
  64 +
65 65 //End of File
66 66 \ No newline at end of file
... ...
rtsGUIConsole.h
1   -#ifndef __GUICON_H__
2   -
3   -#define __GUICON_H__
4   -
5   -//#ifdef _DEBUG
6   -
7   -void RedirectIOToConsole(int Xpos = 0, int Ypos = 0, int Width = 700, int Height = 400);
8   -
9   -//#endif
10   -
11   -#endif
12   -
  1 +#ifndef __GUICON_H__
  2 +
  3 +#define __GUICON_H__
  4 +
  5 +//#ifdef _DEBUG
  6 +
  7 +void RedirectIOToConsole(int Xpos = 0, int Ypos = 0, int Width = 700, int Height = 400);
  8 +
  9 +//#endif
  10 +
  11 +#endif
  12 +
13 13 /* End of File */
14 14 \ No newline at end of file
... ...