Commit da3d4e0e3dfabd920e06f7e3efc307a3d4b9059c

Authored by dmayerich
0 parents

Initial commit.

BESSEL.h 0 โ†’ 100644
  1 +++ a/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
... ...
BESSIK.CPP 0 โ†’ 100644
  1 +++ a/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,f0,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 0 โ†’ 100644
  1 +++ a/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 = 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 = 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,f0,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,bjy0,bjy1,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 0 โ†’ 100644
  1 +++ a/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 +}
... ...
CBESSJY.CPP 0 โ†’ 100644
  1 +++ a/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,kz,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 +
... ...
CMakeLists.txt 0 โ†’ 100644
  1 +++ a/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_LIBRARIES} ${GLEW_LIBRARY})
  74 +
  75 +
  76 +
... ...
EstimateMaterial.cpp 0 โ†’ 100644
  1 +++ a/EstimateMaterial.cpp
  1 +#include "globals.h"
  2 +#define PI 3.14159
  3 +
  4 +float CalculateError(float* E)
  5 +{
  6 + //Calculate the error between the Reference Spectrum and the Simulated Spectrum
  7 + float sumE = 0.0;
  8 + int nVals = RefSpectrum[currentSpec].size();
  9 + float nu;
  10 + for(int i=0; i<nVals; i++)
  11 + {
  12 + nu = RefSpectrum[currentSpec][i].nu;
  13 + E[i] = RefSpectrum[currentSpec][i].A + nu * refSlope - SimSpectrum[i].A;
  14 + sumE += E[i]*E[i];
  15 + }
  16 +
  17 + return sumE/nVals;
  18 +}
  19 +
  20 +void EstimateK(float* E)
  21 +{
  22 + int nVals = RefSpectrum[currentSpec].size();
  23 + float nuStart = RefSpectrum[currentSpec].front().nu;
  24 + float nuEnd = RefSpectrum[currentSpec].back().nu;
  25 +
  26 + float r = radius/10000.0;
  27 + float nu;
  28 + float dNu = (nuEnd - nuStart)/(nVals-1);
  29 + float eScale;
  30 + for(int i=0; i<nVals; i++)
  31 + {
  32 + nu = nuStart + i*2;
  33 +
  34 + eScale = 1/(8*PI*r*nu);
  35 + EtaK[i].A = EtaK[i].A + eScale * E[i];
  36 + if(EtaK[i].A < 0.0) EtaK[i].A = 0.0;
  37 + }
  38 +}
  39 +
  40 +void EstimateMaterial()
  41 +{
  42 + /*This function estimates the material properties of a sphere based on the
  43 + input spectrum RefSpectrum and the optical properties of the system.
  44 + 1) The material properties are stored in EtaK and EtaN
  45 + 2) The best fit is stored in SimSpectrum*/
  46 +
  47 + //initialize the material index of refraction
  48 + EtaN.clear();
  49 + EtaK.clear();
  50 +
  51 + //insert the default material properties
  52 + SpecPair temp;
  53 + for(int s=0; s<RefSpectrum[currentSpec].size(); s++)
  54 + {
  55 + //the real part of the IR is the user-specified baseline IR
  56 + temp.nu = RefSpectrum[currentSpec][s].nu;
  57 + temp.A = baseIR;
  58 + EtaN.push_back(temp);
  59 + //the imaginary part of the IR is zero absorbance
  60 + temp.A = 0.0f;
  61 + EtaK.push_back(temp);
  62 + }
  63 +
  64 +
  65 + //allocate space to store the list of error values
  66 + float* E = (float*)malloc(sizeof(float) * RefSpectrum[currentSpec].size());
  67 + //copy the absorbance values into a linear array
  68 + float* k = (float*)malloc(sizeof(float) * EtaK.size());
  69 + float* n = (float*)malloc(sizeof(float) * EtaN.size());
  70 +
  71 + //iterate to solve for both n and k
  72 + float sumE = 99999.9;
  73 + int i=0;
  74 + //clear the console
  75 + system("cls");
  76 + while(sumE > minMSE && i < maxFitIter)
  77 + {
  78 + //simulate a spectrum based on the current IR
  79 + SimulateSpectrum();
  80 +
  81 + //calculate the error term
  82 + sumE = CalculateError(E);
  83 +
  84 + //estimate the new absorbance
  85 + EstimateK(E);
  86 +
  87 + //use Kramers-Kronig to compute n
  88 +
  89 + for(int i=0; i<EtaK.size(); i++)
  90 + k[i] = EtaK[i].A;
  91 + cudaKramersKronig(n, k, EtaK.size(), EtaK.front().nu, EtaK.back().nu, baseIR);
  92 +
  93 + //copy the real part of the index of refraction into the vector
  94 + EtaN.clear();
  95 + for(int i=0; i<EtaK.size(); i++)
  96 + {
  97 + temp.nu = EtaK[i].nu;
  98 + temp.A = n[i];
  99 + EtaN.push_back(temp);
  100 + }
  101 +
  102 + cout<<" E = "<<sumE<<endl;
  103 + i++;
  104 + //SaveSpectrum(n, nVals, "simNj.txt");
  105 + //SaveSpectrum(k, nVals, "simKj.txt");
  106 + //SaveSpectrum(simSpec, nVals, "simSpec.txt");
  107 + //exit(1);
  108 +
  109 + }
  110 +
  111 + free(E);
  112 + free(k);
  113 + free(n);
  114 +
  115 +
  116 +
  117 +
  118 +}
0 119 \ No newline at end of file
... ...
FileIO.cpp 0 โ†’ 100644
  1 +++ a/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 + float inMin = S.front().nu;
  27 + float inMax = S.back().nu;
  28 +
  29 + int nuMin = ceil(inMin);
  30 + int nuMax = 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 + float 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 < 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(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(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 + for(int i=0; i<SimSpectrum.size(); i++)
  114 + {
  115 + outFile<<SimSpectrum[i].nu<<" ";
  116 + outFile<<SimSpectrum[i].A<<endl;
  117 + }
  118 + outFile.close();
  119 +}
  120 +
  121 +void SaveState()
  122 +{
  123 + ofstream outFile("main.prj");
  124 + //Window Parameters
  125 + outFile<<nuMin<<endl;
  126 + outFile<<nuMax<<endl;
  127 + outFile<<aMin<<endl;
  128 + outFile<<aMax<<endl;
  129 + outFile<<dNu<<endl;
  130 +
  131 + //material parameters
  132 + outFile<<radius<<endl;
  133 + outFile<<baseIR<<endl;
  134 + outFile<<cA<<endl;
  135 +
  136 + //optical parameters
  137 + outFile<<cNAi<<endl;
  138 + outFile<<cNAo<<endl;
  139 + outFile<<oNAi<<endl;
  140 + outFile<<oNAo<<endl;
  141 +
  142 + outFile.close();
  143 +
  144 +}
  145 +
  146 +void LoadState()
  147 +{
  148 + ifstream inFile("main.prj");
  149 + //Window Parameters
  150 + inFile>>nuMin;
  151 + inFile>>nuMax;
  152 + inFile>>aMin;
  153 + inFile>>aMax;
  154 + inFile>>dNu;
  155 +
  156 + //material parameters
  157 + inFile>>radius;
  158 + inFile>>baseIR;
  159 + inFile>>cA;
  160 +
  161 + //optical parameters
  162 + inFile>>cNAi;
  163 + inFile>>cNAo;
  164 + inFile>>oNAi;
  165 + inFile>>oNAo;
  166 +
  167 + inFile.close();
  168 +
  169 +}
  170 +
  171 +void SetDefaults()
  172 +{
  173 +
  174 + nuMin = 800;
  175 + nuMax = 4000;
  176 + dNu = 2;
  177 +
  178 + aMin = 0;
  179 + aMax = 1;
  180 +
  181 +
  182 + //material parameters
  183 + radius = 4.0f;
  184 + baseIR = 1.49f;
  185 + cA = 1.0;
  186 + vector<SpecPair> KMaterial;
  187 + vector<SpecPair> NMaterial;
  188 +
  189 + //optical parameters
  190 + cNAi = 0.0;
  191 + cNAo = 0.6;
  192 + oNAi = 0.0;
  193 + oNAo = 0.6;
  194 +}
0 195 \ No newline at end of file
... ...
FindCUDASDK.cmake 0 โ†’ 100644
  1 +++ a/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)
... ...
FindGLEW.cmake 0 โ†’ 100644
  1 +++ a/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
  51 +)
0 52 \ No newline at end of file
... ...
FindRTS.cmake 0 โ†’ 100644
  1 +++ a/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)
... ...
GAMMA.cpp 0 โ†’ 100644
  1 +++ a/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 +}
