MagmaSat: Calculate Degassing Path#

Calculates the CO2-H2O concentrations in a melt during decompression and fluid exsolution.

This uses the VESIcal python library and is a preview of a forthcoming version of VESIcal compatible with the new version of thermoengine.

Open this code in an executable MyBinder instance (MyBinder links may be slow to load– please be patient!):

https://mybinder.org/badge_logo.svg

To install the preview version of VESIcal that works with the new pip installable version of thermoengine, run this command (uncomment first):

%pip install kaylai/VESIcal@thermoenginelite

import VESIcal as v

Specify the composition of the liquid. Here a basaltic composition is given as an example:

oxide_comp = {
        'SiO2':49.91,
        'TiO2': 1.47,
        'Al2O3': 17.91,
        'Fe2O3': 2.45,
        'FeO':  7.02,
        'MnO':  0.16,
        'MgO':  6.62,
        'CaO':  10.02,
        'Na2O':  3.02,
        'K2O':  0.64,
        'P2O5':  0.2,
        'H2O': 2.0,
        'CO2': 0.5
        }

Now convert this to a VESIcal Sample object (this allows the code to deal with unit conversions, normalisation, etc)

sample = v.Sample(oxide_comp)

## Open System Degassing Calculation

During open system degassing the exsolved vapour is lost from the system at each decompression step.

open_df = v.calculate_degassing_path(sample=sample, temperature=1000.0, fractionate_vapor=1.0).result
Finding saturation point... /home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()


[                    ] 2% Calculating degassing path...
[                    ] 4% Calculating degassing path...
[=                   ] 6% Calculating degassing path...
[=                   ] 8% Calculating degassing path...
[=                   ] 10% Calculating degassing path...
[==                  ] 12% Calculating degassing path...
[==                  ] 13% Calculating degassing path...
[===                 ] 15% Calculating degassing path...
[===                 ] 17% Calculating degassing path...
[===                 ] 19% Calculating degassing path...
[====                ] 21% Calculating degassing path...
[====                ] 23% Calculating degassing path...
[=====               ] 25% Calculating degassing path...
[=====               ] 27% Calculating degassing path...
[=====               ] 29% Calculating degassing path...
[======              ] 31% Calculating degassing path...
[======              ] 33% Calculating degassing path...
[======              ] 35% Calculating degassing path...
[=======             ] 37% Calculating degassing path...
[=======             ] 38% Calculating degassing path...
[========            ] 40% Calculating degassing path...
[========            ] 42% Calculating degassing path...
[========            ] 44% Calculating degassing path...
[=========           ] 46% Calculating degassing path...
[=========           ] 48% Calculating degassing path...
[==========          ] 50% Calculating degassing path...
[==========          ] 52% Calculating degassing path...
[==========          ] 54% Calculating degassing path...
[===========         ] 56% Calculating degassing path...
[===========         ] 58% Calculating degassing path...
[===========         ] 60% Calculating degassing path...
[============        ] 62% Calculating degassing path...
[============        ] 63% Calculating degassing path...
[=============       ] 65% Calculating degassing path...
[=============       ] 67% Calculating degassing path...
[=============       ] 69% Calculating degassing path...
[==============      ] 71% Calculating degassing path...
[==============      ] 73% Calculating degassing path...
[===============     ] 75% Calculating degassing path...
[===============     ] 77% Calculating degassing path...
[===============     ] 79% Calculating degassing path...
[================    ] 81% Calculating degassing path...
[================    ] 83% Calculating degassing path...
[================    ] 85% Calculating degassing path...
[=================   ] 87% Calculating degassing path...
[=================   ] 88% Calculating degassing path...
[==================  ] 90% Calculating degassing path...
[==================  ] 92% Calculating degassing path...
[==================  ] 94% Calculating degassing path...
[=================== ] 96% Calculating degassing path...
[=================== ] 98% Calculating degassing path...
[====================] 100% Calculating degassing path...

## Closed System Degassing Calculation

During closed system degassing the exsolved vapour remains with the melt, but its quantity and composition evolve throughout the calculation.

closed_df = v.calculate_degassing_path(sample=sample, temperature=1000.0).result
Finding saturation point... /home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()


