pyEQL 0.5.2__py3-none-any.whl → 1.0.3__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.
Files changed (62) hide show
  1. pyEQL/__init__.py +50 -43
  2. pyEQL/activity_correction.py +481 -707
  3. pyEQL/database/geothermal.dat +5693 -0
  4. pyEQL/database/llnl.dat +19305 -0
  5. pyEQL/database/phreeqc_license.txt +54 -0
  6. pyEQL/database/pyeql_db.json +35902 -0
  7. pyEQL/engines.py +793 -0
  8. pyEQL/equilibrium.py +148 -228
  9. pyEQL/functions.py +121 -416
  10. pyEQL/pint_custom_units.txt +2 -2
  11. pyEQL/presets/Ringers lactate.yaml +20 -0
  12. pyEQL/presets/normal saline.yaml +17 -0
  13. pyEQL/presets/rainwater.yaml +17 -0
  14. pyEQL/presets/seawater.yaml +29 -0
  15. pyEQL/presets/urine.yaml +26 -0
  16. pyEQL/presets/wastewater.yaml +21 -0
  17. pyEQL/salt_ion_match.py +53 -284
  18. pyEQL/solute.py +126 -191
  19. pyEQL/solution.py +2163 -2090
  20. pyEQL/utils.py +211 -0
  21. pyEQL-1.0.3.dist-info/AUTHORS.md +13 -0
  22. {pyEQL-0.5.2.dist-info → pyEQL-1.0.3.dist-info}/COPYING +1 -1
  23. pyEQL-0.5.2.dist-info/LICENSE → pyEQL-1.0.3.dist-info/LICENSE.txt +3 -7
  24. pyEQL-1.0.3.dist-info/METADATA +131 -0
  25. pyEQL-1.0.3.dist-info/RECORD +27 -0
  26. {pyEQL-0.5.2.dist-info → pyEQL-1.0.3.dist-info}/WHEEL +1 -1
  27. pyEQL/chemical_formula.py +0 -1006
  28. pyEQL/database/Erying_viscosity.tsv +0 -18
  29. pyEQL/database/Jones_Dole_B.tsv +0 -32
  30. pyEQL/database/Jones_Dole_B_inorganic_Jenkins.tsv +0 -75
  31. pyEQL/database/LICENSE +0 -4
  32. pyEQL/database/dielectric_parameter.tsv +0 -30
  33. pyEQL/database/diffusion_coefficient.tsv +0 -116
  34. pyEQL/database/hydrated_radius.tsv +0 -35
  35. pyEQL/database/ionic_radius.tsv +0 -35
  36. pyEQL/database/partial_molar_volume.tsv +0 -22
  37. pyEQL/database/pitzer_activity.tsv +0 -169
  38. pyEQL/database/pitzer_volume.tsv +0 -132
  39. pyEQL/database/template.tsv +0 -14
  40. pyEQL/database.py +0 -300
  41. pyEQL/elements.py +0 -4552
  42. pyEQL/logging_system.py +0 -53
  43. pyEQL/parameter.py +0 -435
  44. pyEQL/tests/__init__.py +0 -32
  45. pyEQL/tests/test_activity.py +0 -578
  46. pyEQL/tests/test_bulk_properties.py +0 -86
  47. pyEQL/tests/test_chemical_formula.py +0 -279
  48. pyEQL/tests/test_debye_length.py +0 -79
  49. pyEQL/tests/test_density.py +0 -106
  50. pyEQL/tests/test_dielectric.py +0 -153
  51. pyEQL/tests/test_effective_pitzer.py +0 -276
  52. pyEQL/tests/test_mixed_electrolyte_activity.py +0 -154
  53. pyEQL/tests/test_osmotic_coeff.py +0 -99
  54. pyEQL/tests/test_pyeql_volume_concentration.py +0 -428
  55. pyEQL/tests/test_salt_matching.py +0 -337
  56. pyEQL/tests/test_solute_properties.py +0 -251
  57. pyEQL/water_properties.py +0 -352
  58. pyEQL-0.5.2.dist-info/AUTHORS +0 -7
  59. pyEQL-0.5.2.dist-info/METADATA +0 -72
  60. pyEQL-0.5.2.dist-info/RECORD +0 -47
  61. pyEQL-0.5.2.dist-info/entry_points.txt +0 -3
  62. {pyEQL-0.5.2.dist-info → pyEQL-1.0.3.dist-info}/top_level.txt +0 -0
