This page was generated from docs/Examples/Melt_Inclusion_FeMg_Equilibrium/Ol_Melt_Inclusion_Mg_Fe_Eq_MultipleSamples.ipynb. Interactive online version: Binder badge.

Python Notebook Download

Multisample - Fe-Mg equilibrium in ol-hosted MIs

  • This notebook shows how to assess Fe-Mg equilibrium between olivines and melt inclusions, and between melt inclusions and co-erupted matrix glasses to let you assess Fe-Mg diffusion and post-entrapment crystallization

  • In this example, we have multiple samples in the spreadsheet, so first subsample out the rows we want based on sample name. You will have to change the sample names to reflect whatever column you use for this. Else, see single sample if you only have 1 sample in your spreadsheet

  • You can download the spreadsheet here: https://github.com/PennyWieser/Thermobar/blob/main/docs/Examples/Melt_Inclusion_FeMg_Equilibrium/2018_MIs_Glasses.xlsx

  • These plots are really for matrix glass data - if its whole-rock, your Mg-Fe equilibrium could be affected by olivine addition/subtraction, and you will need to consider this

[11]:
## Install Thermobar if you haven't already (remove # and press run)

# !pip install Thermobar
[12]:
# Loading various python things
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import Thermobar as pt

Loading a dataset

Load in the matrix glasses

[13]:
# We dont have to add _Liq as its all liquids,
# just specify the _Liq in the import
MG_input=pt.import_excel('2018_MIs_Glasses.xlsx',
                         sheet_name='Matrix_Glasses', suffix="_Liq")
MG_all=MG_input['my_input'] ## All columns
MG_Liqs=MG_input['Liqs'] ## Just Liquid columns
MG_Liqs.head()
[13]:
SiO2_Liq TiO2_Liq Al2O3_Liq FeOt_Liq MnO_Liq MgO_Liq CaO_Liq Na2O_Liq K2O_Liq Cr2O3_Liq P2O5_Liq H2O_Liq Fe3Fet_Liq NiO_Liq CoO_Liq CO2_Liq Sample_ID_Liq
0 50.6243 2.8773 13.0360 11.8288 0.1830 5.8471 10.2471 2.5120 0.5234 0.0 0.2689 0.0 0.0 0.0 0.0 0.0 0
1 50.0975 2.8840 12.8885 11.2897 0.1769 5.8521 9.9658 2.4681 0.5305 0.0 0.2652 0.0 0.0 0.0 0.0 0.0 1
2 50.1517 2.5827 13.0277 11.2420 0.2141 6.6763 10.6820 2.2884 0.4462 0.0 0.2068 0.0 0.0 0.0 0.0 0.0 2
3 50.2523 2.5686 13.1034 10.9155 0.1948 6.4934 10.7276 2.3660 0.4822 0.0 0.2329 0.0 0.0 0.0 0.0 0.0 3
4 51.1145 2.6104 13.2432 11.1522 0.1738 6.5764 10.6298 2.4155 0.4704 0.0 0.2393 0.0 0.0 0.0 0.0 0.0 4

Load in the melt inclusion data and the olivines

  • As they are in the same sheet, we have to make sure we have _Liq after the melt inclusion oxide, and _Ol after the olivine

[14]:
MIs_in=pt.import_excel('2018_MIs_Glasses.xlsx',
                         sheet_name='MIs_Ols')
MIs_Ol=MIs_in['Ols']
MIs_Liq=MIs_in['Liqs']
MIs_input=MIs_in['my_input']

Find each sample for melt inclusions

[15]:
MIs_LL4_index=MIs_input['SpecificID']=="LL4"
MIs_LL7_index=MIs_input['SpecificID']=="LL7"
MIs_LL8_index=MIs_input['SpecificID']=="LL8"

Find each sample for Glasses

[16]:
MGs_LL4_index=MG_all['SpecificID']=="LL4"
MGs_LL7_index=MG_all['SpecificID']=="LL7"
MGs_LL8_index=MG_all['SpecificID']=="LL8"

Workflow 1: Assess if the olivines are in equilibrium with the co-erupted matrix glass

1. Calculate Mg# for liquids

[17]:
Liq_Mgno_calc=pt.calculate_liq_mgno(liq_comps=MG_Liqs, Fe3Fet_Liq=0.15)

Liq_Mgno_calc.head()

