3double TotalTailCorrection(
Components& SystemComponents,
size_t FFsize,
double Volume)
6 if(!SystemComponents.HasTailCorrection)
return TailE;
7 for(
size_t i = 0; i < SystemComponents.NumberOfPseudoAtoms.size(); i++)
8 for(
size_t j = i; j < SystemComponents.NumberOfPseudoAtoms.size(); j++)
10 size_t IJ_Forward = i * FFsize + j;
11 if(SystemComponents.TailCorrection[IJ_Forward].UseTail)
13 size_t Ni = SystemComponents.NumberOfPseudoAtoms[i];
14 size_t Nj = SystemComponents.NumberOfPseudoAtoms[j];
15 double pairE = SystemComponents.TailCorrection[IJ_Forward].Energy *
static_cast<double>(Ni * Nj);
if(i != j) pairE *= 2.0;
17 printf(
"i: %zu, j: %zu, Ni: %zu, Nj: %zu, E: %.5f\n", i,j,Ni,Nj, pairE / Volume);
20 return TailE / Volume;
23size_t get_change_in_pseudoAtoms(
Components& SystemComponents,
size_t SelectedComponent,
size_t Type)
26 for(
size_t i = 0; i < SystemComponents.NumberOfPseudoAtomsForSpecies[SelectedComponent].size(); i++)
28 if(Type == SystemComponents.NumberOfPseudoAtomsForSpecies[SelectedComponent][i].x)
30 d = SystemComponents.NumberOfPseudoAtomsForSpecies[SelectedComponent][i].y;
break;
36double TailCorrectionDifference(
Components& SystemComponents,
size_t SelectedComponent,
size_t FFsize,
double Volume,
int MoveType)
39 if(!SystemComponents.HasTailCorrection)
return TailE;
50 throw std::runtime_error(
"TAIL CORRECTIONS NOT READY FOR CBCF MOVES!");
54 throw std::runtime_error(
"TAIL CORRECTIONS NOT READY FOR CBCF MOVES!");
62 for(
size_t i = 0; i < SystemComponents.NumberOfPseudoAtoms.size(); i++)
64 int di = get_change_in_pseudoAtoms(SystemComponents, SelectedComponent, i); di *= sign;
66 for(
size_t j = i; j < SystemComponents.NumberOfPseudoAtoms.size(); j++)
68 int dj = get_change_in_pseudoAtoms(SystemComponents, SelectedComponent, j); dj *= sign;
69 size_t IJ_Forward = i * FFsize + j;
70 if(SystemComponents.TailCorrection[IJ_Forward].UseTail)
72 int Ni = SystemComponents.NumberOfPseudoAtoms[i];
73 int Nj = SystemComponents.NumberOfPseudoAtoms[j];
74 double E = SystemComponents.TailCorrection[IJ_Forward].Energy;
75 int dN = Ni * dj + Nj * di + di * dj;
76 double DeltaE = E *
static_cast<double>(dN);
if(i != j) DeltaE *= 2.0;
81 return TailE / Volume;
85double TailCorrectionIdentitySwap(
Components& SystemComponents,
size_t NEWComponent,
size_t OLDComponent,
size_t FFsize,
double Volume)
88 if(!SystemComponents.HasTailCorrection)
return TailE;
90 for(
size_t i = 0; i < SystemComponents.NumberOfPseudoAtoms.size(); i++)
92 int di = get_change_in_pseudoAtoms(SystemComponents, NEWComponent, i);
93 di-= get_change_in_pseudoAtoms(SystemComponents, OLDComponent, i);
95 for(
size_t j = i; j < SystemComponents.NumberOfPseudoAtoms.size(); j++)
97 int dj = get_change_in_pseudoAtoms(SystemComponents, NEWComponent, j);
98 dj-= get_change_in_pseudoAtoms(SystemComponents, OLDComponent, j);
100 size_t IJ_Forward = i * FFsize + j;
101 if(SystemComponents.TailCorrection[IJ_Forward].UseTail)
103 int Ni = SystemComponents.NumberOfPseudoAtoms[i];
104 int Nj = SystemComponents.NumberOfPseudoAtoms[j];
105 double E = SystemComponents.TailCorrection[IJ_Forward].Energy;
106 int dN = Ni * dj + Nj * di + di * dj;
107 double DeltaE = E *
static_cast<double>(dN);
if(i != j) DeltaE *= 2.0;
112 return TailE / Volume;
Definition data_struct.h:843