@@ -23,30 +23,33 @@ pub struct Sample {
2323 n : u64 ,
2424 /// Thermal energy, RT in kJ/mol
2525 thermal_energy : f64 ,
26- /// Boltzmann weighted energy, U * exp(-U/kT)
26+ /// Boltzmann weighted energy, U * g x exp(-U/kT)
2727 mean_energy : f64 ,
28- /// Boltzmann weighted squared energy, U^2 * exp(-U/kT)
28+ /// Boltzmann weighted squared energy, U^2 * g x exp(-U/kT)
2929 mean_squared_energy : f64 ,
30- /// Boltzmann factored energy, exp(-U/kT)
30+ /// Boltzmann factored energy, g x exp(-U/kT)
3131 exp_energy : f64 ,
32- /// Boltzmann factored energy minus one, exp(-U/kT) - 1
32+ /// Boltzmann factored energy minus one, g x exp(-U/kT) - 1
3333 exp_energy_m1 : f64 ,
34+ /// Degeneracy of the state, g
35+ degeneracy : f64 ,
3436}
3537
3638impl Sample {
3739 /// New from energy in kJ/mol and temperature in K
38- pub fn new ( energy : f64 , temperature : f64 ) -> Self {
40+ pub fn new ( energy : f64 , temperature : f64 , degeneracy : f64 ) -> Self {
3941 const KJ_PER_J : f64 = 1e-3 ;
4042 let thermal_energy = MOLAR_GAS_CONSTANT * temperature * KJ_PER_J ; // kJ/mol
41- let exp_energy = ( -energy / thermal_energy) . exp ( ) ;
42- let exp_energy_m1 = ( -energy / thermal_energy) . exp_m1 ( ) ;
43+ let exp_energy = degeneracy * ( -energy / thermal_energy) . exp ( ) ;
44+ let exp_energy_m1 = degeneracy * ( -energy / thermal_energy) . exp_m1 ( ) ;
4345 Self {
4446 n : 1 ,
4547 thermal_energy,
4648 mean_energy : energy * exp_energy,
4749 mean_squared_energy : energy. powi ( 2 ) * exp_energy,
4850 exp_energy,
4951 exp_energy_m1,
52+ degeneracy,
5053 }
5154 }
5255 /// Thermal energy (kJ/mol)
@@ -67,11 +70,11 @@ impl Sample {
6770 }
6871 /// Free energy (kJ / mol)
6972 pub fn free_energy ( & self ) -> f64 {
70- ( self . exp_energy / self . n as f64 ) . ln ( ) . neg ( ) * self . thermal_energy
73+ ( self . exp_energy / self . degeneracy as f64 ) . ln ( ) . neg ( ) * self . thermal_energy
7174 }
7275 /// Mean <exp(-U/kT)-1>
7376 pub fn mean_exp_energy_m1 ( & self ) -> f64 {
74- self . exp_energy_m1 / self . n as f64
77+ self . exp_energy_m1 / self . degeneracy as f64
7578 }
7679 /// Number of samples
7780 pub fn n ( & self ) -> u64 {
@@ -83,12 +86,13 @@ impl std::fmt::Display for Sample {
8386 fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
8487 write ! (
8588 f,
86- "n: {}, ⟨U⟩: {:.3} kJ/mol, C/𝑘𝐵: {:.3}, -𝑘𝑇⟨exp(-𝛽U)⟩: {:.3} kJ/mol, ⟨exp(-𝛽U)-1⟩: {:.3}" ,
89+ "n: {}, ⟨U⟩: {:.3} kJ/mol, C/𝑘𝐵: {:.3}, -𝑘𝑇⟨exp(-𝛽U)⟩: {:.3} kJ/mol, ⟨exp(-𝛽U)-1⟩: {:.3}, g = {:.3} " ,
8790 self . n,
8891 self . mean_energy( ) ,
8992 self . heat_capacity( ) ,
9093 self . free_energy( ) ,
91- self . mean_exp_energy_m1( )
94+ self . mean_exp_energy_m1( ) ,
95+ self . degeneracy,
9296 )
9397 }
9498}
@@ -110,6 +114,7 @@ impl Add for Sample {
110114 mean_squared_energy : self . mean_squared_energy + other. mean_squared_energy ,
111115 exp_energy : self . exp_energy + other. exp_energy ,
112116 exp_energy_m1 : self . exp_energy_m1 + other. exp_energy_m1 ,
117+ degeneracy : self . degeneracy + other. degeneracy ,
113118 }
114119 }
115120}
@@ -122,5 +127,6 @@ impl AddAssign for Sample {
122127 self . exp_energy += other. exp_energy ;
123128 self . exp_energy_m1 += other. exp_energy_m1 ;
124129 self . thermal_energy = f64:: max ( self . thermal_energy , other. thermal_energy ) ;
130+ self . degeneracy += other. degeneracy ;
125131 }
126132}
0 commit comments