# Calculate mean value to plot for each sample
Liq_Mgno_calc_mean_LL4=np.mean(Liq_Mgno_calc.loc[MGs_LL4_index])
Liq_Mgno_calc_mean_LL7=np.mean(Liq_Mgno_calc.loc[MGs_LL7_index])
Liq_Mgno_calc_mean_LL8=np.mean(Liq_Mgno_calc.loc[MGs_LL8_index])

2. Calculate Olivine Fo contents

[18]:
Ol_Fo_Calc=pt.calculate_ol_fo(ol_comps=MIs_Ol)

3. Calculate fields you want to plot on a Rhodes diagram

[19]:
Rhodes=pt.calculate_ol_rhodes_diagram_lines(Min_Mgno=0.5, Max_Mgno=0.7)
Rhodes.head()
[19]:
Mg#_Liq Eq_Ol_Fo_Roeder (Kd=0.3) Eq_Ol_Fo_Roeder (Kd=0.27) Eq_Ol_Fo_Roeder (Kd=0.33) Eq_Ol_Fo_Matzen (Kd=0.34) Eq_Ol_Fo_Matzen (Kd=0.328) Eq_Ol_Fo_Matzen (Kd=0.352)
0 0.500000 0.769231 0.787402 0.751880 0.746269 0.753012 0.739645
1 0.502020 0.770662 0.788751 0.753384 0.747796 0.754512 0.741198
2 0.504040 0.772087 0.790095 0.754883 0.749317 0.756006 0.742745
3 0.506061 0.773506 0.791432 0.756375 0.750832 0.757493 0.744286
4 0.508081 0.774919 0.792763 0.757861 0.752341 0.758975 0.745822

4. Plot the Kd model you want, along with the olivine and glass Mg

[20]:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5))

# Plotting for Roeder and Emslie
ax1.set_title('Roeder and Emslie, 1970')
# Plotting equilibrium lines
ax1.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Roeder (Kd=0.27)'], ':k')
ax1.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Roeder (Kd=0.33)'], ':k')
ax1.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Roeder (Kd=0.3)'], '-k')

# Plotting data

ax1.plot(Ol_Fo_Calc.loc[MIs_LL4_index]*0+Liq_Mgno_calc_mean_LL4,
         Ol_Fo_Calc.loc[MIs_LL4_index], 'ok', mfc='blue')

ax1.plot(Ol_Fo_Calc.loc[MIs_LL7_index]*0+Liq_Mgno_calc_mean_LL7,
         Ol_Fo_Calc.loc[MIs_LL7_index], 'ok', mfc='orange')

ax1.plot(Ol_Fo_Calc.loc[MIs_LL8_index]*0+Liq_Mgno_calc_mean_LL8,
         Ol_Fo_Calc.loc[MIs_LL8_index], 'ok', mfc='red')

ax2.set_title('Matzen (2011)')
# Plotting equilibrium lines
ax2.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Matzen (Kd=0.328)'], ':k')
ax2.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Matzen (Kd=0.352)'], ':k')
ax2.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Matzen (Kd=0.34)'], '-k')
# Plotting data
ax2.plot(Ol_Fo_Calc.loc[MIs_LL4_index]*0+Liq_Mgno_calc_mean_LL4,
         Ol_Fo_Calc.loc[MIs_LL4_index], 'ok', mfc='blue')

ax2.plot(Ol_Fo_Calc.loc[MIs_LL7_index]*0+Liq_Mgno_calc_mean_LL7,
         Ol_Fo_Calc.loc[MIs_LL7_index], 'ok', mfc='orange')

ax2.plot(Ol_Fo_Calc.loc[MIs_LL8_index]*0+Liq_Mgno_calc_mean_LL8,
         Ol_Fo_Calc.loc[MIs_LL8_index], 'ok', mfc='red')
ax1.set_ylabel('Ol Fo content')
ax1.set_xlabel('Glass Mg#')
ax2.set_xlabel('Glass Mg#')
ax1.set_ylim([0.74, 0.9])
ax2.set_ylim([0.74, 0.9])
ax1.set_xlim([0.5, 0.6])
ax2.set_xlim([0.5, 0.6])
[20]:
(0.5, 0.6)
../../_images/Examples_Melt_Inclusion_FeMg_Equilibrium_Ol_Melt_Inclusion_Mg_Fe_Eq_MultipleSamples_20_1.png
  • We can see that a lot of the olivines are way to primitive to be in equilibrium with the co-erupted liquid, regardless of what Kd model we use. This is the first sign that the olivines have undergone extensive post-entrapment cooling and crystallization.

