Пример #1
0
		public ExternalField(ParticleEnsemble ensemble)
		{
			GrabberCalls = 0;
			CalibrationCalls = 1;
			consecutiveZeroThreshold = 3;
			BoxHeight = ensemble.GetBoxHeight();
			BoxWidth = ensemble.GetBoxWidth();
			Calibrating = false;

			// initialize background pixels
			BackgroundPixels = new List<double>(new double[BoxHeight * BoxWidth]);

			// initialize the calibration count vector
			calibrationCountVector = new List<double>(new double[BoxHeight * BoxWidth]);

			// initialize timeTpixels
			timeTpixels = new List<double>(new double[BoxHeight * BoxWidth]);

			// initialize consecutiveZerosCount
			consecutiveZerosCount = new List<double>(new double[BoxHeight * BoxWidth]);

			// allocate vectors holding positions & forces
			xforces = new List<double>(new double[ensemble.GetNumberOfParticles()]);
			yforces = new List<double>(new double[ensemble.GetNumberOfParticles()]);

			// set up the gaussian array with the desired smoothing width parameter
			sigma = 10;
			nGaussPoints = 2 * (3 * sigma) + 1;
			RangeEitherSide = 3 * sigma;
			gaussian = new List<double>(new double[nGaussPoints]);
			double point = -1.0 * (3.0 * (double)sigma);
			for (int i = 0; i < nGaussPoints; ++i)
			{
				gaussian[i] = Math.Exp(-0.5 * (Math.Pow(point / (double)sigma, 2.0))) / ((double)sigma * Math.Sqrt(2.0 * Math.PI));
				//    cout << point << " " << gaussian[i] << endl;
				++point;
			}

		}
Пример #2
0
		/// <summary>
		/// function to calculate Soft Spheres forcefield
		/// </summary>
		/// <param name="ensemble"></param>
		public override void CalculateForceField(ParticleEnsemble ensemble)
		{
			//  variable declarations    
			int i;
			double posXi, posYi, radius;
			double PotentialEnergy = 0.0;

			// variable initializations  
			int BoxHeight = ensemble.GetBoxHeight();
			int BoxWidth = ensemble.GetBoxWidth();

			// #pragma omp parallel for
			for (i = 0; i < ensemble.GetNumberOfParticles(); ++i)
			{
				// initialize vectors holding forces
				xforces[i] = 0.0;																			// HERE'S THE PROBLEM - THE INDEX WILL OVERRUN THE VECTOR SIZE!!!
				yforces[i] = 0.0;
			}

			//#pragma omp parallel for
			for (i = 0; i < ensemble.GetNumberOfParticles(); ++i)
			{
				posXi = ensemble.GetXParticlePosition(i);
				posYi = ensemble.GetYParticlePosition(i);
				radius = ensemble.GetParticleRadius(i);

				// get pixel vectors along the particle's X & Y axes for getting gradient of image field
				// there are 2 steps to this process: 
				//  (1) do some gaussian smoothing with a user defined width parameter (this determines how
				//      many pixels we need
				//  (2) determine the gradient from linear regression of the 3 surrounding points...
				//    cout << "particle " << i << " Xpos " << posXi << " Ypos " << posYi << endl;

				//    first get the vectors that we need - the length of the vectors depend on the width of the gaussian
				//    if the pixels are near the edge, the pixels beyond them (which arent in the image) are simply returned as zeros

				//    vector < double > AllThePixelsAlongX = pParticleSet->GetAllThePixelsAlongX(posYi,posXi,RangeEitherSide);
				//    xforces[i] = pParticleSet->GetGradientScaleFactor()*GaussianSmoothedSlope(posXi,AllThePixelsAlongX);
				//    cout << "Xposition " << posXi << endl;

				List<double> SubsetOfPixelsAlongX = GetSubsetOfPixelsAlongX(posYi, posXi, RangeEitherSide + 1);
				//    for(int kk=0; kk<SubsetOfPixelsAlongX.size(); ++kk){
				//      cout << kk << " " << SubsetOfPixelsAlongX[kk] << endl;      
				//    }

				//    cout << "Xposition " << posXi << endl;
				//    for(int kk=1;kk<SubsetOfPixelsAlongX.size();++kk){cout << kk << " " << SubsetOfPixelsAlongX[kk] << endl;}
				xforces[i] = ensemble.GetGradientScaleFactor() * GaussianSmoothedSlope(posXi, SubsetOfPixelsAlongX);

				//    vector < double > AllThePixelsAlongY = pParticleSet->GetAllThePixelsAlongY(posXi,posYi,RangeEitherSide);
				//    cout << "Yposition " << posYi << endl;
				//    for(int kk=0;kk<AllThePixelsAlongY.size();++kk){cout << kk << " " << AllThePixelsAlongY[kk] << endl;}
				//    yforces[i] = pParticleSet->GetGradientScaleFactor()*GaussianSmoothedSlope(posYi,AllThePixelsAlongY);

				List<double> SubsetOfPixelsAlongY = GetSubsetOfPixelsAlongY(posXi, posYi, RangeEitherSide + 1);
				//    cout << "Yposition " << endl;
				yforces[i] = ensemble.GetGradientScaleFactor() * GaussianSmoothedSlope(posYi, SubsetOfPixelsAlongY);
				//    cout << "yforces[i] " << i << " " << yforces[i] << endl;    

				// get the gradient scale factor, depending on whether the particle is attractive or repulsive

				ParticleInfo typeInfo = ParticleStaticObjects.AtomPropertiesDefinition.Lookup[(ensemble.pParticleVector[i]).TypeID];
				double attractiveOrRepulsiveFactor = typeInfo.AttractiveOrRepulsive;
				xforces[i] *= attractiveOrRepulsiveFactor;
				yforces[i] *= attractiveOrRepulsiveFactor;

			}


			ensemble.AddXForces(xforces);		  // set the forces in the Particle Ensemble Object
			ensemble.AddYForces(yforces);			// set the potential energy
			ensemble.AddPotentialEnergy(PotentialEnergy);		// add in the potential energy    

		}