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; }