[cig-commits] [commit] master: Add order-disorder solid solution test, fixed 0K solid solution behaviour (8e75822)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Fri Dec 12 20:27:56 PST 2014


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

On branch  : master
Link       : https://github.com/geodynamics/burnman/compare/01d4aa027e2cb33852b7efdd80e67d64e5ec8f9c...881b878da7bd7228b4e714d9d10c4a75c876efb6

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

commit 8e75822469df55461ff056a0afae436faba077c5
Author: Bob Myhill <myhill.bob at gmail.com>
Date:   Fri Dec 12 19:43:01 2014 -0800

    Add order-disorder solid solution test, fixed 0K solid solution behaviour


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

8e75822469df55461ff056a0afae436faba077c5
 burnman/solidsolution.py                    | 10 +++++++---
 misc/benchmarks/solidsolution_benchmarks.py |  4 ++--
 tests/test_solidsolution.py                 | 20 ++++++++++++++++++++
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/burnman/solidsolution.py b/burnman/solidsolution.py
index 48c4951..7dcc85e 100644
--- a/burnman/solidsolution.py
+++ b/burnman/solidsolution.py
@@ -89,10 +89,14 @@ class SolidSolution(Mineral):
 
         # Derived properties
         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
-
 
+        # C_v and C_p -> 0 as T -> 0
+        if temperature<1e-10:
+            self.K_S = self.K_T
+            self.gr = float('nan')
+        else:
+            self.K_S = self.K_T*self.C_p/self.C_v
+            self.gr = self.alpha*self.K_T*self.V/self.C_v     
 
     def calcgibbs(self, pressure, temperature, molar_fractions): 
         return sum([ self.base_material[i][0].calcgibbs(pressure, temperature) * molar_fractions[i] for i in range(self.n_endmembers) ]) + self.solution_model.excess_gibbs_free_energy( pressure, temperature, molar_fractions)
diff --git a/misc/benchmarks/solidsolution_benchmarks.py b/misc/benchmarks/solidsolution_benchmarks.py
index 9a6cb5f..21c2986 100644
--- a/misc/benchmarks/solidsolution_benchmarks.py
+++ b/misc/benchmarks/solidsolution_benchmarks.py
@@ -136,7 +136,7 @@ for idx, model in enumerate(opx_models):
     for i,c in enumerate(comp):
         molar_fractions=[1.0-c, c]
         model.set_composition( np.array(molar_fractions) )
-        model.set_state( 1.e5, 300. )
+        model.set_state( 0., 0. )
         opx_entropies[idx][i] = model.solution_model._configurational_entropy( molar_fractions )
 
 
@@ -180,7 +180,7 @@ gibbs = np.empty_like(comp)
 
 for i,c in enumerate(comp):
    cpx.set_composition( np.array([1.0-c, c]) )
-   cpx.set_state( 1.e5, 300. )
+   cpx.set_state( 0., 0. )
    gibbs[i] = cpx.excess_gibbs
 
 
diff --git a/tests/test_solidsolution.py b/tests/test_solidsolution.py
index be5ab2a..a123db9 100644
--- a/tests/test_solidsolution.py
+++ b/tests/test_solidsolution.py
@@ -91,6 +91,20 @@ class olivine_ss(burnman.SolidSolution):
         burnman.SolidSolution.__init__(self, base_material, \
                           burnman.solutionmodel.SymmetricRegularSolution(base_material, enthalpy_interaction) )
 
+# Orthopyroxene solid solution
+class orthopyroxene(burnman.SolidSolution):
+    def __init__(self):
+        # Name
+        self.name='orthopyroxene'
+
+        base_material = [[forsterite(), 'Mg[Mg]Si2O6'], [forsterite(), '[Mg1/2Al1/2]2AlSiO6']]
+
+        # Interaction parameters
+        enthalpy_interaction=[[10.0e3]]
+
+        burnman.SolidSolution.__init__(self, base_material, \
+                          burnman.solutionmodel.SymmetricRegularSolution(base_material, enthalpy_interaction) )
+
 
 
 
@@ -155,5 +169,11 @@ class test_solidsolution(BurnManTest):
         Wh=ol_ss.solution_model.Wh[0][1]
         self.assertArraysAlmostEqual([Wh/4.0], [H_excess])
 
+    def test_order_disorder(self):
+        opx = orthopyroxene()
+        opx.set_composition( np.array([0.0, 1.0]) )
+        self.assertArraysAlmostEqual([opx.excess_gibbs], [0.])
+
+
 if __name__ == '__main__':
     unittest.main()



More information about the CIG-COMMITS mailing list