#include "sphere.h" #include "rts/math/complex.h" #include #include using namespace rts; using namespace std; int cbessjyva(double v,complex z,double &vm,complex*cjv, complex*cyv,complex*cjvp,complex*cyvp); int cbessjyva_sph(int v,complex z,double &vm,complex*cjv, complex*cyv,complex*cjvp,complex*cyvp); void sphere::calcCoeff(ptype lambda, rtsComplex ri) { /* These calculations are done at high-precision on the CPU since they are only required once for each wavelength. Input: lambda = wavelength of the incident field n = complex refractive index of the sphere */ //clear the previous coefficients A.clear(); B.clear(); //convert to an std complex value complex nc(ri.real(), ri.imag()); n = ri; //compute the magnitude of the k vector double k = 2 * PI / lambda; complex kna = nc * k * (double)a; //compute the arguments k*a and k*n*a complex ka(k * a, 0.0); //allocate space for the Bessel functions of the first and second kind (and derivatives) int bytes = sizeof(complex) * (Nl + 1); complex* cjv_ka = (complex*)malloc(bytes); complex* cyv_ka = (complex*)malloc(bytes); complex* cjvp_ka = (complex*)malloc(bytes); complex* cyvp_ka = (complex*)malloc(bytes); complex* cjv_kna = (complex*)malloc(bytes); complex* cyv_kna = (complex*)malloc(bytes); complex* cjvp_kna = (complex*)malloc(bytes); complex* cyvp_kna = (complex*)malloc(bytes); //allocate space for the spherical Hankel functions and derivative complex* chv_ka = (complex*)malloc(bytes); complex* chvp_ka = (complex*)malloc(bytes); //compute the bessel functions using the CPU-based algorithm double vm; cbessjyva_sph(Nl, ka, vm, cjv_ka, cyv_ka, cjvp_ka, cyvp_ka); cbessjyva_sph(Nl, kna, vm, cjv_kna, cyv_kna, cjvp_kna, cyvp_kna); //cout<<"Begin Sphere---------"<