Mineral Equilibrium Functions
- Thermobar.mineral_equilibrium.add_Leake_Amp_Fields_Fig3bot(plot_axes, fontsize=8, color=[0.3, 0.3, 0.3], linewidth=0.5, lower_text=0.3, upper_text=0.7, text_labels=True)[source]
Code adapted from TAS plot (see https://bitbucket.org/jsteven5/tasplot/src/90ed07ec34fa13405e7d2d5c563341b3e5eef95f/tasplot.py?at=master) Following Putirka, all Fe is assumed to be Fet
- Thermobar.mineral_equilibrium.calculate_An_Namur2011(liq_comps, T=None)[source]
calculates equilibrium An contents using the T and H2O-independent model of Namur et al. (2011). Returns An calculated using all 3 models, and selects the most suitable model based on the melt composition.
- Parameters:
- Returns:
DataFrame with An contents for all three equations, and an indication of the most
suitable model using the major element filters of Namur et al. (2011) based on Si-Na-K.
- Thermobar.mineral_equilibrium.calculate_cpx_rhodes_diagram_lines(Min_Mgno, Max_Mgno, T=None, KdMin=None, KdMax=None)[source]
Input minimum and maximum liquid Mg#, calculates lines for equilibrium Cpx Mg# contents based on user-specified Kd Fe-Mg options.
- Parameters
- Min_Mgno: float or int.
Min liquid Mg# you want equilibrium lines for
- Max_Mgno: float or int.
Max liquid Mg# you want equilibrium lines for
By default, returns lines calculated using 0.28+-0.08 (Putirka, 2008). Can get other outputs as well using:
- T: float or int (optional)
Temperature in Kelvin. returns lines calculated using Kd from T-sensitive eq 35 of Putirka (2008) (as well as +-0.08 error bounds)
- KdMin: float (optional)
calculates equilibrium line for a user-specified Minimum Kd.
- KdMax: float (optional)
calculates equilibrium line for a user-specified Minimum Kd
Mg#_Liq (100 points between Min_Mgno and Max_Mgno), and a variety of equilibrium Cpx Mg#s
- Thermobar.mineral_equilibrium.calculate_eq_cpx_Mg_number(liq_comps, Fe3Fet_Liq=None, Kd_model=None, T=None)[source]
calculates equilibrium Cpx Mg#s based on inputtted liquid compositions.
- Parameters:
liq_comps (pandas.DataFrame) – Liquid compositions with column headings SiO2_Ol, MgO_Ol etc.
- Kd_model: str, int or float
Specify which Kd model you wish to use. “Putirka2008”: uses eq 35 of Putirka (2008), function of T. “Masotta2013”: Uses Masotta (2013), function of T, an Na and K in the melt. if int or float, uses that Kd.
- Return type:
DataFrame with equilibrium Mg#s, with column headings corresponding to model choosen.
- Thermobar.mineral_equilibrium.calculate_eq_ol_content(liq_comps, Kd_model, ol_comps=None, T=None, P=None, Fe3Fet_Liq=None, ol_fo=None, H2O_Liq=None, logfo2=None)[source]
calculates equilibrium forsterite contents based on inputtted liquid compositions.
- Parameters
- liq_comps: pandas.DataFrame
Liquid compositions with column headings SiO2_Ol, MgO_Ol etc.
- Kd_model: str, int or float
Specify which Kd model you wish to use.
int or float: e.g. Kd=0.35, will return that number.
“Shea2022”: Uses 0.335+-0.1 (not sensitive to P, T, or ol Fo content. For hawaiian tholeiites)
“Roeder1970”: uses Kd=0.3+0.03 (Not sensitive to P, T, or Ol Fo content)
“Matzen2011”: uses Kd=0.34+0.012 (Not sensitive to P, T, or Ol Fo content)
“Toplis2005”: calculates Kd based on melt SiO2, Na2O, K2O, P, T, H2O, Ol Fo content. Users can specify a ol_fo content, or the function iterates Kd and Fo and returns both.
“Putirka2016”: Uses equation 8a, 8b and 8c of Putirka (2016) These are recomended when the proportion of Fe2O3 is known. 8a=0.33+-0.04 (constant) 8b= function of P, Si, Na and K 8c= function of Si, Na and K
Also uses equation 9a and 9b of Putirka, which are designed for FeOt. 9a is 0.29+-0.051, 9b is a function of Si, P, Na and K, and fo2.
“All”: Returns outputs for all models
- Fe3FeT: optional, float or int.
overwrites Fe3Fet_Liq in liq_comps DataFrame
- Additional required inputs for Toplis, 2005:
P: Pressure in kbar T: Temperature in Kelvin H2O: melt H2O content Optional:
ol_fo: If specify Fo content (decimal, 0-1), calculates Kd Else, will iterate to find equilibrium Ol content and Kd.
- pandas DataFrame
returns equilibrium olivine contents (+- sigma for Roeder and Matzen). For Toplis, returns Kd-Ol Fo pair if an olivine-forsterite content wasn’t specified
- Thermobar.mineral_equilibrium.calculate_eq_olivine(Kd, *, Liq_Mgno)[source]
calculates equilibrium forsterite contents based on inputtted liquid Mg# and Kd Fe-Mg
- Thermobar.mineral_equilibrium.calculate_eq_plag_An_number(liq_comps, T=None, P=None, An_model=None)[source]
calculates equilibrium Plag An#s based on inputtted liquid compositions.
- Parameters:
- An_model: str, int or float
Specify which An model you wish to use. “Putirka2005”: uses equilibrium An-Ab-Or from the Putirka (2005), as implemented in the spreadsheets of K. Putirka “Namur2011”: Uses equilibrium An from Namur (2011) “All”: returns values from Putirka2005 and Namur
- Return type:
DataFrame with equilibrium An values, with column headings corresponding to model choosen.
- Thermobar.mineral_equilibrium.calculate_eq_px_content(liq_comps, Fe3Fet_Liq=None, px='Opx')[source]
calculates equilibrium pyroxene contents based on inputtted liquid compositions using the Si-sensitive expression of Putirka (2008).
- Parameters
- liq_comps: pandas.DataFrame
Liquid compositions with column headings SiO2_Ol, MgO_Ol etc.
px: ‘Opx’ or ‘Cpx’
- Fe3FeT: optional, float or int.
overwrites Fe3Fet_Liq in liq_comps DataFrame
- pandas DataFrame
returns equilibrium Px Mg#s (+- sigma) from Putirka 2008
- Thermobar.mineral_equilibrium.calculate_ol_rhodes_diagram_lines(Min_Mgno, Max_Mgno, KdMin=None, KdMax=None)[source]
Input minimum and maximum liquid Mg#, calculates lines for equilibrium Fo content using Roeder and Emslie (1970) and Matzen (2011) Kd values.
- Parameters
- Min_Mgno: float or int
Min liquid Mg# you want equilibrium lines for
- Max_Mgno: float or int
Max liquid Mg# you want equilibrium lines for
- KdMin: float
Optional. Also returns line for a user-specified Minimum Kd.
- KdMax: float
Optional. Also returns line for a user-specified Maximum Kd.
- Returns
Mg#_Liq (100 points between Min) Eq_OlRoeder (Kd=0.3): Line calculated for Kd=0.3 (Roeder and Emslie, 1970 preferred value) Eq_OlRoeder (Kd=0.33): Line calculated for Kd=0.33 (Roeder and Emslie, 1970 +1 sigma) Eq_OlRoeder (Kd=0.27): Line calculated for Kd=0.27 (Roeder and Emslie, 1970 -1 sigma) Eq_OlMatzen (Kd=0.34): Line calculated for Kd=0.34 (Matzen et al. 2011 preferred value) Eq_OlMatzen (Kd=0.328): Line calculated for Kd=0.328 (Matzen et al. 2011 - 1 sigma) Eq_OlMatzen (Kd=0.352): Line calculated for Kd=0.352 (Matzen et al. 2011 + 1 sigma)
- If user specifies KdMin and KdMax also returns:
Eq_Ol_KdMax=KdMax, Eq_Ol_KdMin=KdMin
- Thermobar.mineral_equilibrium.calculate_opx_rhodes_diagram_lines(Min_Mgno, Max_Mgno, T=None, KdMin=None, KdMax=None, liq_comps=None)[source]
Input minimum and maximum liquid Mg#, calculates lines for equilibrium Opx Mg# content using a variety of choices for Kd Fe-Mg.
- Parameters
- Min_Mgno: float or int.
Min liquid Mg# you want equilibrium lines for
- Max_Mgno: float or int.
Max liquid Mg# you want equilibrium lines for
By default, returns Mg#s for 0.29+-0.06 (Putirka). Can get other outputs as well using:
- KdMin: float. Optional.
Also returns line for a user-specified Minimum Kd.
- KdMax: float. Optional.
Also returns line for a user-specified Maximum Kd.
- liq_comps: pandas.DataFrame. Optional
Uses average cation fraction of XSi in the liquid to calculate Kd Fe-Mg using the expression = 0.4805 - 0.3733 XSi (Putirka, 2008)
- Returns
Mg#_Liq (100 points between Min) and equilibrium Opx compositions depending on inputs. Returns headings corresponding to options selected above.
- Thermobar.mineral_equilibrium.calculate_toplis2005_kd(X_fo, *, SiO2_mol, Na2O_mol, K2O_mol, P, H2O, T)[source]
calculates olivine-liq Kd Fe-Mg using the expression of Toplis, 2005.
- Thermobar.mineral_equilibrium.feldspar_plotting_from_MELTS(df)[source]
Takes PetThermoTools output dict[‘All’] and calculates the components needed to plot Plag1, Plag2, Kspar1, Kspar2, etc. Returns a ternary plot figure, and a dictionary with a key for each phase it finds :param df: dict[‘All’] from MELTS output :type df: pd.DataFrame
- Returns:
results, fig
- Return type:
Dictionary with a key for each of the 3 required coordinates, and the fig object itself so natural data can be added to it.
- Thermobar.mineral_equilibrium.is_all_nan(array)[source]
Check if all elements in the array are NaN.
- Thermobar.mineral_equilibrium.plot_fspar_classification(figsize=(6, 6), major_grid=False, minor_grid=False, labels=False, ticks=True, major_grid_kwargs={'c': 'k', 'ls': ':', 'lw': 0.5}, minor_grid_kwargs={'c': 'lightgrey', 'ls': '-', 'lw': 0.25}, fontsize_component_labels=10, fontsize_axes_labels=14, Anorthite_label='An', Anorthoclase_label='AnC', Albite_label='Ab', Oligoclase_label='Ol', Andesine_label='Ad', Labradorite_label='La', Bytownite_label='By', Sanidine_label='San')[source]
Plotting a feldspar ternary classification diagram according to Deer, Howie, and Zussman 1992 3rd edition. This function relies heavily on the python package python-ternary by Marc Harper et al. (2015). [chebee7i; Nick Swanson-Hysell; The Gitter Badger; Maximiliano Greco; Guido Zuidhof, 2015]
Inputs: figsize: tuple for figure size same as matplotlib
major_grid: boolean, whether or not to show major grid lines shows lines every .2. Default = False
minor_grid: boolean, whether or not to show minor grid lines…shows lines every .05. Default = False
labels: boolean, whether or not to show abbreviated field labels for feldspar classification
- ticks: boolean.
If True, adds ticks onto side of axes
major_grid_kwargs: dict, inherited matplotlib kwargs for styling major grid
minor_grid_kwargs: dict, inherited matplotlib kwargs for styling minor grid
…labels: str Can overwrite defauls for what the different regions are named. Defaults below. Anorthite_label=’An’, Anorthoclase_label=’AnC’, Albite_label=’Ab’, Oligoclase_label=’Ol’, Andesine_label=’Ad’, Labradorite_label=’La’, Bytownite_label=’By’, Sanidine_label=’San’,
Returns:
fig: matplotlib figure
tax: ternary axis subplot from ternary package. To use matplotlib ax level styling and functions:
# Example ax = tax.get_axes() ax.set_title(‘my title’)
- Thermobar.mineral_equilibrium.plot_px_classification(figsize=(7, 5), cut_in_half=True, major_grid=False, minor_grid=False, labels=False, major_grid_kwargs={'c': 'k', 'ls': ':', 'lw': 0.5}, minor_grid_kwargs={'c': 'lightgrey', 'ls': '-', 'lw': 0.25}, fontsize_component_labels=10, fontsize_axes_labels=14, Enstatite_label='Enstatite', Ferrosilite_label='Ferrosilite', Pigeonite_label='Pigeonite', Augite_label='Augite', Diopside_label='Diopside', Hedenbergite_label='Hedenbergite')[source]
Plotting a pyroxene ternary classification diagram according to Deer, Howie, and Zussman 1992 3rd edition. This function relies heavily on the python package python-ternary by Marc Harper et al. (2015). [chebee7i; Nick Swanson-Hysell; The Gitter Badger; Maximiliano Greco; Guido Zuidhof, 2015]
Inputs: figsize: tuple
for figure size same as matplotlib. Default is 7-5, assuming you’ll cut the top off.
- cut_in_half: boolean
If True, cuts the top off to give the pyroxene quadrilateral.
- major_grid: boolean
whether or not to show major grid lines shows lines every .2. Default = False
- minor_grid: boolean,
whether or not to show minor grid lines…shows lines every .05. Default = False
- labels: boolean,
whether or not to show abbreviated field labels for pyroxene classification
- major_grid_kwargs: dict,
inherited matplotlib kwargs for styling major grid
- minor_grid_kwargs: dict,
inherited matplotlib kwargs for styling minor grid
…labels: str Can overwrite defauls for what the different regions are named. Defaults below. Enstatite_label=’Enstatite’ Ferrosilite_label=’Ferrosilite’ Pigeonite_label=’Pigeonite’ Augite_label=’Augite’ Diopside_label=’Diopside’ Hedenbergite_label=’Hedenbergite’
Returns:
fig: matplotlib figure
tax: ternary axis subplot from ternary package. To use matplotlib ax level styling and functions:
# Example ax = tax.get_axes() ax.set_title(‘my title’)
- Thermobar.mineral_equilibrium.pyroxene_plotting_from_MELTS(df)[source]
Takes PetThermoTools output dict[‘All’] and calculates the components needed to plot Opx, Cpx, Cpx2, Cpx3. Returns a ternary plot figure, and a dictionary with a key for each phase it finds :param df: dict[‘All’] from MELTS output :type df: pd.DataFrame
- Returns:
results, fig
- Return type:
Dictionary with a key for each of the 3 required coordinates, and the fig object itself so natural data can be added to it.
- Thermobar.mineral_equilibrium.tern_points(right, top, left)[source]
Tern_points takes 3 equal size 1D arrays or pandas series and organizes them into points to be plotted on a ternary with the following arrangement:(lower right,top,lower left). This is a generic function to allow flexibiliy, see also tern_points_px to calculate the components for pyroxene, and tern_points_fspar to calculate components and coordinates for feldspar
Inputs: x = 1D array like (lower right vertex) y = 1D array like (top vertex) z = 1D array like (lower left vertex)
- Thermobar.mineral_equilibrium.tern_points_cpx(px_comps=None)[source]
Tern_points takes a dataframe, finds columns with _Cpx in them, and calculates Fs, En and Wo, and returns co-ordinates to plot on a ternary diagram as a np.array
- Thermobar.mineral_equilibrium.tern_points_fspar(fspar_comps=None)[source]
Tern_points takes feldspar compositions, and calculates An, Ab, Or, and returns co-ordinates to plot on a ternary diagram as a np.array You can input plag or kspar compositions as fspar_comps