double GuptaPotentialEnergy::EnergyValue(Clusters& cluster)
{
	int N = cluster.GetAtomsNumber();
	_atomEnergy.resize(N);
	double *dis = cluster.GetDistancePointer();
	double E = 0;
	vector<double> VEN(N,0);
	vector<double> PEN(N,0);
	
	Alloy alloy = cluster.GetAlloy();

	for (int i = 0; i < N - 1; i ++)
	{
		for (int j = i + 1; j < N; j ++)
		{
			double r = dis[ i * N + j ];
			int note1 = cluster.GetAtomAtIndex(i).GetNote();
			int note2 = cluster.GetAtomAtIndex(j).GetNote();
			Gupta_AtomParamter parameter = (Gupta_AtomParamter&)ReturnAtomParameter(alloy[note1],alloy[note2]);
			double FMJN = r / parameter.r0 - 1;
			double FMJV = parameter.A * exp( -parameter.P * FMJN );
			double FMJP  = parameter.Xi * parameter.Xi * exp( -2 * parameter.q *FMJN );

			VEN[i] += FMJV;
			VEN[j] += FMJV;
			PEN[i] += FMJP;
			PEN[j] += FMJP;
		}
	}
	for (int i = 0; i < N; i++)
	{		
		_atomEnergy[i] = VEN[i] - sqrt(PEN[i]);
		E += _atomEnergy[i];
	}

	cluster.SetEnergyVectorOfAtoms(_atomEnergy);
	cluster.SetEnergy(E);

	return E;
}