... ...
PerformanceData.h 0 โ†’ 100644
  1 +++ a/PerformanceData.h
  1 +// add the following to a cpp file:
  2 +// PerformanceData PD;
  3 +
  4 +#pragma once
  5 +#include <ostream>
  6 +using namespace std;
  7 +
  8 +enum PerformanceDataType
  9 +{
  10 + PD_DISPLAY=0,
  11 + PD_SPS,
  12 + PD_UNUSED0,
  13 +
  14 + //my stuff
  15 + SIMULATE_SPECTRUM,
  16 + SIMULATE_GPU,
  17 + KRAMERS_KRONIG,
  18 +
  19 +
  20 +
  21 + //end my stuff
  22 + PERFORMANCE_DATA_TYPE_COUNT
  23 +};
  24 +
  25 +static char PDTypeNames[][255] = {
  26 + "Display ",
  27 + "Simulation Total ",
  28 + " ----------------- ",
  29 + //my stuff
  30 + "Simulate Spectrum ",
  31 + " GPU Portion ",
  32 + "Kramers-Kronig ",
  33 +
  34 + //end my stuff
  35 +
  36 +};
  37 +
  38 +//-------------------------------------------------------------------------------
  39 +
  40 +//#ifdef DISPLAY
  41 +// #define PERFORMANCE_DATA_MEASUE_ENABLE
  42 +//#endif
  43 +
  44 +//#ifdef PERFORMANCE_DATA_MEASUE_ENABLE
  45 +
  46 +//-------------------------------------------------------------------------------
  47 +
  48 +#include <stdio.h>
  49 +#include <windows.h>
  50 +#include <float.h>
  51 +
  52 +#include <iostream>
  53 +#include <iomanip>
  54 +
  55 +//-------------------------------------------------------------------------------
  56 +
  57 +class PerformanceData
  58 +{
  59 +public:
  60 + PerformanceData() { ClearAll(); QueryPerformanceFrequency(&cps); }
  61 + ~PerformanceData(){}
  62 +
  63 + void ClearAll()
  64 + {
  65 + for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ ) {
  66 + for ( int j=0; j<256; j++ ) times[i][j] = 0;
  67 + pos[i] = 0;
  68 + minTime[i] = 0xFFFFFFFF;
  69 + maxTime[i] = 0;
  70 + totalTime[i] = 0;
  71 + dataReady[i] = false;
  72 + }
  73 + }
  74 +
  75 + void StartTimer( int type ) { QueryPerformanceCounter( &startTime[type] ); /*startTime[type] = GetTickCount();*/ }
  76 + void EndTimer( int type ) {
  77 + LARGE_INTEGER endTime;
  78 + QueryPerformanceCounter( &endTime );
  79 + double t = endTime.QuadPart - startTime[type].QuadPart;
  80 + //unsigned int t = GetTickCount() - startTime[type];
  81 + if ( t < minTime[type] ) minTime[type] = t;
  82 + if ( t > maxTime[type] ) maxTime[type] = t;
  83 + totalTime[type] -= times[type][ pos[type] ];
  84 + times[type][ pos[type] ] = t;
  85 + totalTime[type] += t;
  86 + pos[type]++;
  87 + if ( pos[type] == 0 ) dataReady[type] = true;
  88 + }
  89 +
  90 + void PrintResult( ostream &os,int i=PERFORMANCE_DATA_TYPE_COUNT)
  91 + {
  92 + os.setf(ios::fixed);
  93 + if ((i<PERFORMANCE_DATA_TYPE_COUNT)&&(i>=0)){
  94 + double a = GetAvrgTime(i);
  95 + if ( a )
  96 + os<< PDTypeNames[i]<<" : avrg="<<setw(8)<<setprecision(3)<<a<<"\tmin="<<setw(8)<<setprecision(3)<< GetMinTime(i) <<"\tmax="<<setw(8)<<setprecision(3)<< GetMaxTime(i) <<endl ;
  97 + else
  98 + os<< PDTypeNames[i]<<" : avrg= -----\tmin= -----\tmax= -----"<<endl;
  99 + }
  100 + }
  101 +
  102 + void PrintResults( ostream &os)
  103 + {
  104 + for ( int i=0; i<PERFORMANCE_DATA_TYPE_COUNT; i++ )
  105 + PrintResult(os,i);
  106 + }
  107 +
  108 + double GetLastTime( int type ) { return times[type][pos[type]]; }
  109 + 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; }
  110 + double GetMinTime( int type ) { return 1000.0 * minTime[type] / (float)cps.LowPart; }
  111 + double GetMaxTime( int type ) { return 1000.0 * maxTime[type] / (float)cps.LowPart; }
  112 +
  113 +private:
  114 + double times[PERFORMANCE_DATA_TYPE_COUNT][256];
  115 + unsigned char pos[PERFORMANCE_DATA_TYPE_COUNT];
  116 + LARGE_INTEGER startTime[PERFORMANCE_DATA_TYPE_COUNT];
  117 + double minTime[ PERFORMANCE_DATA_TYPE_COUNT ];
  118 + double maxTime[ PERFORMANCE_DATA_TYPE_COUNT ];
  119 + double totalTime[ PERFORMANCE_DATA_TYPE_COUNT ];
  120 + bool dataReady[ PERFORMANCE_DATA_TYPE_COUNT ];
  121 + LARGE_INTEGER cps;
  122 +};
  123 +
  124 +//-------------------------------------------------------------------------------
  125 +/*#else
  126 +
  127 +class PerformanceData{
  128 +public:
  129 + PerformanceData() {;};
  130 + ~PerformanceData(){;};
  131 + void ClearAll(){;};
  132 + void StartTimer( int type ) {;};
  133 + void EndTimer( int type ) {;};
  134 + void PrintResults( ostream &os){;};
  135 + void PrintResult( ostream &os, int i=PERFORMANCE_DATA_TYPE_COUNT){;};
  136 + double GetLastTime( int type ) { return 0.0; };
  137 + double GetAvrgTime( int type ) { return 0.0; };
  138 + double GetMinTime( int type ) { return 0.0; };
  139 + double GetMaxTime( int type ) { return 0.0; };
  140 +};
  141 +
  142 +#endif
  143 +//-------------------------------------------------------------------------------
  144 +*/
  145 +extern PerformanceData PD;
  146 +
  147 +//-------------------------------------------------------------------------------