pyEQL/utils.py ADDED
@@ -0,0 +1,211 @@
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
+ # fix permuted sign and charge number (e.g. Co2+)
64
+ for str, rep in zip(["²⁺", "³⁺", "⁴⁺", "²⁻", "³⁻", "⁴⁻"], ["+2", "+3", "+4", "-2", "-3", "-4"]):
65
+ formula = formula.replace(str, rep)
66
+
67
+ # replace superscripts with non superscripts
68
+ for char, rep in zip("⁻⁺⁰¹²³⁴⁵⁶⁷⁸⁹", "-+0123456789"):
69
+ formula = formula.replace(char, rep)
70
+
71
+ # replace subscripts with non subscripts
72
+ for char, rep in zip("₀₁₂₃₄₅₆₇₈₉", "0123456789"):
73
+ formula = formula.replace(char, rep)
74
+
75
+ sform = Ion.from_formula(formula).reduced_formula
76
+
77
+ # TODO - manual formula adjustments. May be implemented upstream in pymatgen in the future
78
+ # thanks to @xiaoxiaozhu123 for pointing out these issues in
79
+ # https://github.com/KingsburyLab/pyEQL/issues/136
80
+
81
+ # ammonia
82
+ if sform == "H4N[+1]":
83
+ sform = "NH4[+1]"
84
+ elif sform == "H3N(aq)":
85
+ sform = "NH3(aq)"
86
+ # phosphoric acid system
87
+ elif sform == "PH3O4(aq)":
88
+ sform = "H3PO4(aq)"
89
+ elif sform == "PHO4[-2]":
90
+ sform = "HPO4[-2]"
91
+ elif sform == "P(HO2)2[-1]":
92
+ sform = "H2PO4[-1]"
93
+ # thiocyanate
94
+ elif sform == "CSN[-1]":
95
+ sform = "SCN[-1]"
96
+ # triiodide, nitride, an phosphide
97
+ elif sform == "I[-0.33333333]":
98
+ sform = "I3[-1]"
99
+ elif sform == "N[-0.33333333]":
100
+ sform = "N3[-1]"
101
+ elif sform == "P[-0.33333333]":
102
+ sform = "P3[-1]"
103
+ # formate
104
+ elif sform == "HCOO[-1]":
105
+ sform = "HCO2[-1]"
106
+ # oxalate
107
+ elif sform == "CO2[-1]":
108
+ sform = "C2O4[-2]"
109
+ # triflate
110
+ elif sform == "CS(OF)3[-1]":
111
+ sform = "CF3SO3[-1]"
112
+ # haloacetic acids of F, Cl, Br, I
113
+ elif sform == "C2Cl3O2[-1]":
114
+ sform = "CCl3COO[-1]"
115
+ elif sform == "C2O2F3[-1]":
116
+ sform = "CF3COO[-1]"
117
+ elif sform == "C2I3O2[-1]":
118
+ sform = "CI3COO[-1]"
119
+ elif sform == "C2Br3O2[-1]":
120
+ sform = "CBr3COO[-1]"
121
+
122
+ # Cl+F
123
+ elif sform == "C2Cl2O2F[-1]":
124
+ sform = "CFCl2COO[-1]"
125
+ elif sform == "C2Cl(OF)2[-1]":
126
+ sform = "CF2ClCOO[-1]"
127
+
128
+ # Cl+Br
129
+ elif sform == "C2Br(ClO)2[-1]":
130
+ sform = "CBrCl2COO[-1]"
131
+ elif sform == "C2Br2ClO2[-1]":
132
+ sform = "CBr2ClCOO[-1]"
133
+
134
+ # Cl+I
135
+ elif sform == "C2I(ClO)2[-1]":
136
+ sform = "CICl2COO[-1]"
137
+ elif sform == "C2I2ClO2[-1]":
138
+ sform = "CI2ClCOO[-1]"
139
+
140
+ # TODO - consider adding recognition of special formulas like MeOH for methanol or Cit for citrate
141
+ return sform
142
+
143
+
144
+ def format_solutes_dict(solute_dict: dict, units: str):
145
+ """
146
+ Formats a dictionary of solutes by converting the amount to a string with the provided units suitable for passing to
147
+ use with the Solution class. Note that all solutes must be given in the same units.
148
+
149
+ Args:
150
+ solute_dict: The dictionary to format. This must be of the form dict{str: Number}
151
+ e.g. {"Na+": 0.5, "Cl-": 0.9}
152
+ units: The units to use for the solute. e.g. "mol/kg"
153
+
154
+ Returns:
155
+ A formatted solute dictionary.
156
+
157
+ Raises:
158
+ TypeError if `solute_dict` is not a dictionary.
159
+ """
160
+ if not isinstance(solute_dict, dict):
161
+ raise TypeError("solute_dict must be a dictionary. Refer to the doc for proper formatting.")
162
+
163
+ return {key: f"{value!s} {units}" for key, value in solute_dict.items()}
164
+
165
+
166
+ @lru_cache
167
+ @ureg.wraps(ret=None, args=["K", "MPa"], strict=False)
168
+ def create_water_substance(temperature: float, pressure: float):
169
+ """
170
+ Instantiate a water substance model from IAPWS.
171
+
172
+ Args:
173
+ temperature: the desired temperature in K
174
+ pressure: the desired pressure in MPa
175
+
176
+ Notes:
177
+ The IAPWS97 model is much faster than IAPWS95, but the latter can do temp
178
+ below zero. See https://github.com/jjgomera/iapws/issues/14. Hence,
179
+ IAPWS97 will be used except when `temperature` is less than 0 degC.
180
+
181
+ Returns:
182
+ A IAPWS97 or IAPWS95 instance
183
+ """
184
+ if temperature >= 273.15:
185
+ return IAPWS97(T=temperature, P=pressure)
186
+ return IAPWS95(T=temperature, P=pressure)
187
+
188
+
189
+ class FormulaDict(UserDict):
190
+ """
191
+ Automatically converts keys on get/set using pymatgen.core.Ion.from_formula(key).reduced_formula.
192
+
193
+ This allows getting/setting/updating of Solution.components using flexible
194
+ formula notation (e.g., "Na+", "Na+1", "Na[+]" all have the same effect)
195
+ """
196
+
197
+ def __getitem__(self, key) -> Any:
198
+ return super().__getitem__(standardize_formula(key))
199
+
200
+ def __setitem__(self, key, value) -> None:
201
+ super().__setitem__(standardize_formula(key), value)
202
+ # sort contents anytime an item is set
203
+ self.data = dict(sorted(self.items(), key=lambda x: x[1], reverse=True))
204
+
205
+ # Necessary to define this so that .get() works properly in python 3.12+
206
+ # see https://github.com/python/cpython/issues/105524
207
+ def __contains__(self, key) -> bool:
208
+ return standardize_formula(key) in self.data
209
+
210
+ def __delitem__(self, key) -> None:
211
+ 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-2020 Ryan S. Kingsbury
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,131 @@
1
+ Metadata-Version: 2.1
2
+ Name: pyEQL
3
+ Version: 1.0.3
4
+ Summary: A python interace for solution chemistry
5
+ Author-email: Ryan Kingsbury <kingsbury@princeton.edu>
6
+ Project-URL: Docs, https://pyeql.readthedocs.io/
7
+ Project-URL: Repo, https://github.com/KingsburyLab/pyEQL
8
+ Project-URL: Package, https://pypi.org/project/pyEQL
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Topic :: Scientific/Engineering
18
+ Requires-Python: >=3.9
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE.txt
21
+ License-File: COPYING
22
+ License-File: AUTHORS.md
23
+ Requires-Dist: pint >=0.19
24
+ Requires-Dist: numpy <2
25
+ Requires-Dist: scipy
26
+ Requires-Dist: pymatgen ==2024.5.1
27
+ Requires-Dist: iapws
28
+ Requires-Dist: monty
29
+ Requires-Dist: maggma >=0.67.0
30
+ Requires-Dist: phreeqpython
31
+ Provides-Extra: docs
32
+ Requires-Dist: sphinx >=3.2.1 ; extra == 'docs'
33
+ Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
34
+ Requires-Dist: myst-parser[linkify] ; extra == 'docs'
35
+ Provides-Extra: full
36
+ Requires-Dist: rich ; extra == 'full'
37
+ Provides-Extra: testing
38
+ Requires-Dist: setuptools ; extra == 'testing'
39
+ Requires-Dist: pre-commit ; extra == 'testing'
40
+ Requires-Dist: pytest ; extra == 'testing'
41
+ Requires-Dist: pytest-cov ; extra == 'testing'
42
+ Requires-Dist: pytest-xdist ; extra == 'testing'
43
+ Requires-Dist: black ; extra == 'testing'
44
+ Requires-Dist: mypy ; extra == 'testing'
45
+ Requires-Dist: ruff ; extra == 'testing'
46
+ Requires-Dist: tox <4 ; extra == 'testing'
47
+
48
+ [![Read the Docs](https://img.shields.io/readthedocs/pyeql)](https://pyeql.readthedocs.io/en/latest/)
49
+ [![testing](https://github.com/KingsburyLab/pyeql/workflows/testing/badge.svg)](https://github.com/KingsburyLab/pyeql/actions?query=workflow%3Atesting)
50
+ [![codecov](https://codecov.io/gh/KingsburyLab/pyeql/branch/main/graph/badge.svg?token=I7RP0QML6S)](https://codecov.io/gh/KingsburyLab/pyeql)
51
+ ![Supported python versions](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue)
52
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8332915.svg)](https://doi.org/10.5281/zenodo.8332915)
53
+ [![PyPI version](https://badge.fury.io/py/pyEQL.svg)](https://badge.fury.io/py/pyEQL)
54
+ [![status](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6/status.svg)](https://joss.theoj.org/papers/bdd9e247ea9736a0fdbbd5fe12bef7a6)
55
+
56
+ <img src="pyeql-logo.png" alt="pyEQL logo" style="width:600px;"/>
57
+
58
+ # A python interface for water chemistry
59
+
60
+ ## Description
61
+
62
+ **The goal of `pyEQL` is to provide a stable, intuitive, easy to learn python interface
63
+ for water chemistry that can be connected to a variety of different modeling engines**
64
+
65
+ Specifically, `pyEQL` defines a `Solution` class to represent an aqueous
66
+ electrolyte solution. The `Solution` class allows the user to manipulate solutions as
67
+ Python objects, providing methods to populate them with solutes, calculate
68
+ species-specific properties (such as activity and diffusion coefficients),
69
+ and retrieve bulk properties (such as density, conductivity, or volume).
70
+
71
+ ```python
72
+ >>> from pyEQL import Solution
73
+ >>> s1=Solution({"Na+":"1 mol/L", "Cl-": "1 mol/L"})
74
+ >>> s1.density
75
+ <Quantity(1.03710384, 'kilogram / liter')>
76
+ >>> s1.conductivity
77
+ <Quantity(8.09523295, 'siemens / meter')>
78
+ >>> s1.osmotic_pressure.to('atm')
79
+ <Quantity(46.7798197, 'standard_atmosphere')>
80
+ >>> s1.get_amount('Na+', 'ug/L')
81
+ <Quantity(22989769.3, 'microgram / liter')>
82
+ ```
83
+
84
+ `pyEQL` also includes a number of other utilities to support water chemistry analysis,
85
+ including a **built-in property database** of diffusion coefficients, activity correction
86
+ parameters, and other data on a variety of common electrolytes.
87
+
88
+ It is designed to be customizable and easy to integrate into projects
89
+ that require modeling of chemical thermodyanmics of aqueous solutions.
90
+ It aspires to provide a flexible, extensible framework for the user, with a
91
+ high level of transparency about data sources and calculation methods.
92
+
93
+ ### Key Features
94
+
95
+ - Build accurate solution properties using a minimum of inputs. Just specify
96
+ the identity and quantity of a solute and pyEQL will do the rest.
97
+
98
+ - "Graceful Decay" from more sophisticated, data-intensive modeling approaches
99
+ to simpler, less accurate ones depending on the amount of data supplied.
100
+
101
+ - Not limited to dilute solutions. pyEQL contains out of the box support for
102
+ the Pitzer Model and other methods for modeling concentrated solutions.
103
+
104
+ - Built in [database](https://pyeql.readthedocs.io/en/latest/database.html) containing hundreds of model
105
+ parameters and physicochemical properties for different ions.
106
+
107
+ - Units-aware calculations (by means of the [pint](https://github.com/hgrecco/pint) library)
108
+
109
+ ### Documentation
110
+
111
+ Detailed documentation is available at [https://pyeql.readthedocs.io/](https://pyeql.readthedocs.io/)
112
+
113
+ ### Dependencies
114
+
115
+ - Python 3.9+. This project will attempt to adhere to NumPy's
116
+ [NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) deprecation policy
117
+ for older version of Python.
118
+ - [pint](https://github.com/hgrecco/pint) - for units-aware calculations
119
+ - [pymatgen](https://github.com/materialsproject/pymatgen) - periodic table and chemical formula information
120
+ - [phreeqpython](https://github.com/Vitens/phreeqpython) - for PHREEQC-based speciation calculations
121
+ - [iapws](https://github.com/jjgomera/iapws/) - equations of state for water
122
+ - [monty](https://github.com/materialsvirtuallab/monty) - serialization and deserialization utilities
123
+ - [maggma](https://materialsproject.github.io/maggma/) - interface for accessing the property database
124
+ - [scipy](https://www.scipy.org/) - for certain nonlinear equation solvers
125
+
126
+ ## <!-- pyscaffold-notes -->
127
+
128
+ pyEQL is licensed under LGPL.
129
+
130
+ This project has been set up using PyScaffold 4.5. For details and usage
131
+ 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=DWLtNm71qw5j4-jqBp5v3LssEjWgJnVvI6a_H60c5ic,6670
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.0.3.dist-info/AUTHORS.md,sha256=K9ZLhKFwZ2zLlFXwN62VuUYCpr5T6n4mOUCUHlytTUs,415
22
+ pyEQL-1.0.3.dist-info/COPYING,sha256=Ww2oUywfFTn242v9ksCgQdIVSpcMXJiKKePn0GFm25E,7649
23
+ pyEQL-1.0.3.dist-info/LICENSE.txt,sha256=2Zf1F7RzbpeposgIxUydpurqNCMoMgDi2gAB65_GjwQ,969
24
+ pyEQL-1.0.3.dist-info/METADATA,sha256=Wqt01mnze6MZtohFvUr3W_PXgGxbt1ZGo6akCvivWFI,6083
25
+ pyEQL-1.0.3.dist-info/WHEEL,sha256=rWxmBtp7hEUqVLOnTaDOPpR-cZpCDkzhhcBce-Zyd5k,91
26
+ pyEQL-1.0.3.dist-info/top_level.txt,sha256=QMOaZjCAm_lS4Njsjh4L0B5aWnJFGQMYKhuH88CG1co,6
27
+ pyEQL-1.0.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.34.2)
2
+ Generator: setuptools (71.0.4)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5