Workflow 2: Assess if the olivines and their melt inclusions are in equilibrium

  • If post entrapment crystallization occurs, then the crystals erupt immediatly, the melt inclusion and host olivine will be out of Mg-Fe equilibirum. -However, as Danysuhevsky et al. show in a series of papers if sufficient time passes between the cooling event driving PEC and eruption, Fe-Mg will re-equilbrate, Fe will be lost from the inclusion, and the melt inclusion will re-approach equilibrium with its host olivine

1. Calculate melt inclusion Mg

[21]:
MI_Mgno_calc=pt.calculate_liq_mgno(liq_comps=MIs_Liq, Fe3Fet_Liq=0.15)

2. Plot on a rhodes diagram

[22]:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5))

# Plotting for Roeder and Emslie
ax1.set_title('Roeder and Emslie, 1970')
# Plotting equilibrium lines
ax1.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Roeder (Kd=0.27)'], ':k')
ax1.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Roeder (Kd=0.33)'], ':k')
ax1.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Roeder (Kd=0.3)'], '-k')

# Plotting data
ax1.plot(MI_Mgno_calc.loc[MIs_LL4_index], Ol_Fo_Calc.loc[MIs_LL4_index], 'ok', mfc='blue')
ax1.plot(MI_Mgno_calc.loc[MIs_LL7_index], Ol_Fo_Calc.loc[MIs_LL7_index], 'ok', mfc='orange')
ax1.plot(MI_Mgno_calc.loc[MIs_LL8_index], Ol_Fo_Calc.loc[MIs_LL8_index], 'ok', mfc='red')

ax2.set_title('Matzen (2011)')
# Plotting equilibrium lines
ax2.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Matzen (Kd=0.328)'], ':k')
ax2.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Matzen (Kd=0.352)'], ':k')
ax2.plot(Rhodes['Mg#_Liq'], Rhodes['Eq_Ol_Fo_Matzen (Kd=0.34)'], '-k')
# Plotting data
ax2.plot(MI_Mgno_calc.loc[MIs_LL4_index], Ol_Fo_Calc.loc[MIs_LL4_index], 'ok', mfc='blue')
ax2.plot(MI_Mgno_calc.loc[MIs_LL7_index], Ol_Fo_Calc.loc[MIs_LL7_index], 'ok', mfc='orange')
ax2.plot(MI_Mgno_calc.loc[MIs_LL8_index], Ol_Fo_Calc.loc[MIs_LL8_index], 'ok', mfc='red')

ax1.set_ylabel('Ol Fo content')
ax1.set_xlabel('Melt inclusion Mg#')
ax2.set_xlabel('Melt inclusion Mg#')
ax1.set_ylim([0.74, 0.92])
ax2.set_ylim([0.74, 0.92])
ax1.set_xlim([0.5, 0.7])
ax2.set_xlim([0.5, 0.7])
[22]:
(0.5, 0.7)
../../_images/Examples_Melt_Inclusion_FeMg_Equilibrium_Ol_Melt_Inclusion_Mg_Fe_Eq_MultipleSamples_26_1.png
  • We can see using the Roeder and Emslie model, the melt inclusions are perfectly in line with the equilibrium field. Combined with the extensive olivine-matrix glass Fe-Mg disequilibrium, this shows extensive PEC, followed by diffusive re-equilibration

  • Another line of evidence comes from plotting matrix glass and melt inclusoins in MgO-FeO space, its clear MI have lost abundant Fe

[23]:
plt.plot(MIs_Liq['MgO_Liq'].loc[MIs_LL4_index], MIs_Liq['FeOt_Liq'].loc[MIs_LL4_index],
         'ok', mfc='blue', label='LL4 MIs')
plt.plot(MIs_Liq['MgO_Liq'].loc[MIs_LL7_index], MIs_Liq['FeOt_Liq'].loc[MIs_LL7_index],
         'ok', mfc='orange', label='LL7 MIs')
plt.plot(MIs_Liq['MgO_Liq'].loc[MIs_LL8_index], MIs_Liq['FeOt_Liq'].loc[MIs_LL8_index],
         'ok', mfc='red', label='LL8 MIs')
plt.plot(MG_Liqs['MgO_Liq'],MG_Liqs['FeOt_Liq'], '^k', mfc='k', label='MG')
plt.xlabel('MgO Glass (wt%)')
plt.ylabel('FeOt Glass (wt%)')
plt.legend()
[23]:
<matplotlib.legend.Legend at 0x272135b7310>
../../_images/Examples_Melt_Inclusion_FeMg_Equilibrium_Ol_Melt_Inclusion_Mg_Fe_Eq_MultipleSamples_29_1.png