[                    ] 2% Calculating degassing path...
[                    ] 4% Calculating degassing path...
[=                   ] 6% Calculating degassing path...
[=                   ] 8% Calculating degassing path...
[=                   ] 10% Calculating degassing path...
[==                  ] 12% Calculating degassing path...
[==                  ] 13% Calculating degassing path...
[===                 ] 15% Calculating degassing path...
[===                 ] 17% Calculating degassing path...
[===                 ] 19% Calculating degassing path...
[====                ] 21% Calculating degassing path...
[====                ] 23% Calculating degassing path...
[=====               ] 25% Calculating degassing path...
[=====               ] 27% Calculating degassing path...
[=====               ] 29% Calculating degassing path...
[======              ] 31% Calculating degassing path...
[======              ] 33% Calculating degassing path...
[======              ] 35% Calculating degassing path...
[=======             ] 37% Calculating degassing path...
[=======             ] 38% Calculating degassing path...
[========            ] 40% Calculating degassing path...
[========            ] 42% Calculating degassing path...
[========            ] 44% Calculating degassing path...
[=========           ] 46% Calculating degassing path...
[=========           ] 48% Calculating degassing path...
[==========          ] 50% Calculating degassing path...
[==========          ] 52% Calculating degassing path...
[==========          ] 54% Calculating degassing path...
[===========         ] 56% Calculating degassing path...
[===========         ] 58% Calculating degassing path...
[===========         ] 60% Calculating degassing path...
[============        ] 62% Calculating degassing path...
[============        ] 63% Calculating degassing path...
[=============       ] 65% Calculating degassing path...
[=============       ] 67% Calculating degassing path...
[=============       ] 69% Calculating degassing path...
[==============      ] 71% Calculating degassing path...
[==============      ] 73% Calculating degassing path...
[===============     ] 75% Calculating degassing path...
[===============     ] 77% Calculating degassing path...
[===============     ] 79% Calculating degassing path...
[================    ] 81% Calculating degassing path...
[================    ] 83% Calculating degassing path...
[================    ] 85% Calculating degassing path...
[=================   ] 87% Calculating degassing path...
[=================   ] 88% Calculating degassing path...
[==================  ] 90% Calculating degassing path...
[==================  ] 92% Calculating degassing path...
[==================  ] 94% Calculating degassing path...
[=================== ] 96% Calculating degassing path...
[=================== ] 98% Calculating degassing path...
[====================] 100% Calculating degassing path...

## Partially Closed System Degassing Calculation

During this calculation, only some of the exsolved fluid is lost at each step.

half_df = v.calculate_degassing_path(sample=sample, temperature=1000.0, fractionate_vapor=0.5).result
Finding saturation point... /home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()
/home/vscode/.local/lib/python3.10/site-packages/VESIcal/models/magmasat.py:208: RuntimeWarning: invalid value encountered in divide
  fluid_comp = fluid_comp/fluid_comp.sum()


[                    ] 2% Calculating degassing path...
[                    ] 4% Calculating degassing path...
[=                   ] 6% Calculating degassing path...
[=                   ] 8% Calculating degassing path...
[=                   ] 10% Calculating degassing path...
[==                  ] 12% Calculating degassing path...
[==                  ] 13% Calculating degassing path...
[===                 ] 15% Calculating degassing path...
[===                 ] 17% Calculating degassing path...
[===                 ] 19% Calculating degassing path...
[====                ] 21% Calculating degassing path...
[====                ] 23% Calculating degassing path...
[=====               ] 25% Calculating degassing path...
[=====               ] 27% Calculating degassing path...
[=====               ] 29% Calculating degassing path...
[======              ] 31% Calculating degassing path...
[======              ] 33% Calculating degassing path...
[======              ] 35% Calculating degassing path...
[=======             ] 37% Calculating degassing path...
[=======             ] 38% Calculating degassing path...
[========            ] 40% Calculating degassing path...
[========            ] 42% Calculating degassing path...
[========            ] 44% Calculating degassing path...
[=========           ] 46% Calculating degassing path...
[=========           ] 48% Calculating degassing path...
[==========          ] 50% Calculating degassing path...
[==========          ] 52% Calculating degassing path...
[==========          ] 54% Calculating degassing path...
[===========         ] 56% Calculating degassing path...
[===========         ] 58% Calculating degassing path...
[===========         ] 60% Calculating degassing path...
[============        ] 62% Calculating degassing path...
[============        ] 63% Calculating degassing path...
[=============       ] 65% Calculating degassing path...
[=============       ] 67% Calculating degassing path...
[=============       ] 69% Calculating degassing path...
[==============      ] 71% Calculating degassing path...
[==============      ] 73% Calculating degassing path...
[===============     ] 75% Calculating degassing path...
[===============     ] 77% Calculating degassing path...
[===============     ] 79% Calculating degassing path...
[================    ] 81% Calculating degassing path...
[================    ] 83% Calculating degassing path...
[================    ] 85% Calculating degassing path...
[=================   ] 87% Calculating degassing path...
[=================   ] 88% Calculating degassing path...
[==================  ] 90% Calculating degassing path...
[==================  ] 92% Calculating degassing path...
[==================  ] 94% Calculating degassing path...
[=================== ] 96% Calculating degassing path...
[=================== ] 98% Calculating degassing path...
[====================] 100% Calculating degassing path...

## Make a plot!

VESIcal provides a built-in method for visualising these results quickly:

v.plot(degassing_paths=[open_df, half_df, closed_df],
       degassing_path_labels=["Open", "Half", "Closed"])
plot magmasat degassing path
(<Figure size 1200x800 with 1 Axes>, <Axes: xlabel='H$_2$O wt%', ylabel='CO$_2$ wt%'>)

but you can also make a custom plot by interacting with the open_df, half_df, and closed_df dataframes directly. You can also save each one to a csv file for later use, of for plotting in another program (e.g. Excel):

open_df.to_csv('my_degassing_path.csv')

Total running time of the script: (0 minutes 18.329 seconds)

Gallery generated by Sphinx-Gallery