[cig-commits] [commit] inversion, master, validate_MT_params: Bug fixes (a743951)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Fri Dec 12 18:25:48 PST 2014


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

On branches: inversion,master,validate_MT_params
Link       : https://github.com/geodynamics/burnman/compare/80c2a295c42dfdb38f83f6c1334bf7d8f97a8463...409647ff05dfad6a686198cac1481bd46b5e2e62

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

commit a743951a9f89d7b06cd1b6a0aa3670252ccab6c9
Author: Bob Myhill <myhill.bob at gmail.com>
Date:   Wed Sep 3 00:38:27 2014 +0200

    Bug fixes


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

a743951a9f89d7b06cd1b6a0aa3670252ccab6c9
 burnman/processchemistry.py           | 37 +++++++++++++++++++----------------
 burnman/test_solidsolution_parsing.py | 12 +++++++++++-
 2 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/burnman/processchemistry.py b/burnman/processchemistry.py
index bee88c5..00d9545 100644
--- a/burnman/processchemistry.py
+++ b/burnman/processchemistry.py
@@ -141,7 +141,6 @@ def ProcessSolidSolutionChemistry(formulae):
             are repeated for each element on each site
 
     """
-
     n_sites=formulae[0].count('[')
     n_endmembers=len(formulae)
 
@@ -155,8 +154,6 @@ def ProcessSolidSolutionChemistry(formulae):
     list_multiplicity=np.empty(shape=(n_sites))
     n_occupancies=0
 
-    s=re.split(r'\[', formulae[i])[1:]
-
         # Number of unique site occupancies (e.g.. Mg on X etc.)
     for endmember in range(n_endmembers):
         solution_formula=dict()
@@ -164,25 +161,29 @@ def ProcessSolidSolutionChemistry(formulae):
         s=re.split(r'\[', formulae[endmember])[1:]
 
         for site in range(n_sites):
-            site_occupancy=re.split(r'\]', s[site])[0]
-            mult=re.split('[A-Z][^A-Z]*',re.split(r'\]', s[site])[1])[0]
-            not_in_site=filter(None, re.split(r'\]', s[site]))[1]
-            not_in_site=not_in_site.replace(mult, '', 1)
+            site_split=re.split(r'\]', s[site])
+            site_occupancy=site_split[0]
+
+            mult=re.split('[A-Z][^A-Z]*',site_split[1])[0]
             if mult == '':
                 list_multiplicity[site]=1.0
             else:
-                list_multiplicity[site]=mult
+                list_multiplicity[site]=float(mult)
 
             # Loop over elements on a site
             elements=re.findall('[A-Z][^A-Z]*',site_occupancy)
+
             for i in range(len(elements)):
-                element_on_site=re.split('[0-9][^A-Z]*',elements[i])[0]
-                proportion_element_on_site=re.findall('[0-9][^A-Z]*',elements[i])
-                if len(proportion_element_on_site) == 0:
+
+                # Find the element and proportion on the site
+                element_split=re.split('([0-9][^A-Z]*)',elements[i])
+                element_on_site=element_split[0]
+                if len(element_split) == 1:
                     proportion_element_on_site=Fraction(1.0)
                 else:
-                    proportion_element_on_site=Fraction(proportion_element_on_site[0])
-                solution_formula[element_on_site]=solution_formula.get(element_on_site, 0.0) + float(mult)*proportion_element_on_site
+                    proportion_element_on_site=Fraction(element_split[1])
+
+                solution_formula[element_on_site]=solution_formula.get(element_on_site, 0.0) + list_multiplicity[site]*proportion_element_on_site
             
                 if element_on_site not in sites[site]:
                     n_occupancies=n_occupancies+1
@@ -194,10 +195,12 @@ def ProcessSolidSolutionChemistry(formulae):
                     element_index=sites[site].index(element_on_site)
                 list_occupancies[endmember][site][element_index]=proportion_element_on_site
 
-            # Loop over elements not on a site
-            for enamenumber in re.findall('[A-Z][^A-Z]*', not_in_site):
-                element=filter(None, re.split(r'(\d+)', enamenumber))
-                solution_formula[element[0]]=solution_formula.get(element[0], 0.0) + float(element[1])
+            if len(site_split) != 1:
+                not_in_site=filter(None, site_split[1])
+                not_in_site=not_in_site.replace(mult, '', 1)
+                for enamenumber in re.findall('[A-Z][^A-Z]*', not_in_site):
+                    element=filter(None, re.split(r'(\d+)', enamenumber))
+                    solution_formula[element[0]]=solution_formula.get(element[0], 0.0) + float(element[1])
 
         solution_formulae.append(solution_formula)
 
diff --git a/burnman/test_solidsolution_parsing.py b/burnman/test_solidsolution_parsing.py
index ba7b863..28af132 100644
--- a/burnman/test_solidsolution_parsing.py
+++ b/burnman/test_solidsolution_parsing.py
@@ -53,7 +53,7 @@ interaction_parameter=[excess_enthalpy,excess_entropy,excess_volume]
 molar_fraction = np.array([ 0.5, 0.2, 0.1, 0.2 ])
 
 
-
+print 'Garnet'
 solution_formulae, n_sites, sites, n_occupancies, endmember_occupancies, site_multiplicities = ProcessSolidSolutionChemistry([base_material[i][1] for i in range(len(base_material))])
 
 
@@ -63,4 +63,14 @@ print n_occupancies
 print sites
 print endmember_occupancies
 print site_multiplicities 
+print ''
+
+print 'Diopside - Ca-tschermaks molecule'
+solution_formulae, n_sites, sites, n_occupancies, endmember_occupancies, site_multiplicities = ProcessSolidSolutionChemistry(['[Ca][Mg][Si]2O6', '[Ca][Al][Si1/2Al1/2]2O6'])
 
+print solution_formulae
+print n_sites
+print n_occupancies
+print sites
+print endmember_occupancies
+print site_multiplicities 



More information about the CIG-COMMITS mailing list