[cig-commits] [commit] add_gibbs_energy: Fixed bug in solid solution, unified mbr and ss property derivations (89647e0)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Thu Dec 11 18:19:39 PST 2014


Repository : https://github.com/geodynamics/burnman

On branch  : add_gibbs_energy
Link       : https://github.com/geodynamics/burnman/compare/9166820546732673719e2a925461aff9be00821a...89647e0f4d8d7d6b54a88137195d88404e879b59

>---------------------------------------------------------------

commit 89647e0f4d8d7d6b54a88137195d88404e879b59
Author: Bob Myhill <myhill.bob at gmail.com>
Date:   Thu Dec 11 18:18:56 2014 -0800

    Fixed bug in solid solution, unified mbr and ss property derivations


>---------------------------------------------------------------

89647e0f4d8d7d6b54a88137195d88404e879b59
 burnman/modified_tait.py |  5 +++--
 burnman/solidsolution.py |  4 ++--
 burnman/solutionmodel.py | 13 +++++++------
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/burnman/modified_tait.py b/burnman/modified_tait.py
index 9426709..bb42824 100644
--- a/burnman/modified_tait.py
+++ b/burnman/modified_tait.py
@@ -113,8 +113,9 @@ class MT(eos.EquationOfState):
         """
         K_T= self.isothermal_bulk_modulus(pressure,temperature,volume,params)
         alpha = self.thermal_expansivity(pressure,temperature,volume,params)
-        gr = self.grueneisen_parameter(pressure, temperature, volume, params)
-        K_S = K_T*(1. + gr * alpha * temperature)
+        C_p = self.heat_capacity_p(pressure, temperature, volume, params)
+        C_v = self.heat_capacity_v(pressure, temperature, volume, params)
+        K_S = K_T*C_p/C_v
         return K_S
 
     def gibbs_free_energy(self,pressure,temperature,params):
diff --git a/burnman/solidsolution.py b/burnman/solidsolution.py
index 35d9823..953a781 100644
--- a/burnman/solidsolution.py
+++ b/burnman/solidsolution.py
@@ -66,10 +66,10 @@ class SolidSolution(Mineral):
         self.V = sum([ self.base_material[i][0].V * self.molar_fraction[i] for i in range(self.n_endmembers) ]) + self.excess_volume
         self.C_p = sum([ self.base_material[i][0].C_p * self.molar_fraction[i] for i in range(self.n_endmembers) ])
         self.alpha = (1./self.V) * sum([ self.base_material[i][0].alpha * self.base_material[i][0].V * self.molar_fraction[i] for i in range(self.n_endmembers) ])
-        self.K_T = self.V * 1./(sum([ (0.0-self.base_material[i][0].V) / (self.base_material[i][0].K_T)  * self.molar_fraction[i] for i in range(self.n_endmembers) ]))
+        self.K_T = self.V * 1./(sum([ self.base_material[i][0].V / (self.base_material[i][0].K_T)  * self.molar_fraction[i] for i in range(self.n_endmembers) ]))
 
         # Derived properties
-        self.C_v = self.C_p - self.V*temperature*np.power(self.alpha, 2.)*self.K_T
+        self.C_v = self.C_p - self.V*temperature*self.alpha*self.alpha*self.K_T
         self.K_S = self.K_T*self.C_p/self.C_v
         self.gr = self.alpha*self.K_T*self.V/self.C_v
 
diff --git a/burnman/solutionmodel.py b/burnman/solutionmodel.py
index f4992e8..152c1cc 100644
--- a/burnman/solutionmodel.py
+++ b/burnman/solutionmodel.py
@@ -124,7 +124,7 @@ class IdealSolution ( SolutionModel ):
                 if endmember_occupancy[occ] > 1e-10: 
                     self.endmember_configurational_entropies[idx] = \
                         self.endmember_configurational_entropies[idx] - \
-                        R*self.site_multiplicities[occ]*endmember_occupancy[occ]*np.log(endmember_occupancy[occ])
+                        constants.gas_constant*self.site_multiplicities[occ]*endmember_occupancy[occ]*np.log(endmember_occupancy[occ])
 
     def _endmember_configurational_entropy_contribution(self, molar_fractions):
         return np.dot(molar_fractions, self.endmember_configurational_entropies)
@@ -134,13 +134,13 @@ class IdealSolution ( SolutionModel ):
         conf_entropy=0
         for idx, occupancy in enumerate(site_occupancies):
             if occupancy > 1e-10:
-                conf_entropy=conf_entropy-R*occupancy*self.site_multiplicities[idx]*np.log(occupancy)
+                conf_entropy=conf_entropy-constants.gas_constant*occupancy*self.site_multiplicities[idx]*np.log(occupancy)
 
         return conf_entropy
 
 
     def _ideal_excess_partial_gibbs( self, temperature, molar_fractions ): 
-        return  R * temperature * self._log_ideal_activities(molar_fractions)
+        return  constants.gas_constant*temperature * self._log_ideal_activities(molar_fractions)
 
     def _log_ideal_activities ( self, molar_fractions ):
         site_occupancies=np.dot(molar_fractions, self.endmember_occupancies)
@@ -152,8 +152,8 @@ class IdealSolution ( SolutionModel ):
                 if self.endmember_occupancies[e][occ] > 1e-10 and site_occupancies[occ] > 1e-10:
                     lna[e]=lna[e] + self.endmember_occupancies[e][occ]*self.site_multiplicities[occ]*np.log(site_occupancies[occ])
 
-            normalisation_constant=self.endmember_configurational_entropies[e]/R
-            lna[e]=lna[e] + self.endmember_configurational_entropies[e]/R
+            normalisation_constant=self.endmember_configurational_entropies[e]/constants.gas_constant
+            lna[e]=lna[e] + self.endmember_configurational_entropies[e]/constants.gas_constant
         return lna
 
 
@@ -249,8 +249,9 @@ class AsymmetricRegularSolution ( IdealSolution ):
 
     def excess_entropy( self, pressure, temperature, molar_fractions ):
         phi=self._phi(molar_fractions)
+        S_conf=np.dot(IdealSolution._ideal_excess_partial_gibbs(self, temperature, molar_fractions),molar_fractions)
         S_excess=np.dot(self.alpha.T,molar_fractions)*np.dot(phi.T,np.dot(self.Ws,phi))
-        return IdealSolution._ideal_excess_partial_gibbs (self,temperature, molar_fractions ) + S_excess
+        return S_conf + S_excess
 
     def excess_enthalpy( self, pressure, temperature, molar_fractions ):
         phi=self._phi(molar_fractions)



More information about the CIG-COMMITS mailing list