pyEQL Overview

pyeql-logo.png

pyEQL is an open-source python library for solution chemistry calculations and ion properties developed by the Kingsbury Lab at Princeton University.

Documentation | How to Install | GitHub

Installation

Uncomment and run the code cell below, if you do not already have pyEQL

[1]:
# pip install pyEQL

Main feature: The Solution class

[2]:
from pyEQL import Solution
[3]:
s1 = Solution({"Mg+2": "0.2 mol/L", "Cl-1": "0.4 mol/L"}, temperature='20 degC')

Bulk Properties

[4]:
s1.density
[4]:
1.01387468274498 kg/l
[5]:
s1.conductivity
[5]:
2.9723368076814505 S/m
[6]:
s1.volume
[6]:
1 l
[7]:
s1.pressure
[7]:
1 atm
[8]:
s1.temperature
[8]:
293.15 K
[9]:
s1.osmotic_pressure
[9]:
1286751.9671270065 Pa

Composition

[10]:
s1.components
[10]:
{'H2O(aq)': 55.22159416581102, 'Cl[-1]': 0.4, 'Mg[+2]': 0.2, 'H[+1]': 1e-07, 'OH[-1]': 1e-07}
[11]:
s1.solvent
[11]:
'H2O(aq)'
[12]:
s1.cations
[12]:
{'Mg[+2]': 0.2, 'H[+1]': 1e-07}
[13]:
s1.anions
[13]:
{'Cl[-1]': 0.4, 'OH[-1]': 1e-07}
[14]:
s1.neutrals
[14]:
{'H2O(aq)': 55.22159416581102}

Species Concentrations

[15]:
s1.get_amount('Mg+2', 'M')
[15]:
0.20000000000000007 M
[16]:
s1.get_amount('Cl-', '%')
[16]:
1.3987132967563214
[17]:
s1.get_amount('Mg+2', 'eq/L')
[17]:
0.4 mol/l
[18]:
s1.get_amount('Mg+2', 'ug/kg')
[18]:
4886249.788899191 µg/kg

Transport

[19]:
s1.get_transport_number('Na+')
[19]:
0.0
[20]:
s1.get_transport_number('Mg+2')
[20]:
0.3099794809803665
[21]:
s1.get_transport_number('Cl-')
[21]:
0.6900190851732657

Speciation

[22]:
s1.equilibrate()
[23]:
s1.components
[23]:
{'H2O(aq)': 55.22159416581102, 'Cl[-1]': 0.3832398866053062, 'Mg[+2]': 0.18323989223683687, 'MgCl[+1]': 0.0167601067972765, 'H[+1]': 1.2403217124548544e-07, 'OH[-1]': 9.844304910095208e-08, 'HCl(aq)': 5.431779796106619e-09, 'MgOH[+1]': 7.932688947003906e-15, 'O2(aq)': 3.1477611183050287e-26, 'HClO(aq)': 8.450945207723896e-29, 'ClO[-1]': 3.3676720804550185e-29, 'H2(aq)': 5.442721694626408e-35, 'ClO2[-1]': 0.0, 'ClO3[-1]': 0.0, 'ClO4[-1]': 0.0, 'HClO2(aq)': 0.0}

Saving Solution to a file

[24]:
from monty.serialization import dumpfn
dumpfn(s1, 'test_solution.json')
[25]:
s1.as_dict()
[25]:
{'@module': 'pyEQL.solution',
 '@class': 'Solution',
 '@version': '0.14.0.post1.dev19+gbc296a6.d20240313',
 'solutes': {'H2O(aq)': '55.22159416581102 mol',
  'Cl[-1]': '0.3832398866053062 mol',
  'Mg[+2]': '0.18323989223683687 mol',
  'MgCl[+1]': '0.0167601067972765 mol',
  'H[+1]': '1.2403217124548544e-07 mol',
  'OH[-1]': '9.844304910095208e-08 mol',
  'HCl(aq)': '5.431779796106619e-09 mol',
  'MgOH[+1]': '7.932688947003906e-15 mol',
  'O2(aq)': '3.1477611183050287e-26 mol',
  'HClO(aq)': '8.450945207723896e-29 mol',
  'ClO[-1]': '3.3676720804550185e-29 mol',
  'H2(aq)': '5.442721694626408e-35 mol',
  'ClO2[-1]': '0.0 mol',
  'ClO3[-1]': '0.0 mol',
  'ClO4[-1]': '0.0 mol',
  'HClO2(aq)': '0.0 mol'},
 'volume': '1 l',
 'temperature': '293.15 K',
 'pressure': '1 atm',
 'pH': 6.906465653690637,
 'pE': 8.5,
 'balance_charge': None,
 'solvent': 'H2O(aq)',
 'engine': 'native',
 'database': {'@module': 'maggma.stores.mongolike',
  '@class': 'JSONStore',
  '@version': '0.57.8',
  'paths': ['/home/ryan/miniconda3/envs/skagit2/code/pyEQL/src/pyEQL/database/pyeql_db.json'],
  'read_only': True,
  'serialization_option': None,
  'serialization_default': None,
  'key': 'formula'},
 'default_diffusion_coeff': 1.6106e-09,
 'log_level': 'ERROR'}

Units-Aware Calculations

[26]:
s1.volume.to('mL')
[26]:
1000.0000000000001 ml
[27]:
s1.volume.to('gal')
[27]:
0.26417205235814856 gal
[28]:
s1.osmotic_pressure.to('bar').magnitude
[28]:
12.634083700417097

Contribution Opportunities

Benchmarking - Compiling additional validation data for activity, conductivity, etc. - Quantifying error associated with different models - Refactoring unit tests suite to separate benchmarking

Documentation - Writing tutorials - Writing expanded docs - Cleaning up / updating docstrings

New Features - Better viscosity model - Expanded unit testing (increase test coverage to 90%) - Additional properties - Additional mixing rules / models for mixed electrolytes

Database - Expand database doverage to include additional species - More viscosity coefficients - Add ‘sho’ parameter - More diffusion coefficients

Software Engineering - Additional refactoring (e.g., mypy linting for robustness) - Bugfixes