... ...
SimulateSpectrum.cpp 0 โ†’ 100644
  1 +++ a/SimulateSpectrum.cpp
  1 +#include <math.h>
  2 +#include <complex>
  3 +#include <iostream>
  4 +#include <fstream>
  5 +#include "globals.h"
  6 +//#include "cufft.h"
  7 +using namespace std;
  8 +
  9 +#define pi 3.14159
  10 +
  11 +typedef complex<float> scComplex;
  12 +
  13 +int cbessjyva(double v,complex<double> z,double &vm,complex<double>*cjv,
  14 + complex<double>*cyv,complex<double>*cjvp,complex<double>*cyvp);
  15 +int bessjyv(double v,double x,double &vm,double *jv,double *yv,
  16 + double *djv,double *dyv);
  17 +
  18 +complex<double> Jl_neg(complex<double> x)
  19 +{
  20 + //this function computes the bessel function of the first kind Jl(x) for l = -0.5
  21 + return ( sqrt(2.0/pi) * cos(x) )/sqrt(x);
  22 +}
  23 +
  24 +double Jl_neg(double x)
  25 +{
  26 + //this function computes the bessel function of the first kind Jl(x) for l = -0.5
  27 + return ( sqrt(2.0/pi) * cos(x) )/sqrt(x);
  28 +}
  29 +
  30 +double Yl_neg(double x)
  31 +{
  32 + //this function computes the bessel function of the second kind Yl(x) for l = -0.5;
  33 + return ( sqrt(2.0/pi) * sin(x) )/sqrt(x);
  34 +}
  35 +
  36 +void computeB(complex<float>* B, float radius, complex<double> refIndex, float lambda, int Nl)
  37 +{
  38 + double k = (2*pi)/lambda;
  39 + int b = 2;
  40 +
  41 + //allocate space for the real bessel functions
  42 + double* jv = (double*)malloc(sizeof(double)*(Nl+b));
  43 + double* yv = (double*)malloc(sizeof(double)*(Nl+b));
  44 + double* jvp = (double*)malloc(sizeof(double)*(Nl+b));
  45 + double* yvp = (double*)malloc(sizeof(double)*(Nl+b));
  46 +
  47 + //allocate space for the complex bessel functions
  48 + complex<double>* cjv = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  49 + complex<double>* cyv = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  50 + complex<double>* cjvp = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  51 + complex<double>* cyvp = (complex<double>*)malloc(sizeof(complex<double>)*(Nl+b));
  52 +
  53 + double kr = k*radius;
  54 + complex<double> knr = k*refIndex*(double)radius;
  55 + complex<double> n = refIndex;
  56 +
  57 + //compute the bessel functions for k*r
  58 + double vm;// = Nl - 1;
  59 + bessjyv((Nl)+0.5, kr, vm, jv, yv, jvp, yvp);
  60 + //cout<<"Nl: "<<Nl<<" vm: "<<vm<<endl;
  61 + //printf("Nl: %f, vm: %f\n", (float)Nl, (float)vm);
  62 +
  63 + //compute the bessel functions for k*n*r
  64 + cbessjyva((Nl)+0.5, knr, vm, cjv, cyv, cjvp, cyvp);
  65 +
  66 + //scale factor for spherical bessel functions
  67 + double scale_kr = sqrt(pi/(2.0*kr));
  68 + complex<double> scale_knr = sqrt(pi/(2.0*knr));
  69 +
  70 + complex<double> numer, denom;
  71 + double j_kr;
  72 + double y_kr;
  73 + complex<double> j_knr;
  74 + complex<double> j_d_knr;
  75 + double j_d_kr;
  76 + complex<double> h_kr;
  77 + complex<double> h_d_kr;
  78 + complex<double> h_neg;
  79 + complex<double> h_pos;
  80 +
  81 + //cout<<"B coefficients:"<<endl;
  82 + for(int l=0; l<Nl; l++)
  83 + {
  84 + //compute the spherical bessel functions
  85 + j_kr = jv[l] * scale_kr;
  86 + y_kr = yv[l] * scale_kr;
  87 + j_knr = cjv[l] * scale_knr;
  88 +
  89 + //compute the Hankel function
  90 + h_kr = complex<double>(j_kr, y_kr);
  91 +
  92 + //compute the derivatives
  93 + if(l == 0)
  94 + {
  95 + //spherical bessel functions for l=0
  96 + j_d_kr = scale_kr * (Jl_neg(kr) - (jv[l] + kr*jv[l+1])/kr )/2.0;
  97 + j_d_knr = scale_knr * ( Jl_neg(knr) - (cjv[l] + knr*cjv[l+1])/knr )/2.0;
  98 + h_neg = complex<double>(scale_kr*Jl_neg(kr), scale_kr*Yl_neg(kr));
  99 + h_pos = complex<double>(scale_kr*jv[l+1], scale_kr*yv[l+1]);
  100 + h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0;
  101 + }
  102 + else
  103 + {
  104 + //spherical bessel functions
  105 + j_d_kr = scale_kr * (jv[l-1] - (jv[l] + kr*jv[l+1])/kr )/2.0;
  106 + j_d_knr = scale_knr * ( cjv[l-1] - (cjv[l] + knr*cjv[l+1])/knr )/2.0;
  107 + h_neg = complex<double>(scale_kr*jv[l-1], scale_kr*yv[l-1]);
  108 + h_pos = complex<double>(scale_kr*jv[l+1], scale_kr*yv[l+1]);
  109 + h_d_kr = (h_neg - (h_kr + kr*h_pos)/kr)/2.0;
  110 + }
  111 +
  112 + numer = j_kr*j_d_knr*n - j_knr*j_d_kr;
  113 + denom = j_knr*h_d_kr - h_kr*j_d_knr*n;
  114 + complex<double> temp = numer/denom;
  115 +
  116 + B[l] = scComplex(temp.real(), temp.imag());
  117 + //cout<<B[l]<<endl;
  118 + }
  119 +
  120 + free(jv);
  121 + free(yv);
  122 + free(jvp);
  123 + free(yvp);
  124 + free(cjv);
  125 + free(cyv);
  126 + free(cjvp);
  127 + free(cyvp);
  128 +}
  129 +
  130 +void Legendre(float* P, float x, int Nl)
  131 +{
  132 + //computes the legendre polynomials from orders 0 to Nl-1
  133 + P[0] = 1;
  134 + if(Nl == 1) return;
  135 + P[1] = x;
  136 + for(int l = 2; l < Nl; l++)
  137 + {
  138 + P[l] = ((2*l - 1)*x*P[l-1] - (l - 1)*P[l-2])/l;
  139 + }
  140 +
  141 +}
  142 +
  143 +complex<float> integrateUi(float cAngleI, float cAngleO, float oAngleI, float oAngleO, float M = 2*pi)
  144 +{
  145 + /*This function integrates the incident field of magnitude M in the far zone
  146 + in order to evaluate the field at the central pixel of a detector.
  147 + cNAi = condenser inner angle
  148 + cNAo = condenser outer angle
  149 + oNAi = objective inner angle
  150 + oNAo = objective outer angle
  151 + M = field magnitude*/
  152 +
  153 + float alphaIn = max(cAngleI, oAngleI);
  154 + float alphaOut = min(cAngleO,oAngleO);
  155 +
  156 + complex<float> Ui;
  157 + if(alphaIn > alphaOut)
  158 + Ui = complex<float>(0.0, 0.0);
  159 + else
  160 + Ui = complex<float>(M * 2 * pi * (cos(alphaIn) - cos(alphaOut)), 0.0f);
  161 +
  162 + return Ui;
  163 +
  164 +}
  165 +
  166 +void computeCondenserAlpha(float* alpha, int Nl, float cAngleI, float cAngleO)
  167 +{
  168 + /*This function computes the condenser integral in order to build the field of incident light
  169 + alpha = list of Nl floating point values representing the condenser alpha as a function of l
  170 + Nl = number of orders in the incident field
  171 + cAngleI, cAngleO = inner and outer condenser angles (inner and outer NA)*/
  172 +
  173 + //compute the Legendre polynomials for the condenser aperature
  174 + float* PcNAo = (float*)malloc(sizeof(float)*(Nl+1));
  175 + Legendre(PcNAo, cos(cAngleO), Nl+1);
  176 + float* PcNAi = (float*)malloc(sizeof(float)*(Nl+1));
  177 + Legendre(PcNAi, cos(cAngleI), Nl+1);
  178 +
  179 + for(int l=0; l<Nl; l++)
  180 + {
  181 + //integration term
  182 + if(l == 0)
  183 + alpha[l] = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
  184 + else
  185 + alpha[l] = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
  186 +
  187 + alpha[l] *= 2 * pi;
  188 + }
  189 +
  190 +}
  191 +
  192 +complex<float> integrateUs(float r, float lambda, complex<float> eta,
  193 + float cAngleI, float cAngleO, float oAngleI, float oAngleO, float M = 2*pi)
  194 +{
  195 + /*This function integrates the incident field of magnitude M in the far zone
  196 + in order to evaluate the field at the central pixel of a detector.
  197 + r = sphere radius
  198 + lambda = wavelength
  199 + eta = index of refraction
  200 + cNAi = condenser inner NA
  201 + cNAo = condenser outer NA
  202 + oNAi = objective inner NA
  203 + oNAo = objective outer NA
  204 + M = field magnitude*/
  205 +
  206 + //compute the required number of orders
  207 + float k = 2*pi/lambda;
  208 + int Nl = ceil( k + 4 * exp(log(k*r)/3) + 3 );
  209 +
  210 + //compute the material coefficients B
  211 + complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>)*Nl);
  212 + //compute the Legendre polynomials for the condenser and objective aperatures
  213 + float* PcNAo = (float*)malloc(sizeof(float)*(Nl+1));
  214 + Legendre(PcNAo, cos(cAngleO), Nl+1);
  215 + float* PcNAi = (float*)malloc(sizeof(float)*(Nl+1));
  216 + Legendre(PcNAi, cos(cAngleI), Nl+1);
  217 +
  218 + float* PoNAo = (float*)malloc(sizeof(float)*(Nl+1));
  219 + Legendre(PoNAo, cos(oAngleO), Nl+1);
  220 + float* PoNAi = (float*)malloc(sizeof(float)*(Nl+1));
  221 + Legendre(PoNAi, cos(oAngleI), Nl+1);
  222 +
  223 + //store the index of refraction;
  224 + complex<double> IR(eta.real(), eta.imag());
  225 +
  226 + //compute the scattering coefficients
  227 + computeB(B, r, IR, lambda, Nl);
  228 +
  229 + //aperature terms for the condenser (alpha) and objective (beta)
  230 + float alpha;
  231 + float beta;
  232 + float c;
  233 + complex<float> Us(0.0, 0.0);
  234 +
  235 + for(int l=0; l<Nl; l++)
  236 + {
  237 + //integration term
  238 + if(l == 0)
  239 + {
  240 + alpha = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
  241 + beta = -PoNAo[l+1] + PoNAo[0] + PoNAi[l+1] - PoNAi[0];
  242 + }
  243 + else
  244 + {
  245 + alpha = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
  246 + beta = -PoNAo[l+1] + PoNAo[l-1] + PoNAi[l+1] - PoNAi[l-1];
  247 + }
  248 + c = (2*pi)/(2.0 * l + 1.0);
  249 + Us += c * alpha * beta * B[l] * M;
  250 +
  251 +
  252 + }
  253 + free(PcNAo);
  254 + free(PcNAi);
  255 + free(PoNAo);
  256 + free(PoNAi);
  257 + free(B);
  258 +
  259 + return Us;
  260 +
  261 +}
  262 +
  263 +void pointSpectrum()
  264 +{
  265 + PD.StartTimer(SIMULATE_SPECTRUM);
  266 + //clear the previous spectrum
  267 + SimSpectrum.clear();
  268 +
  269 + float dNu = 2.0f;
  270 + float lambda;
  271 +
  272 + //compute the angles based on NA
  273 + float cAngleI = asin(cNAi);
  274 + float cAngleO = asin(cNAo);
  275 + float oAngleI = asin(oNAi);
  276 + float oAngleO = asin(oNAo);
  277 +
  278 + //implement a reflection-mode system if necessary
  279 + if(opticsMode == ReflectionOpticsType){
  280 +
  281 + //set the condenser to match the objective
  282 + cAngleI = oAngleI;
  283 + cAngleO = oAngleO;
  284 +
  285 + //invert the objective
  286 + oAngleO = pi - cAngleI;
  287 + oAngleI = pi - cAngleO;
  288 + }
  289 +
  290 + //integrate the incident field at the detector position
  291 + complex<float> Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  292 + float I0 = Ui.real() * Ui.real() + Ui.imag() * Ui.imag();
  293 + I0 *= scaleI0;
  294 +
  295 +
  296 +
  297 + float I;
  298 + SpecPair temp;
  299 + float nu;
  300 + complex<float> eta;
  301 + complex<float> Us, U;
  302 +
  303 + float vecLen = 0.0;
  304 + for(int i=0; i<EtaK.size(); i++)
  305 + {
  306 + nu = EtaK[i].nu;
  307 + lambda = 10000.0f/nu;
  308 + if(applyMaterial)
  309 + eta = complex<float>(EtaN[i].A, EtaK[i].A);
  310 + else
  311 + eta = complex<float>(baseIR, 0.0);
  312 +
  313 +
  314 + //integrate the scattered field at the detector position
  315 + Us = integrateUs(radius, lambda, eta, cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  316 + U = Us + Ui;
  317 + float I = U.real() * U.real() + U.imag() * U.imag();
  318 +
  319 + temp.nu = nu;
  320 +
  321 + //set the spectrum value based on the current display type
  322 + if(dispSimType == AbsorbanceSpecType)
  323 + temp.A = -log10(I/I0);
  324 + else
  325 + temp.A = I;
  326 +
  327 + if(dispNormalize)
  328 + vecLen += temp.A * temp.A;
  329 +
  330 + SimSpectrum.push_back(temp);
  331 + }
  332 + vecLen = sqrt(vecLen);
  333 +
  334 + if(dispNormalize)
  335 + for(int i=0; i<SimSpectrum.size(); i++)
  336 + SimSpectrum[i].A = (SimSpectrum[i].A / vecLen) * dispNormFactor;
  337 +
  338 + PD.EndTimer(SIMULATE_SPECTRUM);
  339 +}
  340 +
  341 +/*
  342 +complex<float> sampleUs(complex<float>* B, float* Alpha, int Nl, float r,
  343 + float cAngleI, float cAngleO, float theta, float M = 2*pi)
  344 +{
  345 + /*This function takes a point sample of the scattered field in the far zone
  346 + in order to evaluate the field at the central pixel of a detector.
  347 + r = sphere radius
  348 + lambda = wavelength
  349 + eta = index of refraction
  350 + cNAi = condenser inner NA
  351 + cNAo = condenser outer NA
  352 + theta = angle of the sample
  353 + M = field magnitude*/
  354 +
  355 +/*
  356 + //compute the material coefficients B
  357 + //complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>)*Nl);
  358 +
  359 + //compute the Legendre polynomials for theta (at the objective)
  360 + float* Ptheta = (float*)malloc(sizeof(float)*(Nl+1));
  361 + Legendre(Ptheta, cos(theta), Nl+1);
  362 +
  363 + //complex<double> IR(eta.real(), eta.imag());
  364 +
  365 + //aperature terms for the condenser (alpha) and objective (beta)
  366 + float beta;
  367 + float c;
  368 + complex<float> Us(0.0, 0.0);
  369 +
  370 + for(int l=0; l<Nl; l++)
  371 + {
  372 +
  373 + complex<float> numer(0.0, -(l*pi)/2.0);
  374 + Us += B[l] * exp(numer) * Ptheta[l] * Alpha[l] * pow(complex<float>(0.0, 1.0), l);
  375 +
  376 +
  377 + }
  378 + //printf("Ptheta: %f\n", Ptheta[Nl-1]);
  379 +
  380 + return Us;
  381 +
  382 +}*/
  383 +
  384 +
  385 +/*
  386 +void detectorSpectrum(int numSamples)
  387 +{
  388 + //integrate across the objective aperature and calculate the resulting intensity on a detector
  389 + PD.StartTimer(SIMULATE_SPECTRUM);
  390 + //clear the previous spectrum
  391 + SimSpectrum.clear();
  392 +
  393 + float dNu = 2.0f;
  394 + float lambda;
  395 +
  396 + //compute the angles based on NA
  397 + float cAngleI = asin(cNAi);
  398 + float cAngleO = asin(cNAo);
  399 + float oAngleI = asin(oNAi);
  400 + float oAngleO = asin(oNAo);
  401 +
  402 + //implement a reflection-mode system if necessary
  403 + if(opticsMode == ReflectionOpticsType){
  404 +
  405 + //set the condenser to match the objective
  406 + cAngleI = oAngleI;
  407 + cAngleO = oAngleO;
  408 +
  409 + //invert the objective
  410 + oAngleO = pi - cAngleI;
  411 + oAngleI = pi - cAngleO;
  412 + }
  413 +
  414 + //compute Nl (maximum order of the spectrum)
  415 + //****************************************************************************
  416 + float maxNu = EtaK.back().nu;
  417 + float maxLambda = 10000.0f/maxNu;
  418 + float k = 2*pi/maxLambda;
  419 + int Nl = ceil( k + 4 * exp(log(k*radius)/3) + 3 );
  420 + int nLambda = EtaK.size();
  421 +
  422 + //compute alpha (condenser integral)
  423 + //****************************************************************************
  424 + //compute the Legendre polynomials for the condenser aperature
  425 + float* PcNAo = (float*)malloc(sizeof(float)*(Nl+1));
  426 + Legendre(PcNAo, cos(cAngleO), Nl+1);
  427 + float* PcNAi = (float*)malloc(sizeof(float)*(Nl+1));
  428 + Legendre(PcNAi, cos(cAngleI), Nl+1);
  429 +
  430 + //allocate space for the alpha array
  431 + float* alpha = (float*)malloc(sizeof(float)*(Nl + 1));
  432 + computeCondenserAlpha(alpha, Nl, cAngleI, cAngleO);
  433 +
  434 + for(int l=0; l<Nl; l++)
  435 + {
  436 + //integration term
  437 + if(l == 0)
  438 + alpha[l] = -PcNAo[l+1] + PcNAo[0] + PcNAi[l+1] - PcNAi[0];
  439 + else
  440 + alpha[l] = -PcNAo[l+1] + PcNAo[l-1] + PcNAi[l+1] - PcNAi[l-1];
  441 +
  442 + alpha[l] *= 2 * pi;
  443 + }
  444 +
  445 + //compute the information based on wavelength and sphere
  446 +
  447 + //evaluate the incident field intensity
  448 + float I0 = 0.0;
  449 + float theta;
  450 + float dTheta = (oAngleO - oAngleI)/numSamples;
  451 + complex<float> Ui;
  452 +
  453 + Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  454 + I0 = Ui.real()*2*pi;
  455 +
  456 + float I;
  457 + SpecPair temp;
  458 + float nu;
  459 + complex<float> eta;
  460 + complex<float> Us, U;
  461 +
  462 +
  463 +
  464 + float vecLen = 0.0;
  465 + for(int i=0; i<EtaK.size(); i++)
  466 + {
  467 + //compute information based on wavelength and material
  468 + nu = EtaK[i].nu;
  469 + lambda = 10000.0f/nu;
  470 + if(applyMaterial)
  471 + eta = complex<float>(EtaN[i].A, EtaK[i].A);
  472 + else
  473 + eta = complex<float>(baseIR, 0.0);
  474 +
  475 + //allocate memory for the scattering coefficients
  476 + complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>)*Nl);
  477 +
  478 + complex<double> IR(eta.real(), eta.imag());
  479 + computeB(B, radius, IR, lambda, Nl);
  480 +
  481 +
  482 + //integrate the scattered field at the detector position
  483 + I = 0.0;
  484 +
  485 + for(int iTheta = 0; iTheta < numSamples; iTheta++)
  486 + {
  487 + theta = oAngleI + iTheta * dTheta;
  488 + Us = sampleUs(B, alpha, Nl, radius, cAngleI, cAngleO, theta, 2*pi);
  489 +
  490 +
  491 + //calculate the intensity and add
  492 + if(theta >= cAngleI && theta <= cAngleO)
  493 + U = Us + 2*(float)pi;
  494 + else
  495 + U = Us;
  496 +
  497 + I += (U.real() * U.real() + U.imag() * U.imag()) * sin(theta) * 2 * pi * dTheta;
  498 +
  499 + }
  500 +
  501 + temp.nu = nu;
  502 +
  503 + if(i == 0)
  504 + printf("I: %f I0: %f\n", I, I0);
  505 +
  506 + //set the spectrum value based on the current display type
  507 + if(dispSimType == AbsorbanceSpecType)
  508 + temp.A = -log10(I/I0);
  509 + else
  510 + temp.A = I;
  511 +
  512 + if(dispNormalize)
  513 + vecLen += temp.A * temp.A;
  514 + //temp.A = Us.real();
  515 + SimSpectrum.push_back(temp);
  516 +
  517 + free(B);
  518 + }
  519 + vecLen = sqrt(vecLen);
  520 +
  521 + if(dispNormalize)
  522 + for(int i=0; i<SimSpectrum.size(); i++)
  523 + SimSpectrum[i].A = (SimSpectrum[i].A / vecLen) * dispNormFactor;
  524 +
  525 + free(alpha);
  526 +
  527 + PD.EndTimer(SIMULATE_SPECTRUM);
  528 +}*/
  529 +
  530 +void updateSpectrum(float* I, float I0, int n)
  531 +{
  532 + SimSpectrum.clear();
  533 + SpecPair temp;
  534 +
  535 + //update the displayed spectrum based on the computed intensity I
  536 + for(int i=0; i<n; i++)
  537 + {
  538 + temp.nu = EtaK[i].nu;
  539 +
  540 + //set the spectrum value based on the current display type
  541 + if(dispSimType == AbsorbanceSpecType)
  542 + temp.A = -log10(I[i]/I0);
  543 + else
  544 + temp.A = I[i];
  545 +
  546 + SimSpectrum.push_back(temp);
  547 + }
  548 +}
  549 +
  550 +void computeCassegrainAngles(float& cAngleI, float& cAngleO, float& oAngleI, float& oAngleO)
  551 +{
  552 + //compute the angles based on NA
  553 + cAngleI = asin(cNAi);
  554 + cAngleO = asin(cNAo);
  555 + oAngleI = asin(oNAi);
  556 + oAngleO = asin(oNAo);
  557 +
  558 + //implement a reflection-mode system if necessary
  559 + if(opticsMode == ReflectionOpticsType){
  560 +
  561 + //set the condenser to match the objective
  562 + cAngleI = oAngleI;
  563 + cAngleO = oAngleO;
  564 +
  565 + //invert the objective
  566 + oAngleO = pi - cAngleI;
  567 + oAngleI = pi - cAngleO;
  568 + }
  569 +
  570 +
  571 +}
  572 +
  573 +int computeNl()
  574 +{
  575 + float maxNu = EtaK.back().nu;
  576 + float maxLambda = 10000.0f/maxNu;
  577 + float k = 2*pi/maxLambda;
  578 + int Nl = ceil( k + 4 * exp(log(k*radius)/3) + 3 );
  579 +
  580 + return Nl;
  581 +}
  582 +
  583 +void computeBArray(complex<float>* B, int Nl, int nLambda)
  584 +{
  585 + float nu;
  586 + complex<float> eta;
  587 + float* Lambda = (float*)malloc(sizeof(float) * nLambda);
  588 +
  589 + //for each wavenumber nu
  590 + for(int i=0; i<EtaK.size(); i++)
  591 + {
  592 + //compute information based on wavelength and material
  593 + nu = EtaK[i].nu;
  594 + Lambda[i] = 10000.0f/nu;
  595 + if(applyMaterial)
  596 + eta = complex<float>(EtaN[i].A, EtaK[i].A);
  597 + else
  598 + eta = complex<float>(baseIR, 0.0);
  599 +
  600 + //allocate memory for the scattering coefficients
  601 + //complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>)*Nl);
  602 +
  603 + complex<double> IR(eta.real(), eta.imag());
  604 + computeB(&B[i * Nl], radius, IR, Lambda[i], Nl);
  605 + }
  606 +}
  607 +
  608 +void computeOpticalParameters(float& cAngleI, float& cAngleO, float& oAngleI, float& oAngleO, float& I0, float* alpha, int Nl)
  609 +{
  610 + computeCassegrainAngles(cAngleI, cAngleO, oAngleI, oAngleO);
  611 +
  612 + //evaluate the incident field intensity
  613 + I0 = 0.0;
  614 + float theta;
  615 + complex<float> Ui;
  616 +
  617 + Ui = integrateUi(cAngleI, cAngleO, oAngleI, oAngleO, 2*pi);
  618 + I0 = Ui.real()*2*pi;
  619 +
  620 + //compute alpha (condenser integral)
  621 + computeCondenserAlpha(alpha, Nl, cAngleI, cAngleO);
  622 +}
  623 +
  624 +void gpuDetectorSpectrum(int numSamples)
  625 +{
  626 + //integrate across the objective aperature and calculate the resulting intensity on a detector
  627 + PD.StartTimer(SIMULATE_SPECTRUM);
  628 + //clear the previous spectrum
  629 + SimSpectrum.clear();
  630 +
  631 + //compute Nl (maximum order of the spectrum)
  632 + int Nl = computeNl();
  633 +
  634 + float* alpha = (float*)malloc(sizeof(float)*(Nl + 1));
  635 + float cAngleI, cAngleO, oAngleI, oAngleO, I0;
  636 + computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl);
  637 +
  638 + //allocate space for a list of wavelengths
  639 + int nLambda = EtaK.size();
  640 +
  641 + //allocate space for the 2D array (Nl x nu) of scattering coefficients
  642 + complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>) * Nl * nLambda);
  643 + computeBArray(B, Nl, nLambda);
  644 +
  645 +
  646 + //allocate temporary space for the spectrum
  647 + float* I = (float*)malloc(sizeof(float) * EtaK.size());
  648 +
  649 + //compute the spectrum on the GPU
  650 + PD.StartTimer(SIMULATE_GPU);
  651 + cudaComputeSpectrum(I, (float*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, numSamples);
  652 + PD.EndTimer(SIMULATE_GPU);
  653 +
  654 + updateSpectrum(I, I0, nLambda);
  655 +
  656 + PD.EndTimer(SIMULATE_SPECTRUM);
  657 +
  658 +}
  659 +
  660 +void SimulateSpectrum()
  661 +{
  662 + if(pointDetector)
  663 + pointSpectrum();
  664 + else
  665 + gpuDetectorSpectrum(objectiveSamples);
  666 + //detectorSpectrum(objectiveSamples);
  667 +}
  668 +
  669 +float absorbanceDistortion(){
  670 +
  671 + //compute the mean of the spectrum
  672 + float sumSim = 0.0;
  673 + for(int i=0; i<SimSpectrum.size(); i++)
  674 + {
  675 + sumSim += SimSpectrum[i].A;
  676 + }
  677 + float meanSim = sumSim/SimSpectrum.size();
  678 +
  679 + //compute the distortion (MSE from the mean)
  680 + float sumSE = 0.0;
  681 + for(int i=0; i<SimSpectrum.size(); i++)
  682 + {
  683 + sumSE += pow(SimSpectrum[i].A - meanSim, 2);
  684 + }
  685 + float MSE = sumSE / SimSpectrum.size();
  686 +
  687 + return MSE;
  688 +}
  689 +
  690 +float intensityDistortion(){
  691 +
  692 + //compute the magnitude of the spectrum
  693 + float sumSim = 0.0;
  694 + for(int i=0; i<SimSpectrum.size(); i++)
  695 + {
  696 + sumSim += SimSpectrum[i].A * SimSpectrum[i].A;
  697 + }
  698 + float magSim = sqrt(sumSim);
  699 +
  700 + //compute the distortion (MSE from the mean)
  701 + float sumSE = 0.0;
  702 + for(int i=0; i<SimSpectrum.size(); i++)
  703 + {
  704 + sumSE += (SimSpectrum[i].A/magSim) * (1.0/SimSpectrum.size());
  705 + }
  706 + float MSE = sumSE;
  707 +
  708 + return MSE;
  709 +}
  710 +
  711 +void MinimizeDistortion(){
  712 + ofstream outFile("distortion.txt");
  713 +
  714 + //set the parameters for the distortion simulation
  715 + float step = 0.001;
  716 +
  717 + oNAi = 0.2;
  718 + oNAo = 0.5;
  719 +
  720 + //compute the optical parameters
  721 + //compute Nl (maximum order of the spectrum)
  722 + int Nl = computeNl();
  723 +
  724 + float* alpha = (float*)malloc(sizeof(float)*(Nl + 1));
  725 + float cAngleI, cAngleO, oAngleI, oAngleO, I0;
  726 +
  727 + //allocate space for a list of wavelengths
  728 + int nLambda = EtaK.size();
  729 +
  730 + //allocate temporary space for the spectrum
  731 + float* I = (float*)malloc(sizeof(float) * EtaK.size());
  732 +
  733 + //calculate the material parameters
  734 + //allocate space for the 2D array (Nl x nu) of scattering coefficients
  735 + complex<float>* B = (complex<float>*)malloc(sizeof(complex<float>) * Nl * nLambda);
  736 + computeBArray(B, Nl, nLambda);
  737 +
  738 +
  739 +
  740 + float D;
  741 + float e = 0.001;
  742 + for(float i=0.0; i<=oNAo-step; i+=step)
  743 + {
  744 +
  745 + for(float o=oNAi+step; o<=1.0; o+=step)
  746 + {
  747 +
  748 +
  749 + //set the current optical parameters
  750 + cNAi = i;
  751 + cNAo = o;
  752 +
  753 + //compute the optical parameters
  754 + computeOpticalParameters(cAngleI, cAngleO, oAngleI, oAngleO, I0, alpha, Nl);
  755 +
  756 + //simulate the spectrum
  757 + cudaComputeSpectrum(I, (float*)B, alpha, Nl, nLambda, oAngleI, oAngleO, cAngleI, cAngleO, objectiveSamples);
  758 + updateSpectrum(I, I0, nLambda);
  759 +
  760 + if(dispSimType == AbsorbanceSpecType)
  761 + {
  762 + if(i + e >= o || i + e >= oNAo || oNAi + e >= o || oNAi + e >= oNAo)
  763 + D = 0.0;
  764 + else
  765 + D = absorbanceDistortion();
  766 + }
  767 + else
  768 + {
  769 + if(i >= o || oNAi >= oNAo)
  770 + D=0;
  771 + else
  772 + D = intensityDistortion();
  773 + }
  774 + outFile<<D<<" ";
  775 + }
  776 + outFile<<endl;
  777 + cout<<i<<endl;
  778 + }
  779 + outFile.close();
  780 +}
