public override void CalculateForceField(ParticleEnsemble ensemble) { // variable declarations double posXi, posYi; double posXj, posYj; double ijSeparation = 0.0, LJforce = 0.0, PotentialEnergy = 0.0; // variable initializations int BoxHeight = ensemble.BoxHeight; int BoxWidth = ensemble.BoxWidth; double MaxForce = ensemble.MaxForceThreshold; double MinForce = -1.0 * (ensemble.MaxForceThreshold); DPVector zero = new DPVector(0, 0); // initialize vectors holding forces for (int i = 0; i < ensemble.NumberOfParticles; ++i) { LJforces[i] = zero; } ensemble.ResetAllParticlesNotWithinRange(); for (int i = 0; i < ensemble.NumberOfParticles; ++i) { Particle particlei = ensemble.GetParticle(i); for (int j = (i + 1); j < ensemble.NumberOfParticles; ++j) { Particle particlej = ensemble.GetParticle(j); // get the interparticle separation distances ijSeparation = ensemble.GetInterParticleSeparation(i, j); double LJgradientTermA = particlei.ParticleType.LJgradientTermA[particlej.TypeID]; double LJgradientTermB = particlei.ParticleType.LJgradientTermB[particlej.TypeID]; // update the radial distribution function double cutoffDistance = particlei.ParticleType.MinimumDistance[particlej.TypeID]; // MinimumDistance[i, j]; if (ijSeparation < cutoffDistance) { // for each particle, change the appropriate element of the setWithinRangeOfAnotherParticle vector to true posXi = particlei.Position.X; posYi = particlei.Position.Y; posXj = particlej.Position.X; posYj = particlej.Position.Y; LJforce = (posXj - posXi) * (LJgradientTermA / Math.Pow(ijSeparation, 13.0) + LJgradientTermB / Math.Pow(ijSeparation, 7.0)) / ijSeparation; if (Math.Abs(LJforce) > MaxForce || Math.Abs(LJforce) < MinForce) { // error check for real-time stability... LJforce = 0.0; } else if(double.IsNaN(LJforce) || double.IsInfinity(LJforce)) { // error check for real-time stability... LJforce = 0.0; } LJforces[i].X += LJforce; LJforces[j].X += -1.0 * LJforce; LJforce = (posYj - posYi) * (LJgradientTermA / Math.Pow(ijSeparation, 13.0) + LJgradientTermB / Math.Pow(ijSeparation, 7.0)) / ijSeparation; if (Math.Abs(LJforce) > MaxForce || Math.Abs(LJforce) < MinForce) { // error check for real-time stability... LJforce = 0.0; } else if (double.IsNaN(LJforce) || double.IsInfinity(LJforce)) { // error check for real-time stability... LJforce = 0.0; } LJforces[i].Y += LJforce; LJforces[j].Y += -1.0 * LJforce; ensemble.SetParticlesWithinRange(i, j); ensemble.SetParticlesWithinRange(j, i); } //else //{ // ensemble.SetParticlesNotWithinRange(i, j); //ensemble.SetParticlesNotWithinRange(j, i); //} } } // set the forces in the Particle Ensemble Object ensemble.AddForces(LJforces); // set the potential energy ensemble.AddPotentialEnergy(PotentialEnergy); }