pyEQL 0.5.2__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyEQL/__init__.py +50 -43
- pyEQL/activity_correction.py +481 -707
- pyEQL/database/geothermal.dat +5693 -0
- pyEQL/database/llnl.dat +19305 -0
- pyEQL/database/phreeqc_license.txt +54 -0
- pyEQL/database/pyeql_db.json +35902 -0
- pyEQL/engines.py +793 -0
- pyEQL/equilibrium.py +148 -228
- pyEQL/functions.py +121 -416
- pyEQL/pint_custom_units.txt +2 -2
- pyEQL/presets/Ringers lactate.yaml +20 -0
- pyEQL/presets/normal saline.yaml +17 -0
- pyEQL/presets/rainwater.yaml +17 -0
- pyEQL/presets/seawater.yaml +29 -0
- pyEQL/presets/urine.yaml +26 -0
- pyEQL/presets/wastewater.yaml +21 -0
- pyEQL/salt_ion_match.py +53 -284
- pyEQL/solute.py +126 -191
- pyEQL/solution.py +2163 -2090
- pyEQL/utils.py +165 -0
- pyEQL-1.1.0.dist-info/AUTHORS.md +13 -0
- {pyEQL-0.5.2.dist-info → pyEQL-1.1.0.dist-info}/COPYING +1 -1
- pyEQL-0.5.2.dist-info/LICENSE → pyEQL-1.1.0.dist-info/LICENSE.txt +3 -7
- pyEQL-1.1.0.dist-info/METADATA +129 -0
- pyEQL-1.1.0.dist-info/RECORD +27 -0
- {pyEQL-0.5.2.dist-info → pyEQL-1.1.0.dist-info}/WHEEL +2 -1
- pyEQL/chemical_formula.py +0 -1006
- pyEQL/database/Erying_viscosity.tsv +0 -18
- pyEQL/database/Jones_Dole_B.tsv +0 -32
- pyEQL/database/Jones_Dole_B_inorganic_Jenkins.tsv +0 -75
- pyEQL/database/LICENSE +0 -4
- pyEQL/database/dielectric_parameter.tsv +0 -30
- pyEQL/database/diffusion_coefficient.tsv +0 -116
- pyEQL/database/hydrated_radius.tsv +0 -35
- pyEQL/database/ionic_radius.tsv +0 -35
- pyEQL/database/partial_molar_volume.tsv +0 -22
- pyEQL/database/pitzer_activity.tsv +0 -169
- pyEQL/database/pitzer_volume.tsv +0 -132
- pyEQL/database/template.tsv +0 -14
- pyEQL/database.py +0 -300
- pyEQL/elements.py +0 -4552
- pyEQL/logging_system.py +0 -53
- pyEQL/parameter.py +0 -435
- pyEQL/tests/__init__.py +0 -32
- pyEQL/tests/test_activity.py +0 -578
- pyEQL/tests/test_bulk_properties.py +0 -86
- pyEQL/tests/test_chemical_formula.py +0 -279
- pyEQL/tests/test_debye_length.py +0 -79
- pyEQL/tests/test_density.py +0 -106
- pyEQL/tests/test_dielectric.py +0 -153
- pyEQL/tests/test_effective_pitzer.py +0 -276
- pyEQL/tests/test_mixed_electrolyte_activity.py +0 -154
- pyEQL/tests/test_osmotic_coeff.py +0 -99
- pyEQL/tests/test_pyeql_volume_concentration.py +0 -428
- pyEQL/tests/test_salt_matching.py +0 -337
- pyEQL/tests/test_solute_properties.py +0 -251
- pyEQL/water_properties.py +0 -352
- pyEQL-0.5.2.dist-info/AUTHORS +0 -7
- pyEQL-0.5.2.dist-info/METADATA +0 -72
- pyEQL-0.5.2.dist-info/RECORD +0 -47
- pyEQL-0.5.2.dist-info/entry_points.txt +0 -3
- {pyEQL-0.5.2.dist-info → pyEQL-1.1.0.dist-info}/top_level.txt +0 -0
pyEQL/utils.py
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""
|
|
2
|
+
pyEQL utilities
|
|
3
|
+
|
|
4
|
+
:copyright: 2013-2024 by Ryan S. Kingsbury
|
|
5
|
+
:license: LGPL, see LICENSE for more details.
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from collections import UserDict
|
|
11
|
+
from functools import lru_cache
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from iapws import IAPWS95, IAPWS97
|
|
15
|
+
from pymatgen.core.ion import Ion
|
|
16
|
+
|
|
17
|
+
from pyEQL import ureg
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def interpret_units(unit: str) -> str:
|
|
23
|
+
"""
|
|
24
|
+
Translate commonly used environmental units such as 'ppm' into strings that `pint` can understand.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
unit: string representing the unit to translate
|
|
28
|
+
|
|
29
|
+
Returns: a unit that pint can understand
|
|
30
|
+
"""
|
|
31
|
+
if unit == "m": # molal
|
|
32
|
+
return "mol/kg"
|
|
33
|
+
if unit == "ppm":
|
|
34
|
+
return "mg/L"
|
|
35
|
+
if unit == "ppb":
|
|
36
|
+
return "ug/L"
|
|
37
|
+
if unit == "ppt":
|
|
38
|
+
return "ng/L"
|
|
39
|
+
# if all else fails, return the unit we were provided
|
|
40
|
+
return unit
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@lru_cache
|
|
44
|
+
def standardize_formula(formula: str):
|
|
45
|
+
"""
|
|
46
|
+
Convert a chemical formula into standard form.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
formula: the chemical formula to standardize.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
A standardized chemical formula
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
ValueError if `formula` cannot be processed or is invalid.
|
|
56
|
+
|
|
57
|
+
Notes:
|
|
58
|
+
Currently this method standardizes formulae by passing them through `pymatgen.core.ion.Ion.reduced_formula()`.
|
|
59
|
+
For ions, this means that 1) the charge number will always be listed explicitly and 2) the charge number will
|
|
60
|
+
be enclosed in square brackets to remove any ambiguity in the meaning of the formula. For example, 'Na+',
|
|
61
|
+
'Na+1', and 'Na[+]' will all standardize to "Na[+1]"
|
|
62
|
+
"""
|
|
63
|
+
sform = Ion.from_formula(formula).reduced_formula
|
|
64
|
+
|
|
65
|
+
# TODO - manual formula adjustments. May be implemented upstream in pymatgen in the future
|
|
66
|
+
# thanks to @xiaoxiaozhu123 for pointing out these issues in
|
|
67
|
+
# https://github.com/KingsburyLab/pyEQL/issues/136
|
|
68
|
+
|
|
69
|
+
# ammonia
|
|
70
|
+
if sform == "H4N[+1]":
|
|
71
|
+
sform = "NH4[+1]"
|
|
72
|
+
elif sform == "H3N(aq)":
|
|
73
|
+
sform = "NH3(aq)"
|
|
74
|
+
# phosphoric acid system
|
|
75
|
+
elif sform == "PH3O4(aq)":
|
|
76
|
+
sform = "H3PO4(aq)"
|
|
77
|
+
elif sform == "PHO4[-2]":
|
|
78
|
+
sform = "HPO4[-2]"
|
|
79
|
+
elif sform == "P(HO2)2[-1]":
|
|
80
|
+
sform = "H2PO4[-1]"
|
|
81
|
+
# thiocyanate
|
|
82
|
+
elif sform == "CSN[-1]":
|
|
83
|
+
sform = "SCN[-1]"
|
|
84
|
+
# triiodide
|
|
85
|
+
elif sform == "I[-0.33333333]":
|
|
86
|
+
sform = "I3[-1]"
|
|
87
|
+
# formate
|
|
88
|
+
elif sform == "HCOO[-1]":
|
|
89
|
+
sform = "HCO2[-1]"
|
|
90
|
+
# oxalate
|
|
91
|
+
elif sform == "CO2[-1]":
|
|
92
|
+
sform = "C2O4[-2]"
|
|
93
|
+
|
|
94
|
+
# TODO - consider adding recognition of special formulas like MeOH for methanol or Cit for citrate
|
|
95
|
+
return sform
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def format_solutes_dict(solute_dict: dict, units: str):
|
|
99
|
+
"""
|
|
100
|
+
Formats a dictionary of solutes by converting the amount to a string with the provided units suitable for passing to
|
|
101
|
+
use with the Solution class. Note that all solutes must be given in the same units.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
solute_dict: The dictionary to format. This must be of the form dict{str: Number}
|
|
105
|
+
e.g. {"Na+": 0.5, "Cl-": 0.9}
|
|
106
|
+
units: The units to use for the solute. e.g. "mol/kg"
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
A formatted solute dictionary.
|
|
110
|
+
|
|
111
|
+
Raises:
|
|
112
|
+
TypeError if `solute_dict` is not a dictionary.
|
|
113
|
+
"""
|
|
114
|
+
if not isinstance(solute_dict, dict):
|
|
115
|
+
raise TypeError("solute_dict must be a dictionary. Refer to the doc for proper formatting.")
|
|
116
|
+
|
|
117
|
+
return {key: f"{value!s} {units}" for key, value in solute_dict.items()}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@lru_cache
|
|
121
|
+
@ureg.wraps(ret=None, args=["K", "MPa"], strict=False)
|
|
122
|
+
def create_water_substance(temperature: float, pressure: float):
|
|
123
|
+
"""
|
|
124
|
+
Instantiate a water substance model from IAPWS.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
temperature: the desired temperature in K
|
|
128
|
+
pressure: the desired pressure in MPa
|
|
129
|
+
|
|
130
|
+
Notes:
|
|
131
|
+
The IAPWS97 model is much faster than IAPWS95, but the latter can do temp
|
|
132
|
+
below zero. See https://github.com/jjgomera/iapws/issues/14. Hence,
|
|
133
|
+
IAPWS97 will be used except when `temperature` is less than 0 degC.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
A IAPWS97 or IAPWS95 instance
|
|
137
|
+
"""
|
|
138
|
+
if temperature >= 273.15:
|
|
139
|
+
return IAPWS97(T=temperature, P=pressure)
|
|
140
|
+
return IAPWS95(T=temperature, P=pressure)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class FormulaDict(UserDict):
|
|
144
|
+
"""
|
|
145
|
+
Automatically converts keys on get/set using pymatgen.core.Ion.from_formula(key).reduced_formula.
|
|
146
|
+
|
|
147
|
+
This allows getting/setting/updating of Solution.components using flexible
|
|
148
|
+
formula notation (e.g., "Na+", "Na+1", "Na[+]" all have the same effect)
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
def __getitem__(self, key) -> Any:
|
|
152
|
+
return super().__getitem__(standardize_formula(key))
|
|
153
|
+
|
|
154
|
+
def __setitem__(self, key, value) -> None:
|
|
155
|
+
super().__setitem__(standardize_formula(key), value)
|
|
156
|
+
# sort contents anytime an item is set
|
|
157
|
+
self.data = dict(sorted(self.items(), key=lambda x: x[1], reverse=True))
|
|
158
|
+
|
|
159
|
+
# Necessary to define this so that .get() works properly in python 3.12+
|
|
160
|
+
# see https://github.com/python/cpython/issues/105524
|
|
161
|
+
def __contains__(self, key) -> bool:
|
|
162
|
+
return standardize_formula(key) in self.data
|
|
163
|
+
|
|
164
|
+
def __delitem__(self, key) -> None:
|
|
165
|
+
super().__delitem__(standardize_formula(key))
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Contributors
|
|
2
|
+
|
|
3
|
+
pyEQL was originally written by Prof. Ryan Kingsbury (@rkingsbury) and is primarily
|
|
4
|
+
developed and maintained by the Kingsbury Lab at Princeton University.
|
|
5
|
+
|
|
6
|
+
Other contributors, listed alphabetically, are:
|
|
7
|
+
|
|
8
|
+
* Kirill Pushkarev (@kirill-push)
|
|
9
|
+
* Dhruv Duseja (@DhruvDuseja)
|
|
10
|
+
* Andrew Rosen (@arosen93)
|
|
11
|
+
* Hernan Grecco (@hgrecco)
|
|
12
|
+
|
|
13
|
+
(If you think that your name belongs here, please let the maintainer know)
|
|
@@ -162,4 +162,4 @@ General Public License ever published by the Free Software Foundation.
|
|
|
162
162
|
whether future versions of the GNU Lesser General Public License shall
|
|
163
163
|
apply, that proxy's public statement of acceptance of any version is
|
|
164
164
|
permanent authorization for you to choose that version for the
|
|
165
|
-
Library.
|
|
165
|
+
Library.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
Copyright (c) 2013-
|
|
1
|
+
Copyright (c) 2013-2023 Ryan S. Kingsbury
|
|
2
2
|
|
|
3
3
|
pyEQL is free software; you can redistribute it and/or modify it under
|
|
4
4
|
the terms of the GNU Lesser General Public License as published by the
|
|
5
|
-
Free Software Foundation; version 3.0 of the License.
|
|
5
|
+
Free Software Foundation; version 3.0 of the License.
|
|
6
6
|
|
|
7
7
|
A copy of the GNU Lesser General Public License is included in the
|
|
8
8
|
pyEQL package in the file COPYING. If you did not receive this
|
|
@@ -11,13 +11,9 @@ Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
11
11
|
|
|
12
12
|
Data included in pyEQL's databases (/database directory) is used with
|
|
13
13
|
permission of the authors. If you wish to redistribute these databases
|
|
14
|
-
as part of a derived work, you are advised to contact the authors or
|
|
14
|
+
as part of a derived work, you are advised to contact the authors or
|
|
15
15
|
publishers for copyright information.
|
|
16
16
|
|
|
17
|
-
pyEQL also includes a copy of `elements.py <http://www.lfd.uci.edu/~gohlke/>`_
|
|
18
|
-
- a library of chemical information written by Christoph Gohlke and released
|
|
19
|
-
under the BSD license.
|
|
20
|
-
|
|
21
17
|
This program is distributed in the hope that it will be useful, but
|
|
22
18
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
23
19
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: pyEQL
|
|
3
|
+
Version: 1.1.0
|
|
4
|
+
Summary: Python tools for solution chemistry
|
|
5
|
+
Home-page: https://github.com/KingsburyLab/pyEQL
|
|
6
|
+
Author: Ryan Kingsbury
|
|
7
|
+
Author-email: kingsbury@princeton.edu
|
|
8
|
+
License: LGPL3
|
|
9
|
+
Project-URL: Documentation, https://pyeql.readthedocs.io/
|
|
10
|
+
Platform: any
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Programming Language :: Python
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Topic :: Scientific/Engineering
|
|
15
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
16
|
+
Requires-Python: >=3.9
|
|
17
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
18
|
+
License-File: LICENSE.txt
|
|
19
|
+
License-File: COPYING
|
|
20
|
+
License-File: AUTHORS.md
|
|
21
|
+
Requires-Dist: pint >=0.19
|
|
22
|
+
Requires-Dist: numpy <2
|
|
23
|
+
Requires-Dist: scipy
|
|
24
|
+
Requires-Dist: pymatgen ==2024.5.1
|
|
25
|
+
Requires-Dist: iapws
|
|
26
|
+
Requires-Dist: monty
|
|
27
|
+
Requires-Dist: maggma >=0.67.0
|
|
28
|
+
Requires-Dist: phreeqpython
|
|
29
|
+
Provides-Extra: docs
|
|
30
|
+
Requires-Dist: sphinx >=3.2.1 ; extra == 'docs'
|
|
31
|
+
Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
|
|
32
|
+
Requires-Dist: myst-parser[linkify] ; extra == 'docs'
|
|
33
|
+
Provides-Extra: full
|
|
34
|
+
Requires-Dist: rich ; extra == 'full'
|
|
35
|
+
Provides-Extra: testing
|
|
36
|
+
Requires-Dist: setuptools ; extra == 'testing'
|
|
37
|
+
Requires-Dist: pre-commit ; extra == 'testing'
|
|
38
|
+
Requires-Dist: pytest ; extra == 'testing'
|
|
39
|
+
Requires-Dist: pytest-cov ; extra == 'testing'
|
|
40
|
+
Requires-Dist: pytest-xdist ; extra == 'testing'
|
|
41
|
+
Requires-Dist: black ; extra == 'testing'
|
|
42
|
+
Requires-Dist: mypy ; extra == 'testing'
|
|
43
|
+
Requires-Dist: ruff ; extra == 'testing'
|
|
44
|
+
Requires-Dist: tox <4 ; extra == 'testing'
|
|
45
|
+
|
|
46
|
+
[](https://pyeql.readthedocs.io/en/latest/)
|
|
47
|
+
[](https://github.com/KingsburyLab/pyeql/actions?query=workflow%3Atesting)
|
|
48
|
+
[](https://codecov.io/gh/KingsburyLab/pyeql)
|
|
49
|
+

|
|
50
|
+
[](https://doi.org/10.5281/zenodo.8332915)
|
|
51
|
+
[](https://badge.fury.io/py/pyEQL)
|
|
52
|
+
[](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6)
|
|
53
|
+
|
|
54
|
+
<img src="pyeql-logo.png" alt="pyEQL logo" style="width:600px;"/>
|
|
55
|
+
|
|
56
|
+
# A python interface for water chemistry
|
|
57
|
+
|
|
58
|
+
## Description
|
|
59
|
+
|
|
60
|
+
**The goal of `pyEQL` is to provide a stable, intuitive, easy to learn python interface
|
|
61
|
+
for water chemistry that can be connected to a variety of different modeling engines**
|
|
62
|
+
|
|
63
|
+
Specifically, `pyEQL` defines a `Solution` class to represent an aqueous
|
|
64
|
+
electrolyte solution. The `Solution` class allows the user to manipulate solutions as
|
|
65
|
+
Python objects, providing methods to populate them with solutes, calculate
|
|
66
|
+
species-specific properties (such as activity and diffusion coefficients),
|
|
67
|
+
and retrieve bulk properties (such as density, conductivity, or volume).
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
>>> from pyEQL import Solution
|
|
71
|
+
>>> s1=Solution({"Na+":"1 mol/L", "Cl-": "1 mol/L"})
|
|
72
|
+
>>> s1.density
|
|
73
|
+
<Quantity(1.03710384, 'kilogram / liter')>
|
|
74
|
+
>>> s1.conductivity
|
|
75
|
+
<Quantity(8.09523295, 'siemens / meter')>
|
|
76
|
+
>>> s1.osmotic_pressure.to('atm')
|
|
77
|
+
<Quantity(46.7798197, 'standard_atmosphere')>
|
|
78
|
+
>>> s1.get_amount('Na+', 'ug/L')
|
|
79
|
+
<Quantity(22989769.3, 'microgram / liter')>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`pyEQL` also includes a number of other utilities to support water chemistry analysis,
|
|
83
|
+
including a **built-in property database** of diffusion coefficients, activity correction
|
|
84
|
+
parameters, and other data on a variety of common electrolytes.
|
|
85
|
+
|
|
86
|
+
It is designed to be customizable and easy to integrate into projects
|
|
87
|
+
that require modeling of chemical thermodyanmics of aqueous solutions.
|
|
88
|
+
It aspires to provide a flexible, extensible framework for the user, with a
|
|
89
|
+
high level of transparency about data sources and calculation methods.
|
|
90
|
+
|
|
91
|
+
### Key Features
|
|
92
|
+
|
|
93
|
+
- Build accurate solution properties using a minimum of inputs. Just specify
|
|
94
|
+
the identity and quantity of a solute and pyEQL will do the rest.
|
|
95
|
+
|
|
96
|
+
- "Graceful Decay" from more sophisticated, data-intensive modeling approaches
|
|
97
|
+
to simpler, less accurate ones depending on the amount of data supplied.
|
|
98
|
+
|
|
99
|
+
- Not limited to dilute solutions. pyEQL contains out of the box support for
|
|
100
|
+
the Pitzer Model and other methods for modeling concentrated solutions.
|
|
101
|
+
|
|
102
|
+
- Built in [database](https://pyeql.readthedocs.io/en/latest/database.html) containing hundreds of model
|
|
103
|
+
parameters and physicochemical properties for different ions.
|
|
104
|
+
|
|
105
|
+
- Units-aware calculations (by means of the [pint](https://github.com/hgrecco/pint) library)
|
|
106
|
+
|
|
107
|
+
### Documentation
|
|
108
|
+
|
|
109
|
+
Detailed documentation is available at [https://pyeql.readthedocs.io/](https://pyeql.readthedocs.io/)
|
|
110
|
+
|
|
111
|
+
### Dependencies
|
|
112
|
+
|
|
113
|
+
- Python 3.9+. This project will attempt to adhere to NumPy's
|
|
114
|
+
[NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) deprecation policy
|
|
115
|
+
for older version of Python.
|
|
116
|
+
- [pint](https://github.com/hgrecco/pint) - for units-aware calculations
|
|
117
|
+
- [pymatgen](https://github.com/materialsproject/pymatgen) - periodic table and chemical formula information
|
|
118
|
+
- [phreeqpython](https://github.com/Vitens/phreeqpython) - for PHREEQC-based speciation calculations
|
|
119
|
+
- [iapws](https://github.com/jjgomera/iapws/) - equations of state for water
|
|
120
|
+
- [monty](https://github.com/materialsvirtuallab/monty) - serialization and deserialization utilities
|
|
121
|
+
- [maggma](https://materialsproject.github.io/maggma/) - interface for accessing the property database
|
|
122
|
+
- [scipy](https://www.scipy.org/) - for certain nonlinear equation solvers
|
|
123
|
+
|
|
124
|
+
## <!-- pyscaffold-notes -->
|
|
125
|
+
|
|
126
|
+
pyEQL is licensed under LGPL.
|
|
127
|
+
|
|
128
|
+
This project has been set up using PyScaffold 4.5. For details and usage
|
|
129
|
+
information on PyScaffold see [https://pyscaffold.org/]().
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
pyEQL/__init__.py,sha256=JErflmaJVP373dm3-YGHUomFu05dgX0iXWS-Z5AgSTU,2118
|
|
2
|
+
pyEQL/activity_correction.py,sha256=eOixjgTd5hTrTRD5s6aPCCG12lAIH7-lRN0Z1qHu678,37151
|
|
3
|
+
pyEQL/engines.py,sha256=b9ay7FYqmnINmhSMyNpVmENAtZVW-gyBfXUPf1PEUoY,34946
|
|
4
|
+
pyEQL/equilibrium.py,sha256=YCtoAJSgn1WC9NJnc3H4FTJdKQvogsvCuj7HqlKMtww,8307
|
|
5
|
+
pyEQL/functions.py,sha256=nc-Hc61MmW-ELBR1PByJvQnELxM7PZexMHbU_O5-Bnw,10584
|
|
6
|
+
pyEQL/pint_custom_units.txt,sha256=XHmcMlwVvqF9nEW7_e9Xgyq-xWEr-cDYqieas11T3eY,2882
|
|
7
|
+
pyEQL/salt_ion_match.py,sha256=0nCZXmeo67VqcyYWQpPx-81hjSvnsg8HFB3fIyfjW_k,4070
|
|
8
|
+
pyEQL/solute.py,sha256=no00Rc3tRfHmyht4wm2UXA1KZhKC45tWMO5QEkZY6yg,5140
|
|
9
|
+
pyEQL/solution.py,sha256=XwtQmll3gPwdnnkXpQsnO7QebwTjplmlfhbEIU8rHDo,115940
|
|
10
|
+
pyEQL/utils.py,sha256=unsY7zrrhl_1mOmt9_kumSKmLE5N5Hvh4bOErfS3nws,5168
|
|
11
|
+
pyEQL/database/geothermal.dat,sha256=kksnfcBtWdOTpNn4CLXU1Mz16cwas2WuVKpuMU8CaVI,234230
|
|
12
|
+
pyEQL/database/llnl.dat,sha256=jN-a0kfUFbQlYMn2shTVRg1JX_ZhLa-tJ0lLw2YSpLU,751462
|
|
13
|
+
pyEQL/database/phreeqc_license.txt,sha256=8W1r8VxC2kVptIMSU9sDFNASYqN7MdwKEtIWWfjTQuM,2906
|
|
14
|
+
pyEQL/database/pyeql_db.json,sha256=TQKKofds7QBNd-Hw5QQuPwP6rQ8YWh_hHlRAtoQX0m8,1080793
|
|
15
|
+
pyEQL/presets/Ringers lactate.yaml,sha256=vtSnuvgALHR27XEjpDzC0xyw5-E6b2FSsF1EUEBiWpw,413
|
|
16
|
+
pyEQL/presets/normal saline.yaml,sha256=i2znhnIeXfNx1iMFFSif7crMRCFRP6xN1m7Wp7USduM,318
|
|
17
|
+
pyEQL/presets/rainwater.yaml,sha256=S0WHZNDfCJyjSSFxNFdkypjn2s3P0jJGCiYIxvi1ibA,337
|
|
18
|
+
pyEQL/presets/seawater.yaml,sha256=oryc1CkhRz20RpWE6uiGiT93HoZnqlB0s-0PmBWr3-U,843
|
|
19
|
+
pyEQL/presets/urine.yaml,sha256=0Njtc-H1fFRo7UhquHdiSTT4z-8VZJ1utDCk02qk28M,679
|
|
20
|
+
pyEQL/presets/wastewater.yaml,sha256=jTTFBpmKxczaEtkCZb0xUULIPZt7wfC8eAJ6rthGnmw,502
|
|
21
|
+
pyEQL-1.1.0.dist-info/AUTHORS.md,sha256=K9ZLhKFwZ2zLlFXwN62VuUYCpr5T6n4mOUCUHlytTUs,415
|
|
22
|
+
pyEQL-1.1.0.dist-info/COPYING,sha256=Ww2oUywfFTn242v9ksCgQdIVSpcMXJiKKePn0GFm25E,7649
|
|
23
|
+
pyEQL-1.1.0.dist-info/LICENSE.txt,sha256=2Zf1F7RzbpeposgIxUydpurqNCMoMgDi2gAB65_GjwQ,969
|
|
24
|
+
pyEQL-1.1.0.dist-info/METADATA,sha256=1KbuGQ1gjYRWA-8cq2cb_OmZgW8DTpKoCZ6_6DpQ9jo,5889
|
|
25
|
+
pyEQL-1.1.0.dist-info/WHEEL,sha256=0XQbNV6JE5ziJsWjIU8TRRv0N6SohNonLWgP86g5fiI,109
|
|
26
|
+
pyEQL-1.1.0.dist-info/top_level.txt,sha256=QMOaZjCAm_lS4Njsjh4L0B5aWnJFGQMYKhuH88CG1co,6
|
|
27
|
+
pyEQL-1.1.0.dist-info/RECORD,,
|