0 781 \ No newline at end of file
... ...
cudaKK.h 0 โ†’ 100644
  1 +++ a/cudaKK.h
  1 +__device__ float g(float v0, float v1)
  2 +{
  3 + return (v0 + v1)*log(abs(v0+v1)) + (v0-v1)*log(abs(v0-v1));
  4 +}
  5 +
  6 +__device__ float hfin(float v0, float v1, float dv)
  7 +{
  8 + float e = 0.001;
  9 + float t0 = g(v0+e, v1-dv)/dv;
  10 + float t1 = 2*g(v0+e, v1)/dv;
  11 + float t2 = g(v0+e, v1+dv)/dv;
  12 +
  13 + return -1.0/PI * (t0 - t1 + t2);
  14 +}
  15 +
  16 +__global__ void devKramersKronig(float* gpuN, float* gpuK, int numVals, float nuStart, float nuEnd, float nOffset)
  17 +{
  18 + int i = blockIdx.x * blockDim.x + threadIdx.x;
  19 +
  20 + if(i >= numVals) return;
  21 + float nuDelta = (nuEnd - nuStart)/(numVals - 1);
  22 +
  23 + float nu = nuStart + i*nuDelta;
  24 + float n = 0.0;
  25 + float jNu;
  26 + float 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(float* cpuN, float* cpuK, int nVals, float nuStart, float nuEnd, float nOffset)
  39 +{
  40 + float* gpuK;
  41 + HANDLE_ERROR(cudaMalloc(&gpuK, sizeof(float)*nVals));
  42 + HANDLE_ERROR(cudaMemcpy(gpuK, cpuK, sizeof(float)*nVals, cudaMemcpyHostToDevice));
  43 + float* gpuN;
  44 + HANDLE_ERROR(cudaMalloc(&gpuN, sizeof(float)*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(float)*nVals, cudaMemcpyDeviceToHost));
  51 +
  52 + //free resources
  53 + HANDLE_ERROR(cudaFree(gpuK));
  54 + HANDLE_ERROR(cudaFree(gpuN));
  55 +}
  56 +
  57 +__global__ void devComputeSpectrum(float* I, float2* B, float* alpha, int Nl,
  58 + int nSamples, float oThetaI, float oThetaO, float cThetaI, float cThetaO)
  59 +{
  60 + int i = blockIdx.x * blockDim.x + threadIdx.x;
  61 +
  62 + //compute the delta-theta value
  63 + float dTheta = (oThetaO - oThetaI)/nSamples;
  64 +
  65 + //allocate space for the Legendre polynomials
  66 + float Ptheta[2];
  67 +
  68 + float cosTheta, theta;
  69 + cuComplex Us;
  70 + cuComplex UsSample;
  71 + cuComplex U;
  72 + cuComplex Ui;
  73 + Ui.x = 2*PI;
  74 + Ui.y = 0.0;
  75 + cuComplex numer;
  76 + numer.x = 0.0;
  77 + cuComplex exp_numer;
  78 + cuComplex iL;
  79 + cuComplex imag;
  80 + imag.x = 0.0; imag.y = 1.0;
  81 + float realFac;
  82 + cuComplex complexFac;
  83 + float PlTheta;
  84 + float 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 + //val = cMag(Us);
  135 + //if(val > maxVal)
  136 + // maxVal = val;
  137 +
  138 + //Us += B[l] * exp(numer) * Ptheta[l] * alpha * M * pow(complex<float>(0.0, 1.0), l);
  139 +
  140 + }
  141 +
  142 + //sum the scattered and incident fields
  143 + if(theta >= cThetaI && theta <= cThetaO)
  144 + U = cAdd(Us, 2*PI);
  145 + else
  146 + U = Us;
  147 + Isum += (U.x*U.x + U.y*U.y) * sin(theta) * 2 * PI * dTheta;
  148 + }
  149 +
  150 + I[i] = Isum;
  151 +}
  152 +
  153 +void cudaComputeSpectrum(float* cpuI, float* cpuB, float* cpuAlpha,
  154 + int Nl, int nLambda, float oThetaI, float oThetaO, float cThetaI, float cThetaO, int nSamples)
  155 +{
  156 + //copy everything to the GPU
  157 + float2* gpuB;
  158 + HANDLE_ERROR(cudaMalloc(&gpuB, sizeof(float2) * nLambda * Nl));
  159 + HANDLE_ERROR(cudaMemcpy(gpuB, cpuB, sizeof(float2) * nLambda * Nl, cudaMemcpyHostToDevice));
  160 +
  161 + float* gpuAlpha;
  162 + HANDLE_ERROR(cudaMalloc(&gpuAlpha, sizeof(float) * Nl));
  163 + HANDLE_ERROR(cudaMemcpy(gpuAlpha, cpuAlpha, sizeof(float) * Nl, cudaMemcpyHostToDevice));
  164 +
  165 + float* gpuI;
  166 + HANDLE_ERROR(cudaMalloc(&gpuI, sizeof(float) * nLambda));
  167 +
  168 +
  169 + //call the kernel to compute the spectrum
  170 + dim3 block(BLOCK_SIZE*BLOCK_SIZE);
  171 + dim3 grid(nLambda/block.x + 1);
  172 +
  173 + //devComputeSpectrum
  174 + devComputeSpectrum<<<grid, block>>>(gpuI, (float2*)gpuB, gpuAlpha, Nl,
  175 + nSamples, oThetaI, oThetaO, cThetaI, cThetaO);
  176 +
  177 + HANDLE_ERROR(cudaMemcpy(cpuI, gpuI, sizeof(float) * nLambda, cudaMemcpyDeviceToHost));
  178 +
  179 + HANDLE_ERROR(cudaFree(gpuB));
  180 + HANDLE_ERROR(cudaFree(gpuAlpha));
  181 + HANDLE_ERROR(cudaFree(gpuI));
  182 +
  183 +
  184 +
  185 +
  186 +}
