nearfield.cpp 2.74 KB
#include "nearfield.h"

nearfieldStruct::nearfieldStruct()
{
    scalarSim = true;
	planeWave = false;

	nWaves = 0;
}

void nearfieldStruct::init()
{
	//set the field parameters
	U.scalarField = scalarSim;
	Uf.scalarField = scalarSim;

	//initialize dynamic memory
	U.init_gpu();
	Uf.init_gpu();
}

void nearfieldStruct::destroy()
{
	U.kill_gpu();
	Uf.kill_gpu();
}

void nearfieldStruct::setPos(bsPoint pMin, bsPoint pMax, bsVector normal)
{
	pos = rts::rtsQuad<ptype, 3>(pMin, pMax, normal);
}

void nearfieldStruct::setRes(int x_res, int y_res)
{
	U.R[0] = Uf.R[0] = x_res;
	U.R[1] = Uf.R[1] = y_res;
}

std::string nearfieldStruct::toStr()
{
	std::stringstream ss;

	ss<<"------Field Parameters-------"<<std::endl;
	ss<<"Wavelength: "<<lambda<<"um"<<std::endl;
	ss<<"K Vector (r, theta, phi): "<<k.cart2sph()<<std::endl;
	ss<<"Condenser NA: "<<condenser[0]<<" to "<<condenser[1]<<std::endl;
	ss<<"Focal Point: "<<focus[0]<<", "<<focus[1]<<", "<<focus[2]<<std::endl;
	ss<<"Field Slice: "<<std::endl;
	ss<<pos<<std::endl;

	ss<<std::endl<<"---------Materials-----------"<<std::endl;
	ss<<"Number of Materials: "<<mVector.size()<<std::endl;
	ss<<"Refractive Indices at lambda = "<<lambda<<"um"<<std::endl;
	//output each material
	for(unsigned int m=0; m<mVector.size(); m++)
		ss<<" "<<m<<": "<<mVector[m](lambda)<<std::endl;

	ss<<"---------Spheres-------------"<<std::endl;
	ss<<"Number of Spheres: "<<sVector.size()<<std::endl;
	//output each sphere
	for(unsigned int s=0; s<sVector.size(); s++)
		ss<<sVector[s].toStr()<<std::endl;

	return ss.str();
}

//generate monte-carlo waves
void nearfieldStruct::calcWaves()
{
    inWaves.resize(nWaves);

    //re-seed the random number generator
    //srand(seed);

    //calculate the monte-carlo samples
    mcSampleNA(&inWaves[0], nWaves, k, condenser[0], condenser[1]);


}


void nearfieldStruct::calcSpheres()
{
    //calculate all of the constants necessary to evaluate the scattered field
	//estimate the order required to represent the scattered field for each sphere

	//for each sphere
	for(int i=0; i<sVector.size(); i++)
	{
		//a = sVector[i].a;

		//calculate the required order
		sVector[i].calcNl(lambda);
		//std::cout<<sVector[i].Nl<<std::endl;

		//set the refractive index for the sphere
		int imat = sVector[i].iMaterial;
        rts::rtsComplex<ptype> n = mVector[imat](lambda);
		//std::cout<<"Sphere refractive index: "<<n<<std::endl;

		//calculate the scattering coefficients
		sVector[i].calcCoeff(lambda, n);

		//save the refractive index
		sVector[i].n = n;

	}

}

void nearfieldStruct::Simulate()
{
	//compute a set of plane waves for Monte-Carlo simulation
	calcWaves();

    //the near field has to be simulated no matter what the output rtsPoint is
    scalarUf();
    calcSpheres();
    scalarUs();
    sumUf();
}