0 187 \ No newline at end of file
... ...
cudaMain.cu 0 โ†’ 100644
  1 +++ a/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__ cuComplex cMult(cuComplex a, cuComplex b)
  9 +{
  10 + cuComplex 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__ cuComplex cMult(cuComplex a, float b)
  18 +{
  19 + cuComplex result;
  20 + result.x = a.x * b;
  21 + result.y = a.y * b;
  22 +
  23 + return result;
  24 +}
  25 +
  26 +__device__ cuComplex cAdd(cuComplex a, cuComplex b)
  27 +{
  28 + cuComplex r;
  29 + r.x = a.x + b.x;
  30 + r.y = a.y + b.y;
  31 +
  32 + return r;
  33 +}
  34 +
  35 +__device__ cuComplex cAdd(cuComplex a, float b)
  36 +{
  37 + cuComplex r;
  38 + r.x = a.x + b;
  39 + r.y = a.y;
  40 +
  41 + return r;
  42 +}
  43 +
  44 +__device__ cuComplex cExp(cuComplex a)
  45 +{
  46 + cuComplex 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__ float cMag(cuComplex a)
  55 +{
  56 + float r = sqrt(a.x * a.x + a.y * a.y);
  57 + return r;
  58 +}
  59 +
  60 +#include "cudaKK.h"
  61 +
... ...
eta_TolueneK.txt 0 โ†’ 100644
  1 +++ a/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
  1601 +4000 0.000231947733021415
0 1602 \ No newline at end of file
... ...
eta_TolueneN.txt 0 โ†’ 100644
  1 +++ a/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
  1601 +4000 1.47617133599432
0 1602 \ No newline at end of file
... ...
globals.h 0 โ†’ 100644
  1 +++ a/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 +struct SpecPair{
  12 + float nu;
  13 + float A;
  14 +};
  15 +
  16 +struct Material{
  17 + vector<float> nu;
  18 + vector<complex<float>> eta;
  19 + string name;
  20 +};
  21 +
  22 +enum SpecType {AbsorbanceSpecType, IntensitySpecType};
  23 +enum OpticsType {TransmissionOpticsType, ReflectionOpticsType};
  24 +
  25 +extern PerformanceData PD;
  26 +
  27 +
  28 +extern vector<vector<SpecPair>> RefSpectrum;
  29 +extern int currentSpec;
  30 +extern vector<SpecPair> SimSpectrum;
  31 +
  32 +//IO Functions
  33 +vector<SpecPair> LoadSpectrum(string filename);
  34 +vector<SpecPair> SetReferenceSpectrum(char* text);
  35 +void SaveState();
  36 +void LoadState();
  37 +void SetDefaults();
  38 +void SaveSimulation(string fileName);
  39 +void SaveK(string fileName);
  40 +void SaveN(string fileName);
  41 +void LoadMaterial(string fileNameK, string fileNameN, string materialName);
  42 +void LoadMaterial(string fileNameK, string materialName);
  43 +
  44 +//Display Functions
  45 +void FitDisplay();
  46 +
  47 +//Update Functions
  48 +void UpdateDisplay();
  49 +void SimulateSpectrum();
  50 +void cudaKramersKronig(float* cpuN, float* cpuK, int nVals, float nuStart, float nuEnd, float nOffset);
  51 +void cudaComputeSpectrum(float* cpuI, float* cpuB, float* alpha,
  52 + int Nl, int nLambda, float oThetaI, float oThetaO, float cThetaI, float cThetaO, int nSamples);
  53 +
  54 +//Window Parameters
  55 +extern float nuMin;
  56 +extern float nuMax;
  57 +extern float aMin;
  58 +extern float aMax;
  59 +extern float dNu;
  60 +extern bool dispRefSpec;
  61 +extern bool dispSimSpec;
  62 +extern bool dispSimK;
  63 +extern bool dispMatK;
  64 +extern bool dispSimN;
  65 +extern bool dispMatN;
  66 +extern SpecType dispSimType;
  67 +extern bool dispNormalize;
  68 +extern float dispNormFactor;
  69 +
  70 +
  71 +extern float dispScaleK;
  72 +extern float dispScaleN;
  73 +
  74 +//material parameters
  75 +extern float radius;
  76 +extern float baseIR;
  77 +extern float cA;
  78 +extern vector<SpecPair> EtaK;
  79 +extern vector<SpecPair> EtaN;
  80 +extern bool applyMaterial;
  81 +//extern vector<SpecPair> KMaterial;
  82 +//extern vector<SpecPair> NMaterial;
  83 +extern vector<Material> MaterialList;
  84 +extern int currentMaterial;
  85 +void ChangeAbsorbance();
  86 +void SetMaterial();
  87 +
  88 +//optical parameters
  89 +extern float cNAi;
  90 +extern float cNAo;
  91 +extern float oNAi;
  92 +extern float oNAo;
  93 +extern OpticsType opticsMode;
  94 +extern bool pointDetector;
  95 +extern int objectiveSamples;
  96 +
  97 +//fitting parameters
  98 +extern float minMSE;
  99 +extern int maxFitIter;
  100 +void EstimateMaterial();
  101 +extern float scaleI0;
  102 +extern float refSlope;
  103 +
  104 +float ComputeDistortion();
  105 +void MinimizeDistortion();
  106 +
  107 +
  108 +#endif
0 109 \ No newline at end of file
... ...
interactivemie.cpp 0 โ†’ 100644
  1 +++ a/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 +}
... ...
interactivemie.h 0 โ†’ 100644
  1 +++ a/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(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_clicked(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 + opticsMode = ReflectionOpticsType;
  218 + SimulateSpectrum();
  219 + UpdateDisplay();
  220 + }
  221 + void on_chkPointDetector_clicked(bool b){
  222 + if(b)
  223 + {
  224 + pointDetector = true;
  225 + ui.spinObjectiveSamples->setEnabled(false);
  226 + }
  227 + else
  228 + {
  229 + pointDetector = false;
  230 + ui.spinObjectiveSamples->setEnabled(true);
  231 + }
  232 +
  233 + SimulateSpectrum();
  234 + UpdateDisplay();
  235 + }
  236 +
  237 + void on_spinObjectiveSamples_valueChanged(int i){
  238 + objectiveSamples = i;
  239 + SimulateSpectrum();
  240 + UpdateDisplay();
  241 + }
  242 +
  243 + //Fitting
  244 + void on_spinMaxIter_valueChanged(int i){
  245 + maxFitIter = i;
  246 + }
  247 + void on_spinError_valueChanged(double d){
  248 + minMSE = d;
  249 + }
  250 + void on_spinI0Scale_valueChanged(double d){
  251 + scaleI0 = d;
  252 + SimulateSpectrum();
  253 + UpdateDisplay();
  254 + }
  255 + void on_spinRefSlope_valueChanged(double d){
  256 + refSlope = d;
  257 + UpdateDisplay();
  258 + }
  259 +
  260 + //display settings
  261 +
  262 + //Buttons
  263 + void on_btnFit_clicked(){
  264 + FitDisplay();
  265 + refreshUI();
  266 + }
  267 + void on_btnSave_clicked(){
  268 + SaveState();
  269 + }
  270 + void on_btnReset_clicked(){
  271 + SetDefaults();
  272 + SimulateSpectrum();
  273 + UpdateDisplay();
  274 + refreshUI();
  275 + }
  276 + void on_btnResetK_clicked(){
  277 + ChangeAbsorbance();
  278 + SimulateSpectrum();
  279 + UpdateDisplay();
  280 + }
  281 + void on_btnEstimateK_clicked(){
  282 + EstimateMaterial();
  283 + SimulateSpectrum();
  284 + UpdateDisplay();
  285 + }
  286 + void on_btnDistortion_clicked(){
  287 + //ComputeDistortion();
  288 + MinimizeDistortion();
  289 + }
  290 + void on_btnTimings_clicked(){
  291 + PD.PrintResults(cout);
  292 + }
  293 +
  294 + //menu items
  295 + void on_mnuLoadReference_triggered(){
  296 + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Reference Spectrum"));
  297 +
  298 + if(fileName != QString::null){
  299 + RefSpectrum.clear();
  300 + RefSpectrum.push_back(LoadSpectrum(fileName.toAscii().data()));
  301 + }
  302 + UpdateDisplay();
  303 + }
  304 +
  305 + void on_mnuLoadMaterial_triggered(){
  306 +
  307 + //first load the imaginary part
  308 + QString kFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (k) Spectrum"));
  309 +
  310 + //exit if no file was selected
  311 + if(kFileName == QString::null)
  312 + return;
  313 +
  314 + QString nFileName = QFileDialog::getOpenFileName(this, tr("Open Imaginary (n) Spectrum"));
  315 +
  316 + //request the material name
  317 + QString matName = QInputDialog::getText(this, tr("Material Name"), tr("Enter material name:"));
  318 +
  319 + //if a real part was given, load both
  320 + if(nFileName != QString::null)
  321 + LoadMaterial(kFileName.toAscii().data(), nFileName.toAscii().data(), matName.toAscii().data());
  322 + else
  323 + LoadMaterial(kFileName.toAscii().data(), matName.toAscii().data());
  324 +
  325 + //add the new material to the combo box
  326 + refreshUI();
  327 + }
  328 +
  329 + void on_mnuSaveSim_triggered(){
  330 + //first load the imaginary part
  331 + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Simulated Spectrum"));
  332 + SaveSimulation(fileName.toAscii().data());
  333 + }
  334 +
  335 + void on_mnuSaveK_triggered(){
  336 + //first load the imaginary part
  337 + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Imaginary Index of Refraction (k)"));
  338 + SaveK(fileName.toAscii().data());
  339 + }
  340 +
  341 + void on_mnuSaveN_triggered(){
  342 + //first load the imaginary part
  343 + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Real Index of Refraction (n)"));
  344 + SaveN(fileName.toAscii().data());
  345 + }
  346 +
  347 +
  348 +
  349 +};
  350 +
  351 +#endif // INTERACTIVEMIE_H
... ...
interactivemie.qrc 0 โ†’ 100644
  1 +++ a/interactivemie.qrc
  1 +<RCC>
  2 + <qresource prefix="InteractiveMie">
  3 + </qresource>
  4 +</RCC>
... ...
interactivemie.ui 0 โ†’ 100644
  1 +++ a/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="minimum">
  354 + <double>-9999.000000000000000</double>
  355 + </property>
  356 + <property name="maximum">
  357 + <double>3.000000000000000</double>
  358 + </property>
  359 + <property name="singleStep">
  360 + <double>0.100000000000000</double>
  361 + </property>
  362 + </widget>
  363 + <widget class="QSpinBox" name="spinNuMin">
  364 + <property name="enabled">
  365 + <bool>false</bool>
  366 + </property>
  367 + <property name="geometry">
  368 + <rect>
  369 + <x>10</x>
  370 + <y>70</y>
  371 + <width>61</width>
  372 + <height>22</height>
  373 + </rect>
  374 + </property>
  375 + <property name="maximum">
  376 + <number>4000</number>
  377 + </property>
  378 + <property name="singleStep">
  379 + <number>10</number>
  380 + </property>
  381 + <property name="value">
  382 + <number>800</number>
  383 + </property>
  384 + </widget>
  385 + <widget class="QLabel" name="label_2">
  386 + <property name="geometry">
  387 + <rect>
  388 + <x>110</x>
  389 + <y>20</y>
  390 + <width>16</width>
  391 + <height>16</height>
  392 + </rect>
  393 + </property>
  394 + <property name="text">
  395 + <string>A</string>
  396 + </property>
  397 + </widget>
  398 + <widget class="QDoubleSpinBox" name="spinAMax">
  399 + <property name="geometry">
  400 + <rect>
  401 + <x>80</x>
  402 + <y>40</y>
  403 + <width>71</width>
  404 + <height>22</height>
  405 + </rect>
  406 + </property>
  407 + <property name="minimum">
  408 + <double>-9999.000000000000000</double>
  409 + </property>
  410 + <property name="maximum">
  411 + <double>9999.000000000000000</double>
  412 + </property>
  413 + <property name="singleStep">
  414 + <double>0.100000000000000</double>
  415 + </property>
  416 + <property name="value">
  417 + <double>1.000000000000000</double>
  418 + </property>
  419 + </widget>
  420 + <widget class="QSpinBox" name="spinNuMax">
  421 + <property name="enabled">
  422 + <bool>false</bool>
  423 + </property>
  424 + <property name="geometry">
  425 + <rect>
  426 + <x>10</x>
  427 + <y>40</y>
  428 + <width>61</width>
  429 + <height>22</height>
  430 + </rect>
  431 + </property>
  432 + <property name="maximum">
  433 + <number>4000</number>
  434 + </property>
  435 + <property name="singleStep">
  436 + <number>10</number>
  437 + </property>
  438 + <property name="value">
  439 + <number>4000</number>
  440 + </property>
  441 + </widget>
  442 + <widget class="QLabel" name="label">
  443 + <property name="geometry">
  444 + <rect>
  445 + <x>20</x>
  446 + <y>20</y>
  447 + <width>61</width>
  448 + <height>16</height>
  449 + </rect>
  450 + </property>
  451 + <property name="text">
  452 + <string>nu (cm^-1)</string>
  453 + </property>
  454 + </widget>
  455 + <widget class="QCheckBox" name="chkDisplayRefSpec">
  456 + <property name="geometry">
  457 + <rect>
  458 + <x>10</x>
  459 + <y>230</y>
  460 + <width>131</width>
  461 + <height>17</height>
  462 + </rect>
  463 + </property>
  464 + <property name="text">
  465 + <string>Reference Spectrum</string>
  466 + </property>
  467 + <property name="checked">
  468 + <bool>true</bool>
  469 + </property>
  470 + </widget>
  471 + <widget class="QCheckBox" name="chkDisplaySimSpec">
  472 + <property name="geometry">
  473 + <rect>
  474 + <x>10</x>
  475 + <y>170</y>
  476 + <width>131</width>
  477 + <height>17</height>
  478 + </rect>
  479 + </property>
  480 + <property name="text">
  481 + <string>Simulated Spectrum</string>
  482 + </property>
  483 + <property name="checked">
  484 + <bool>true</bool>
  485 + </property>
  486 + </widget>
  487 + <widget class="QCheckBox" name="chkDisplaySimK">
  488 + <property name="geometry">
  489 + <rect>
  490 + <x>10</x>
  491 + <y>280</y>
  492 + <width>131</width>
  493 + <height>17</height>
  494 + </rect>
  495 + </property>
  496 + <property name="text">
  497 + <string>Simulated K</string>
  498 + </property>
  499 + <property name="checked">
  500 + <bool>false</bool>
  501 + </property>
  502 + </widget>
  503 + <widget class="QDoubleSpinBox" name="spinI0Scale">
  504 + <property name="geometry">
  505 + <rect>
  506 + <x>80</x>
  507 + <y>100</y>
  508 + <width>71</width>
  509 + <height>22</height>
  510 + </rect>
  511 + </property>
  512 + <property name="minimum">
  513 + <double>-99.989999999999995</double>
  514 + </property>
  515 + <property name="singleStep">
  516 + <double>0.010000000000000</double>
  517 + </property>
  518 + </widget>
  519 + <widget class="QLabel" name="label_10">
  520 + <property name="geometry">
  521 + <rect>
  522 + <x>10</x>
  523 + <y>100</y>
  524 + <width>71</width>
  525 + <height>16</height>
  526 + </rect>
  527 + </property>
  528 + <property name="text">
  529 + <string>I0 Scale</string>
  530 + </property>
  531 + </widget>
  532 + <widget class="QDoubleSpinBox" name="spinRefSlope">
  533 + <property name="enabled">
  534 + <bool>false</bool>
  535 + </property>
  536 + <property name="geometry">
  537 + <rect>
  538 + <x>80</x>
  539 + <y>130</y>
  540 + <width>71</width>
  541 + <height>22</height>
  542 + </rect>
  543 + </property>
  544 + <property name="decimals">
  545 + <number>6</number>
  546 + </property>
  547 + <property name="minimum">
  548 + <double>-99.989999999999995</double>
  549 + </property>
  550 + <property name="singleStep">
  551 + <double>0.000010000000000</double>
  552 + </property>
  553 + </widget>
  554 + <widget class="QLabel" name="label_11">
  555 + <property name="geometry">
  556 + <rect>
  557 + <x>10</x>
  558 + <y>130</y>
  559 + <width>71</width>
  560 + <height>16</height>
  561 + </rect>
  562 + </property>
  563 + <property name="text">
  564 + <string>Ref Slope</string>
  565 + </property>
  566 + </widget>
  567 + <widget class="QCheckBox" name="chkDisplayMatK">
  568 + <property name="geometry">
  569 + <rect>
  570 + <x>10</x>
  571 + <y>300</y>
  572 + <width>91</width>
  573 + <height>17</height>
  574 + </rect>
  575 + </property>
  576 + <property name="text">
  577 + <string>Material K</string>
  578 + </property>
  579 + </widget>
  580 + <widget class="QCheckBox" name="chkDisplaySimN">
  581 + <property name="geometry">
  582 + <rect>
  583 + <x>10</x>
  584 + <y>330</y>
  585 + <width>131</width>
  586 + <height>17</height>
  587 + </rect>
  588 + </property>
  589 + <property name="text">
  590 + <string>Simulated N</string>
  591 + </property>
  592 + <property name="checked">
  593 + <bool>false</bool>
  594 + </property>
  595 + </widget>
  596 + <widget class="QCheckBox" name="chkDisplayMatN">
  597 + <property name="geometry">
  598 + <rect>
  599 + <x>10</x>
  600 + <y>350</y>
  601 + <width>91</width>
  602 + <height>17</height>
  603 + </rect>
  604 + </property>
  605 + <property name="text">
  606 + <string>Material N</string>
  607 + </property>
  608 + </widget>
  609 + <widget class="QDoubleSpinBox" name="spinDispScaleK">
  610 + <property name="geometry">
  611 + <rect>
  612 + <x>90</x>
  613 + <y>290</y>
  614 + <width>51</width>
  615 + <height>22</height>
  616 + </rect>
  617 + </property>
  618 + <property name="singleStep">
  619 + <double>0.100000000000000</double>
  620 + </property>
  621 + </widget>
  622 + <widget class="QDoubleSpinBox" name="spinDispScaleN">
  623 + <property name="geometry">
  624 + <rect>
  625 + <x>90</x>
  626 + <y>340</y>
  627 + <width>51</width>
  628 + <height>22</height>
  629 + </rect>
  630 + </property>
  631 + <property name="singleStep">
  632 + <double>0.100000000000000</double>
  633 + </property>
  634 + </widget>
  635 + <widget class="QCheckBox" name="chkNormalize">
  636 + <property name="geometry">
  637 + <rect>
  638 + <x>10</x>
  639 + <y>380</y>
  640 + <width>70</width>
  641 + <height>17</height>
  642 + </rect>
  643 + </property>
  644 + <property name="text">
  645 + <string>Normalize</string>
  646 + </property>
  647 + </widget>
  648 + <widget class="QRadioButton" name="radDisplayAbsorbance">
  649 + <property name="geometry">
  650 + <rect>
  651 + <x>50</x>
  652 + <y>190</y>
  653 + <width>82</width>
  654 + <height>17</height>
  655 + </rect>
  656 + </property>
  657 + <property name="text">
  658 + <string>Absorbance</string>
  659 + </property>
  660 + <property name="checked">
  661 + <bool>true</bool>
  662 + </property>
  663 + </widget>
  664 + <widget class="QRadioButton" name="radDisplayIntensity">
  665 + <property name="geometry">
  666 + <rect>
  667 + <x>50</x>
  668 + <y>210</y>
  669 + <width>82</width>
  670 + <height>17</height>
  671 + </rect>
  672 + </property>
  673 + <property name="text">
  674 + <string>Intensity</string>
  675 + </property>
  676 + </widget>
  677 + <widget class="QDoubleSpinBox" name="spinNormFactor">
  678 + <property name="geometry">
  679 + <rect>
  680 + <x>90</x>
  681 + <y>380</y>
  682 + <width>62</width>
  683 + <height>22</height>
  684 + </rect>
  685 + </property>
  686 + <property name="singleStep">
  687 + <double>1.000000000000000</double>
  688 + </property>
  689 + <property name="value">
  690 + <double>1.000000000000000</double>
  691 + </property>
  692 + </widget>
  693 + </widget>
  694 + <widget class="QPushButton" name="btnFit">
  695 + <property name="geometry">
  696 + <rect>
  697 + <x>180</x>
  698 + <y>150</y>
  699 + <width>75</width>
  700 + <height>23</height>
  701 + </rect>
  702 + </property>
  703 + <property name="text">
  704 + <string>Fit</string>
  705 + </property>
  706 + </widget>
  707 + <widget class="QPushButton" name="btnSave">
  708 + <property name="geometry">
  709 + <rect>
  710 + <x>180</x>
  711 + <y>180</y>
  712 + <width>75</width>
  713 + <height>23</height>
  714 + </rect>
  715 + </property>
  716 + <property name="text">
  717 + <string>Save</string>
  718 + </property>
  719 + </widget>
  720 + <widget class="QPushButton" name="btnReset">
  721 + <property name="geometry">
  722 + <rect>
  723 + <x>180</x>
  724 + <y>210</y>
  725 + <width>75</width>
  726 + <height>23</height>
  727 + </rect>
  728 + </property>
  729 + <property name="text">
  730 + <string>Reset</string>
  731 + </property>
  732 + </widget>
  733 + <widget class="QPushButton" name="btnDistortion">
  734 + <property name="enabled">
  735 + <bool>true</bool>
  736 + </property>
  737 + <property name="geometry">
  738 + <rect>
  739 + <x>180</x>
  740 + <y>240</y>
  741 + <width>75</width>
  742 + <height>23</height>
  743 + </rect>
  744 + </property>
  745 + <property name="text">
  746 + <string>Distortion</string>
  747 + </property>
  748 + </widget>
  749 + <widget class="QPushButton" name="btnTimings">
  750 + <property name="geometry">
  751 + <rect>
  752 + <x>180</x>
  753 + <y>270</y>
  754 + <width>75</width>
  755 + <height>23</height>
  756 + </rect>
  757 + </property>
  758 + <property name="text">
  759 + <string>Timings</string>
  760 + </property>
  761 + </widget>
  762 + <widget class="QGroupBox" name="groupBox_4">
  763 + <property name="geometry">
  764 + <rect>
  765 + <x>20</x>
  766 + <y>320</y>
  767 + <width>201</width>
  768 + <height>111</height>
  769 + </rect>
  770 + </property>
  771 + <property name="title">
  772 + <string>Fit Material</string>
  773 + </property>
  774 + <widget class="QSpinBox" name="spinMaxIter">
  775 + <property name="geometry">
  776 + <rect>
  777 + <x>110</x>
  778 + <y>70</y>
  779 + <width>61</width>
  780 + <height>22</height>
  781 + </rect>
  782 + </property>
  783 + <property name="maximum">
  784 + <number>9999</number>
  785 + </property>
  786 + <property name="value">
  787 + <number>20</number>
  788 + </property>
  789 + </widget>
  790 + <widget class="QLabel" name="label_3">
  791 + <property name="geometry">
  792 + <rect>
  793 + <x>40</x>
  794 + <y>50</y>
  795 + <width>46</width>
  796 + <height>13</height>
  797 + </rect>
  798 + </property>
  799 + <property name="text">
  800 + <string>Error</string>
  801 + </property>
  802 + </widget>
  803 + <widget class="QDoubleSpinBox" name="spinError">
  804 + <property name="geometry">
  805 + <rect>
  806 + <x>20</x>
  807 + <y>70</y>
  808 + <width>71</width>
  809 + <height>22</height>
  810 + </rect>
  811 + </property>
  812 + <property name="decimals">
  813 + <number>7</number>
  814 + </property>
  815 + <property name="maximum">
  816 + <double>0.100000000000000</double>
  817 + </property>
  818 + <property name="singleStep">
  819 + <double>0.000100000000000</double>
  820 + </property>
  821 + <property name="value">
  822 + <double>0.000100000000000</double>
  823 + </property>
  824 + </widget>
  825 + <widget class="QPushButton" name="btnEstimateK">
  826 + <property name="geometry">
  827 + <rect>
  828 + <x>20</x>
  829 + <y>20</y>
  830 + <width>75</width>
  831 + <height>23</height>
  832 + </rect>
  833 + </property>
  834 + <property name="text">
  835 + <string>Estimate K</string>
  836 + </property>
  837 + </widget>
  838 + <widget class="QPushButton" name="btnResetK">
  839 + <property name="geometry">
  840 + <rect>
  841 + <x>100</x>
  842 + <y>20</y>
  843 + <width>75</width>
  844 + <height>23</height>
  845 + </rect>
  846 + </property>
  847 + <property name="text">
  848 + <string>Reset K</string>
  849 + </property>
  850 + </widget>
  851 + <widget class="QLabel" name="label_5">
  852 + <property name="geometry">
  853 + <rect>
  854 + <x>120</x>
  855 + <y>50</y>
  856 + <width>46</width>
  857 + <height>13</height>
  858 + </rect>
  859 + </property>
  860 + <property name="text">
  861 + <string>Max Iter</string>
  862 + </property>
  863 + </widget>
  864 + </widget>
  865 + </widget>
  866 + <widget class="QMenuBar" name="menuBar">
  867 + <property name="geometry">
  868 + <rect>
  869 + <x>0</x>
  870 + <y>0</y>
  871 + <width>464</width>
  872 + <height>21</height>
  873 + </rect>
  874 + </property>
  875 + <widget class="QMenu" name="menuFile">
  876 + <property name="title">
  877 + <string>Load</string>
  878 + </property>
  879 + <addaction name="mnuLoadReference"/>
  880 + <addaction name="mnuLoadMaterial"/>
  881 + </widget>
  882 + <widget class="QMenu" name="menuSave">
  883 + <property name="title">
  884 + <string>Save</string>
  885 + </property>
  886 + <addaction name="mnuSaveSim"/>
  887 + <addaction name="mnuSaveK"/>
  888 + <addaction name="mnuSaveN"/>
  889 + </widget>
  890 + <widget class="QMenu" name="menuVersion_0_6">
  891 + <property name="title">
  892 + <string>Version 0.6</string>
  893 + </property>
  894 + </widget>
  895 + <addaction name="menuFile"/>
  896 + <addaction name="menuSave"/>
  897 + <addaction name="menuVersion_0_6"/>
  898 + </widget>
  899 + <widget class="QToolBar" name="mainToolBar">
  900 + <attribute name="toolBarArea">
  901 + <enum>TopToolBarArea</enum>
  902 + </attribute>
  903 + <attribute name="toolBarBreak">
  904 + <bool>false</bool>
  905 + </attribute>
  906 + </widget>
  907 + <widget class="QStatusBar" name="statusBar"/>
  908 + <action name="mnuLoadReference">
  909 + <property name="text">
  910 + <string>Load Reference</string>
  911 + </property>
  912 + </action>
  913 + <action name="mnuLoadMaterial">
  914 + <property name="text">
  915 + <string>Load Material</string>
  916 + </property>
  917 + </action>
  918 + <action name="mnuSaveSim">
  919 + <property name="text">
  920 + <string>Simulation</string>
  921 + </property>
  922 + </action>
  923 + <action name="mnuSaveK">
  924 + <property name="text">
  925 + <string>k</string>
  926 + </property>
  927 + </action>
  928 + <action name="mnuSaveN">
  929 + <property name="text">
  930 + <string>n</string>
  931 + </property>
  932 + </action>
  933 + </widget>
  934 + <layoutdefault spacing="6" margin="11"/>
  935 + <resources>
  936 + <include location="interactivemie.qrc"/>
  937 + </resources>
  938 + <connections/>
  939 +</ui>
... ...
kPMMA.txt 0 โ†’ 100644
  1 +++ a/kPMMA.txt
  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 +7000 -5.24841E-05
0 3202 \ No newline at end of file
... ...
main.cpp 0 โ†’ 100644
  1 +++ a/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 +float nuMin = 800;
  23 +float nuMax = 4000;
  24 +float dNu = 2;
  25 +
  26 +float aMin = 0;
  27 +float aMax = 1;
  28 +
  29 +float scaleI0 = 1.0;
  30 +float 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 +float dispScaleK = 1.0;
  39 +float dispScaleN = 1.0;
  40 +SpecType dispSimType = AbsorbanceSpecType;
  41 +bool dispNormalize = false;
  42 +float dispNormFactor = 1.0;
  43 +
  44 +
  45 +//material parameters
  46 +float radius = 4.0f;
  47 +float baseIR = 1.49f;
  48 +float 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 +float cNAi = 0.0;
  57 +float cNAo = 0.6;
  58 +float oNAi = 0.0;
  59 +float oNAo = 0.6;
  60 +OpticsType opticsMode = TransmissionOpticsType;
  61 +bool pointDetector = false;
  62 +int objectiveSamples = 200;
  63 +
  64 +//fitting parameters
  65 +float 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((float)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<float> eta;
  98 + int j;
  99 + for(int i=0; i<KMaterial.size(); i++){
  100 + newMaterial.nu.push_back(KMaterial[i].nu);
  101 + eta = complex<float>(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 + float* k = (float*)malloc(sizeof(float) * KMaterial.size());
  118 + float* n = (float*)malloc(sizeof(float) * KMaterial.size());
  119 + for(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(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<float> eta;
  136 + int j;
  137 + for(int i=0; i<KMaterial.size(); i++){
  138 + newMaterial.nu.push_back(KMaterial[i].nu);
  139 + eta = complex<float>(NMaterial[i].A, KMaterial[i].A);
  140 + newMaterial.eta.push_back(eta);
  141 + }
  142 +
  143 + MaterialList.push_back(newMaterial);
  144 +}
  145 +
  146 +void FitDisplay(){
  147 + float minA = 99999.0;
  148 + float maxA = -99999.0;
  149 + float k, n;
  150 +
  151 + if(dispSimSpec)
  152 + for(int i=0; i<SimSpectrum.size(); i++)
  153 + {
  154 + if(SimSpectrum[i].A < minA)
  155 + minA = SimSpectrum[i].A;
  156 + if(SimSpectrum[i].A > maxA)
  157 + maxA = SimSpectrum[i].A;
  158 + }
  159 +
  160 + if(dispRefSpec && RefSpectrum.size() > 0)
  161 + for(int i=0; i<RefSpectrum[currentSpec].size(); i++)
  162 + {
  163 + if(RefSpectrum[currentSpec][i].A < minA)
  164 + minA = RefSpectrum[currentSpec][i].A;
  165 + if(RefSpectrum[currentSpec][i].A > maxA)
  166 + maxA = RefSpectrum[currentSpec][i].A;
  167 + }
  168 + if(dispMatK)
  169 + for(int i=0; i<EtaK.size(); i++)
  170 + {
  171 + k = MaterialList[currentMaterial].eta[i].imag() * dispScaleK;
  172 + if(k < minA)
  173 + minA = k;
  174 + if(k > maxA)
  175 + maxA = k;
  176 + }
  177 + if(dispSimK)
  178 + for(int i=0; i<EtaK.size(); i++)
  179 + {
  180 + k = EtaK[i].A * dispScaleK;
  181 + if(k < minA)
  182 + minA = k;
  183 + if(EtaK[i].A > maxA)
  184 + maxA = k;
  185 + }
  186 + if(dispMatN)
  187 + for(int i=0; i<EtaN.size(); i++)
  188 + {
  189 + n = (MaterialList[currentMaterial].eta[i].real() - baseIR) * dispScaleN;
  190 + if(n < minA)
  191 + minA = n;
  192 + if(n > maxA)
  193 + maxA = n;
  194 + }
  195 + if(dispSimN)
  196 + for(int i=0; i<EtaN.size(); i++)
  197 + {
  198 + n = (EtaN[i].A - baseIR) * dispScaleN;
  199 + if(n < minA)
  200 + minA = n;
  201 + if(n > maxA)
  202 + maxA = n;
  203 + }
  204 +
  205 + aMin = minA;
  206 + aMax = maxA;
  207 + UpdateDisplay();
  208 +}
  209 +
  210 +void ChangeAbsorbance(){
  211 +
  212 + //compute the real part of the index of refraction
  213 +
  214 + //copy the absorbance values into a linear array
  215 + int nSamples = MaterialList[currentMaterial].eta.size();
  216 + float startNu = MaterialList[currentMaterial].nu.front();
  217 + float endNu = MaterialList[currentMaterial].nu.back();
  218 + float* k = (float*)malloc(sizeof(float) * nSamples);
  219 + float* n = (float*)malloc(sizeof(float) * nSamples);
  220 + for(int i=0; i<nSamples; i++)
  221 + k[i] = MaterialList[currentMaterial].eta[i].imag() * cA;
  222 +
  223 + //NMaterial.clear();
  224 + EtaK.clear();
  225 + EtaN.clear();
  226 + //use Kramers Kronig to determine the real part of the index of refraction
  227 + cudaKramersKronig(n, k, nSamples, startNu, endNu, baseIR);
  228 +
  229 + //copy the real part of the index of refraction into the vector
  230 + SpecPair temp;
  231 +
  232 + //load the imaginary IR from the absorbance data
  233 + float nu;
  234 + for(int i=0; i<nSamples; i++){
  235 + nu = MaterialList[currentMaterial].nu[i];
  236 + if(nu >= nuMin && nu <= nuMax){
  237 + temp.nu = nu;
  238 + temp.A = k[i];
  239 + EtaK.push_back(temp);
  240 + //temp.A = NMaterial[i].A;
  241 + temp.A = n[i];
  242 + EtaN.push_back(temp);
  243 + }
  244 + }
  245 +
  246 + free(k);
  247 + free(n);
  248 +}
  249 +
  250 +void SetMaterial()
  251 +{
  252 + EtaK.clear();
  253 + EtaN.clear();
  254 +
  255 + int nSamples = MaterialList[currentMaterial].eta.size();
  256 + float nu;
  257 + SpecPair temp;
  258 + for(int i=0; i<nSamples; i++){
  259 + nu = MaterialList[currentMaterial].nu[i];
  260 + if(nu >= nuMin && nu <= nuMax){
  261 + temp.nu = nu;
  262 + temp.A = MaterialList[currentMaterial].eta[i].imag();
  263 + EtaK.push_back(temp);
  264 + temp.A = MaterialList[currentMaterial].eta[i].real();
  265 + EtaN.push_back(temp);
  266 + }
  267 + }
  268 + cA = 1.0;
  269 +
  270 +}
  271 +
  272 +
  273 +
  274 +int main(int argc, char *argv[])
  275 +{
  276 +
  277 +
  278 + //load the default project file (any previous optical settings)
  279 + LoadState();
  280 +
  281 + //load the default materials
  282 + LoadMaterial("eta_TolueneK.txt", "eta_TolueneN.txt", "Toluene");
  283 + LoadMaterial("kPMMA.txt", "PMMA");
  284 + //LoadMaterial("../../../../data/materials/rtsSU8_k.txt", "../../../../data/materials/rtsSU8_n.txt", "SU8");
  285 + SetMaterial();
  286 +
  287 + //compute the analytical solution for the Mie scattered spectrum
  288 + SimulateSpectrum();
  289 +
  290 + QApplication a(argc, argv);
  291 + InteractiveMie w;
  292 +
  293 +
  294 + w.show();
  295 +
  296 +
  297 + w.move(0, 0);
  298 + QRect frame = w.frameGeometry();
  299 + QRect inside = w.geometry();
  300 +
  301 + //activate a console for output
  302 + RedirectIOToConsole(0, frame.height(), frame.width());
  303 +
  304 + gpSpectrumDisplay = new qtSpectrumDisplay();
  305 + gpSpectrumDisplay->move(frame.width(), 0);
  306 + gpSpectrumDisplay->resize(2*inside.height(), inside.height());
  307 +
  308 + gpSpectrumDisplay->show();
  309 +
  310 + //refresh the UI
  311 + w.refreshUI();
  312 +
  313 + return a.exec();
  314 +}
... ...
qtSpectrumDisplay.cpp 0 โ†’ 100644
  1 +++ a/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(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(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(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(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 + }
0 299 \ No newline at end of file
... ...
qtSpectrumDisplay.h 0 โ†’ 100644
  1 +++ a/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 +
  52 + #endif
0 53 \ No newline at end of file
... ...
rtsGUIConsole.cpp 0 โ†’ 100644
  1 +++ a/rtsGUIConsole.cpp
  1 +#include <windows.h>
  2 +
  3 +#include <stdio.h>
  4 +
  5 +#include <fcntl.h>
  6 +
  7 +#include <io.h>
  8 +
  9 +#include <iostream>
  10 +
  11 +#include <fstream>
  12 +
  13 +#ifndef _USE_OLD_IOSTREAMS
  14 +
  15 +using namespace std;
  16 +
  17 +#endif
  18 +
  19 +// maximum mumber of lines the output console should have
  20 +
  21 +static const WORD MAX_CONSOLE_LINES = 500;
  22 +
  23 +//#ifdef _DEBUG
  24 +
  25 +void RedirectIOToConsole(int Xpos, int Ypos, int Width, int Height)
  26 +
  27 +{
  28 +
  29 +int hConHandle;
  30 +
  31 +long lStdHandle;
  32 +
  33 +CONSOLE_SCREEN_BUFFER_INFO coninfo;
  34 +
  35 +FILE *fp;
  36 +
  37 +// allocate a console for this app
  38 +
  39 +AllocConsole();
  40 +
  41 +// set the screen buffer to be big enough to let us scroll text
  42 +
  43 +GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
  44 +
  45 +coninfo.dwSize.Y = MAX_CONSOLE_LINES;
  46 +
  47 +SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
  48 +
  49 +coninfo.dwSize);
  50 +
  51 +// redirect unbuffered STDOUT to the console
  52 +
  53 +lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
  54 +
  55 +hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
  56 +
  57 +fp = _fdopen( hConHandle, "w" );
  58 +
  59 +*stdout = *fp;
  60 +
  61 +setvbuf( stdout, NULL, _IONBF, 0 );
  62 +
  63 +// redirect unbuffered STDIN to the console
  64 +
  65 +lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
  66 +
  67 +hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
  68 +
  69 +fp = _fdopen( hConHandle, "r" );
  70 +
  71 +*stdin = *fp;
  72 +
  73 +setvbuf( stdin, NULL, _IONBF, 0 );
  74 +
  75 +// redirect unbuffered STDERR to the console
  76 +
  77 +lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
  78 +
  79 +hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
  80 +
  81 +fp = _fdopen( hConHandle, "w" );
  82 +
  83 +*stderr = *fp;
  84 +
  85 +setvbuf( stderr, NULL, _IONBF, 0 );
  86 +
  87 +// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
  88 +
  89 +// point to console as well
  90 +
  91 +ios::sync_with_stdio();
  92 +
  93 +//position
  94 +
  95 +MoveWindow(GetConsoleWindow(), Xpos, Ypos, Width, Height, true);
  96 +
  97 +}
  98 +
  99 +//#endif
  100 +
  101 +//End of File
0 102 \ No newline at end of file
... ...
rtsGUIConsole.h 0 โ†’ 100644
  1 +++ a/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 +
  13 +/* End of File */
0 14 \ No newline at end of file
... ...