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/water_properties.py
DELETED
|
@@ -1,352 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
pyEQL water properties library
|
|
3
|
-
|
|
4
|
-
This file contains functions for retrieving various physical properties
|
|
5
|
-
of water substance
|
|
6
|
-
|
|
7
|
-
:copyright: 2013-2020 by Ryan S. Kingsbury
|
|
8
|
-
:license: LGPL, see LICENSE for more details.
|
|
9
|
-
|
|
10
|
-
"""
|
|
11
|
-
import math
|
|
12
|
-
|
|
13
|
-
from pyEQL import unit
|
|
14
|
-
|
|
15
|
-
# logging system
|
|
16
|
-
import logging
|
|
17
|
-
|
|
18
|
-
# add a filter to emit only unique log messages to the handler
|
|
19
|
-
from pyEQL.logging_system import Unique
|
|
20
|
-
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
unique = Unique()
|
|
23
|
-
logger.addFilter(unique)
|
|
24
|
-
|
|
25
|
-
# add a handler for console output, since pyEQL is meant to be used interactively
|
|
26
|
-
ch = logging.StreamHandler()
|
|
27
|
-
|
|
28
|
-
# create formatter for the log
|
|
29
|
-
formatter = logging.Formatter("(%(name)s) - %(levelname)s - %(message)s")
|
|
30
|
-
|
|
31
|
-
# add formatter to the handler
|
|
32
|
-
ch.setFormatter(formatter)
|
|
33
|
-
logger.addHandler(ch)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def water_density(temperature=25 * unit("degC"), pressure=1 * unit("atm")):
|
|
37
|
-
# TODO add pressure??
|
|
38
|
-
# TODO more up to date equation??
|
|
39
|
-
"""
|
|
40
|
-
Return the density of water in kg/m3 at the specified temperature and pressure.
|
|
41
|
-
|
|
42
|
-
Parameters
|
|
43
|
-
----------
|
|
44
|
-
temperature : float or int, optional
|
|
45
|
-
The temperature in Celsius. Defaults to 25 degrees if not specified.
|
|
46
|
-
pressure : float or int, optional
|
|
47
|
-
The ambient pressure of the solution in Pascals (N/m2).
|
|
48
|
-
Defaults to atmospheric pressure (101325 Pa) if not specified.
|
|
49
|
-
|
|
50
|
-
Returns
|
|
51
|
-
-------
|
|
52
|
-
float
|
|
53
|
-
The density of water in kg/m3.
|
|
54
|
-
|
|
55
|
-
Notes
|
|
56
|
-
-----
|
|
57
|
-
Based on the following empirical equation reported in [#]_
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
.. math:: \\rho_W = 999.65 + 0.20438 T - 6.1744e-2 T ^ {1.5}
|
|
61
|
-
|
|
62
|
-
Where :math:`T` is the temperature in Celsius.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.. [#] Sohnel, O and Novotny, P. *Densities of Aqueous Solutions of Inorganic Substances.* Elsevier Science,
|
|
66
|
-
Amsterdam, 1985.
|
|
67
|
-
|
|
68
|
-
Examples
|
|
69
|
-
--------
|
|
70
|
-
>>> water_density(25*unit('degC')) #doctest: +ELLIPSIS
|
|
71
|
-
<Quantity(997.0415, 'kilogram / meter ** 3')>
|
|
72
|
-
|
|
73
|
-
"""
|
|
74
|
-
# calculate the magnitude
|
|
75
|
-
density = (
|
|
76
|
-
999.65
|
|
77
|
-
+ 0.20438 * temperature.to("degC").magnitude
|
|
78
|
-
- 6.1744e-2 * temperature.to("degC").magnitude ** 1.5
|
|
79
|
-
)
|
|
80
|
-
# assign the proper units
|
|
81
|
-
density = density * unit("kg/m**3")
|
|
82
|
-
logger.info(
|
|
83
|
-
"Computed density of water as %s at T= %s and P = %s"
|
|
84
|
-
% (density, temperature, pressure)
|
|
85
|
-
)
|
|
86
|
-
logger.debug(
|
|
87
|
-
"Computed density of water using empirical relation in Sohnel and Novotny, "
|
|
88
|
-
"Densities of Aqueous Solutions of Inorganic Substances, 1985"
|
|
89
|
-
)
|
|
90
|
-
return density.to("kg/m**3")
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def water_specific_weight(temperature=25 * unit("degC"), pressure=1 * unit("atm")):
|
|
94
|
-
"""
|
|
95
|
-
Return the specific weight of water in N/m3 at the specified temperature and pressure.
|
|
96
|
-
|
|
97
|
-
Parameters
|
|
98
|
-
----------
|
|
99
|
-
temperature : Quantity, optional
|
|
100
|
-
The temperature. Defaults to 25 degC if omitted.
|
|
101
|
-
pressure : Quantity, optional
|
|
102
|
-
The ambient pressure of the solution.
|
|
103
|
-
Defaults to atmospheric pressure (1 atm) if omitted.
|
|
104
|
-
|
|
105
|
-
Returns
|
|
106
|
-
-------
|
|
107
|
-
Quantity
|
|
108
|
-
The specific weight of water in N/m3.
|
|
109
|
-
|
|
110
|
-
Examples
|
|
111
|
-
--------
|
|
112
|
-
>>> water_specific_weight() #doctest: +ELLIPSIS
|
|
113
|
-
<Quantity(9777.637025975, 'newton / meter ** 3')>
|
|
114
|
-
|
|
115
|
-
See Also
|
|
116
|
-
--------
|
|
117
|
-
water_density
|
|
118
|
-
|
|
119
|
-
"""
|
|
120
|
-
spweight = water_density(temperature, pressure) * unit.g_n
|
|
121
|
-
logger.info(
|
|
122
|
-
"Computed specific weight of water as %s at T=%s and P = %s"
|
|
123
|
-
% (spweight, temperature, pressure)
|
|
124
|
-
)
|
|
125
|
-
return spweight.to("N/m ** 3")
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
def water_viscosity_dynamic(temperature=25 * unit("degC"), pressure=1 * unit("atm")):
|
|
129
|
-
"""
|
|
130
|
-
Return the dynamic (absolute) viscosity of water in N-s/m2 = Pa-s = kg/m-s
|
|
131
|
-
at the specified temperature.
|
|
132
|
-
|
|
133
|
-
Parameters
|
|
134
|
-
----------
|
|
135
|
-
temperature : Quantity, optional
|
|
136
|
-
The temperature. Defaults to 25 degC if omitted.
|
|
137
|
-
pressure : Quantity, optional
|
|
138
|
-
The ambient pressure of the solution.
|
|
139
|
-
Defaults to atmospheric pressure (1 atm) if omitted.
|
|
140
|
-
|
|
141
|
-
Returns
|
|
142
|
-
-------
|
|
143
|
-
Quantity
|
|
144
|
-
The dynamic (absolute) viscosity of water in N-s/m2 = Pa-s = kg/m-s
|
|
145
|
-
|
|
146
|
-
Notes
|
|
147
|
-
-----
|
|
148
|
-
Implements the international equation for viscosity of water as specified by NIST [#]_
|
|
149
|
-
|
|
150
|
-
Valid for 273 < temperature < 1073 K and 0 < pressure < 100,000,000 Pa
|
|
151
|
-
|
|
152
|
-
References
|
|
153
|
-
----------
|
|
154
|
-
.. [#] Sengers, J.V. "Representative Equations for the Viscosity of Water Substance."
|
|
155
|
-
*J. Phys. Chem. Ref. Data* 13(1), 1984.http://www.nist.gov/data/PDFfiles/jpcrd243.pdf
|
|
156
|
-
|
|
157
|
-
Examples
|
|
158
|
-
--------
|
|
159
|
-
>>> water_viscosity_dynamic(20*unit('degC')) #doctest: +ELLIPSIS
|
|
160
|
-
<Quantity(0.000998588610804179, 'kilogram / meter / second')>
|
|
161
|
-
>>> water_viscosity_dynamic(unit('100 degC'),unit('25 MPa')) #doctest: +ELLIPSIS
|
|
162
|
-
<Quantity(0.00028165034364318573, 'kilogram / meter / second')>
|
|
163
|
-
>>> water_viscosity_dynamic(25*unit('degC'),0.1*unit('MPa')) #doctest: +ELLIPSIS
|
|
164
|
-
<Quantity(0.0008872817880143659, 'kilogram / meter / second')>
|
|
165
|
-
|
|
166
|
-
#TODO - check these again after I implement pressure-dependent density function
|
|
167
|
-
|
|
168
|
-
"""
|
|
169
|
-
# generate warnings if temp or pressure are outside valid range of equation
|
|
170
|
-
if temperature < 273 * unit("K") or temperature > 1073 * unit("K"):
|
|
171
|
-
logger.error(
|
|
172
|
-
"Specified temperature (%s) exceeds valid range of NIST equation for viscosity of water. "
|
|
173
|
-
" Cannot extrapolate."
|
|
174
|
-
% temperature
|
|
175
|
-
)
|
|
176
|
-
return None
|
|
177
|
-
|
|
178
|
-
if pressure < 0 * unit("Pa") or pressure > 100000000 * unit("Pa"):
|
|
179
|
-
logger.error(
|
|
180
|
-
"Specified pressure (%s) exceeds valid range of NIST equation for viscosity of water. Cannot extrapolate."
|
|
181
|
-
% pressure
|
|
182
|
-
)
|
|
183
|
-
return None
|
|
184
|
-
|
|
185
|
-
# calculate dimensionless temperature and pressure
|
|
186
|
-
T_star = 647.27 # K
|
|
187
|
-
P_star = 22115000 # Pa
|
|
188
|
-
rho_star = 317.763 # kg/m3
|
|
189
|
-
|
|
190
|
-
T_bar = temperature.to("K").magnitude / T_star
|
|
191
|
-
P_bar = pressure.to("Pa").magnitude / P_star
|
|
192
|
-
rho_bar = water_density(temperature, pressure).magnitude / rho_star
|
|
193
|
-
|
|
194
|
-
# calculate the first function, mu_o
|
|
195
|
-
mu_star = 1e-6 # Pa-s
|
|
196
|
-
a = [0.0181583, 0.0177624, 0.0105287, -0.0036477]
|
|
197
|
-
sum_o = 0
|
|
198
|
-
mu_temp = 0
|
|
199
|
-
for index in range(len(a)):
|
|
200
|
-
sum_o += a[index] * T_bar ** -index
|
|
201
|
-
|
|
202
|
-
mu_o = mu_star * math.sqrt(T_bar) / sum_o
|
|
203
|
-
|
|
204
|
-
# calculate the second fucntion, mu_1
|
|
205
|
-
b = [
|
|
206
|
-
[0.501938, 0.235622, -0.274637, 0.145831, -0.0270448],
|
|
207
|
-
[0.162888, 0.789393, -0.743539, 0.263129, -0.0253093],
|
|
208
|
-
[-0.130356, 0.673665, -0.959456, 0.347247, -0.0267758],
|
|
209
|
-
[0.907919, 1.207552, -0.687343, 0.213486, -0.0822904],
|
|
210
|
-
[-0.551119, 0.0670665, -0.497089, 0.100754, 0.0602253],
|
|
211
|
-
[0.146543, -0.0843370, 0.195286, -0.032932, -0.0202595],
|
|
212
|
-
]
|
|
213
|
-
mu_1 = 0
|
|
214
|
-
|
|
215
|
-
for i in range(len(b)):
|
|
216
|
-
for j in range(len(b[i])):
|
|
217
|
-
mu_temp += rho_bar * b[i][j] * (1 / T_bar - 1) ** i * (rho_bar - 1) ** j
|
|
218
|
-
|
|
219
|
-
mu_1 = math.exp(mu_temp)
|
|
220
|
-
# multiply the functions to return the viscosity
|
|
221
|
-
viscosity = mu_o * mu_1 * unit("kg/m/s")
|
|
222
|
-
|
|
223
|
-
logger.info(
|
|
224
|
-
"Computed dynamic (absolute) viscosity of water as %s at T=%s and P = %s"
|
|
225
|
-
% (viscosity, temperature, pressure)
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
logger.debug(
|
|
229
|
-
"Computed dynamic (absolute) viscosity of water using empirical NIST equation described in Sengers, J.V. "
|
|
230
|
-
"Representative Equations for the Viscosity of Water Substance. J. Phys. Chem. Ref. Data 13(1), 1984."
|
|
231
|
-
)
|
|
232
|
-
|
|
233
|
-
return viscosity.to("kg/m/s")
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
def water_viscosity_kinematic(temperature=25 * unit("degC"), pressure=1 * unit("atm")):
|
|
237
|
-
"""
|
|
238
|
-
Return the kinematic viscosity of water in m2/s = Stokes
|
|
239
|
-
at the specified temperature.
|
|
240
|
-
|
|
241
|
-
Parameters
|
|
242
|
-
----------
|
|
243
|
-
temperature : Quantity, optional
|
|
244
|
-
The temperature. Defaults to 25 degC if omitted.
|
|
245
|
-
pressure : Quantity, optional
|
|
246
|
-
The ambient pressure of the solution.
|
|
247
|
-
Defaults to atmospheric pressure (1 atm) if omitted.
|
|
248
|
-
|
|
249
|
-
Returns
|
|
250
|
-
-------
|
|
251
|
-
Quantity
|
|
252
|
-
The kinematic viscosity of water in Stokes (m2/s)
|
|
253
|
-
|
|
254
|
-
Examples
|
|
255
|
-
--------
|
|
256
|
-
>>> water_viscosity_kinematic() #doctest: +ELLIPSIS
|
|
257
|
-
<Quantity(8.899146003595295e-07, 'meter ** 2 / second')>
|
|
258
|
-
|
|
259
|
-
See Also
|
|
260
|
-
--------
|
|
261
|
-
water_viscosity_dynamic
|
|
262
|
-
water_density
|
|
263
|
-
|
|
264
|
-
"""
|
|
265
|
-
kviscosity = water_viscosity_dynamic(temperature, pressure) / water_density(
|
|
266
|
-
temperature, pressure
|
|
267
|
-
)
|
|
268
|
-
logger.info(
|
|
269
|
-
"Computed kinematic viscosity of water as %s at T=%s and P = %s "
|
|
270
|
-
% (kviscosity, temperature, pressure)
|
|
271
|
-
)
|
|
272
|
-
return kviscosity.to("m**2 / s")
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
def water_dielectric_constant(temperature=25 * unit("degC")):
|
|
276
|
-
"""
|
|
277
|
-
Return the dielectric constant of water at the specified temperature.
|
|
278
|
-
|
|
279
|
-
Parameters
|
|
280
|
-
----------
|
|
281
|
-
temperature : Quantity, optional
|
|
282
|
-
The temperature. Defaults to 25 degC if omitted.
|
|
283
|
-
|
|
284
|
-
Returns
|
|
285
|
-
-------
|
|
286
|
-
float
|
|
287
|
-
The dielectric constant (or permittivity) of water relative to the
|
|
288
|
-
permittivity of a vacuum. Dimensionless.
|
|
289
|
-
|
|
290
|
-
Notes
|
|
291
|
-
-----
|
|
292
|
-
This function implements a quadratic fit of measured permittivity data as
|
|
293
|
-
reported in the CRC Handbook [#]_. The parameters given are valid over the
|
|
294
|
-
range 273 K to 372 K. Permittivity should not be extrapolated beyond this
|
|
295
|
-
range.
|
|
296
|
-
|
|
297
|
-
.. math:: \\epsilon(T) = a + b T + c T^2
|
|
298
|
-
|
|
299
|
-
References
|
|
300
|
-
----------
|
|
301
|
-
.. [#] "Permittivity (Dielectric Constant) of Liquids." *CRC Handbook of
|
|
302
|
-
Chemistry and Physics*, 92nd ed, pp 6-187 - 6-208.
|
|
303
|
-
|
|
304
|
-
Examples
|
|
305
|
-
--------
|
|
306
|
-
>>> water_dielectric_constant(unit('20 degC')) #doctest: +ELLIPSIS
|
|
307
|
-
80.15060...
|
|
308
|
-
|
|
309
|
-
Display an error if 'temperature' is outside the valid range
|
|
310
|
-
|
|
311
|
-
>>> water_dielectric_constant(-5*unit('degC'))
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
"""
|
|
315
|
-
# do not return anything if 'temperature' is outside the range for which
|
|
316
|
-
# this fit applies
|
|
317
|
-
if temperature < 273 * unit("K") or temperature > 372 * unit("K"):
|
|
318
|
-
logger.error(
|
|
319
|
-
"Specified temperature (%s) exceeds valid range of data. Cannot extrapolate."
|
|
320
|
-
% temperature.to("K")
|
|
321
|
-
)
|
|
322
|
-
return None
|
|
323
|
-
|
|
324
|
-
# otherwise, calculate the dielectric constant using the quadratic fit
|
|
325
|
-
a = 0.24921e3
|
|
326
|
-
b = -0.79069e0
|
|
327
|
-
c = 0.72997e-3
|
|
328
|
-
dielectric = (
|
|
329
|
-
a + b * temperature.to("K").magnitude + c * temperature.to("K").magnitude ** 2
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
logger.info(
|
|
333
|
-
"Computed dielectric constant of water as %s at %s" % (dielectric, temperature)
|
|
334
|
-
)
|
|
335
|
-
|
|
336
|
-
logger.debug(
|
|
337
|
-
"Computed dielectric constant of water using empirical equation given in Permittivity (Dielectric Constant) "
|
|
338
|
-
"of Liquids. CRC Handbook of Chemistry and Physics, 92nd ed, pp 6-187 - 6-208."
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
return dielectric
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
def water_conductivity(temperature):
|
|
345
|
-
pass
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
# TODO - turn doctest back on when the nosigint error is gone
|
|
349
|
-
if __name__ == "__main__":
|
|
350
|
-
import doctest
|
|
351
|
-
|
|
352
|
-
doctest.testmod()
|
pyEQL-0.5.2.dist-info/AUTHORS
DELETED
pyEQL-0.5.2.dist-info/METADATA
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: pyEQL
|
|
3
|
-
Version: 0.5.2
|
|
4
|
-
Summary: A Python library for solution chemistry
|
|
5
|
-
Home-page: https://github.com/rkingsbury/pyEQL
|
|
6
|
-
Author: Ryan S. Kingsbury
|
|
7
|
-
Author-email: RyanSKingsbury@alumni.unc.edu
|
|
8
|
-
License: GNU Lesser General Public License v3 (LGPLv3)
|
|
9
|
-
Keywords: thermodynamics chemistry chemical equilibrium desalination MinEQL ChemEQL PHREEQC
|
|
10
|
-
Platform: UNKNOWN
|
|
11
|
-
Classifier: Development Status :: 3 - Alpha
|
|
12
|
-
Classifier: Intended Audience :: Science/Research
|
|
13
|
-
Classifier: Topic :: Scientific/Engineering
|
|
14
|
-
Classifier: Topic :: Software Development :: Libraries
|
|
15
|
-
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
|
|
16
|
-
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.2
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.3
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.4
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.5
|
|
21
|
-
Requires-Dist: pint
|
|
22
|
-
Requires-Dist: scipy
|
|
23
|
-
|
|
24
|
-

|
|
25
|
-
|
|
26
|
-
A Python library for solution chemistry
|
|
27
|
-
=======================================
|
|
28
|
-
|
|
29
|
-
pyEQL is a Python library that provides tools for modeling aqueous electrolyte
|
|
30
|
-
solutions. It allows the user to manipulate solutions as Python
|
|
31
|
-
objects, providing methods to populate them with solutes, calculate
|
|
32
|
-
species-specific properties (such as activity and diffusion coefficients),
|
|
33
|
-
and retreive bulk properties (such as density, conductivity, or volume).
|
|
34
|
-
|
|
35
|
-

|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
pyEQL is designed to be customizable and easy to integrate into projects
|
|
39
|
-
that require modeling of chemical thermodyanmics of aqueous solutions.
|
|
40
|
-
It aspires to provide a flexible, extensible framework for the user, with a
|
|
41
|
-
high level of transparency about data sources and calculation methods.
|
|
42
|
-
|
|
43
|
-
pyEQL runs on Python 3.0+ and is licensed under LGPL.
|
|
44
|
-
|
|
45
|
-
Key Features
|
|
46
|
-
------------
|
|
47
|
-
|
|
48
|
-
- Build accurate solution properties using a minimum of inputs. Just specify
|
|
49
|
-
the identity and quantity of a solute and pyEQL will do the rest.
|
|
50
|
-
|
|
51
|
-
- "Graceful Decay" from more sophisticated, data-intensive modeling approaches
|
|
52
|
-
to simpler, less accurate ones depending on the amount of data supplied.
|
|
53
|
-
|
|
54
|
-
- Not limited to dilute solutions. pyEQL contains out of the box support for
|
|
55
|
-
the Pitzer Model and other methods for modeling concentrated solutions.
|
|
56
|
-
|
|
57
|
-
- Extensible database system that allows one to supplement pyEQL's default
|
|
58
|
-
parameters with project-specific data.
|
|
59
|
-
|
|
60
|
-
- Units-aware calculations (by means of the [pint](https://github.com/hgrecco/pint) library)
|
|
61
|
-
|
|
62
|
-
Documentation
|
|
63
|
-
-------------
|
|
64
|
-
Detailed documentation is available at <https://pyeql.readthedocs.io/>
|
|
65
|
-
|
|
66
|
-
Dependencies
|
|
67
|
-
------------
|
|
68
|
-
- Python 3
|
|
69
|
-
- [pint](https://github.com/hgrecco/pint) - for units-aware calculations
|
|
70
|
-
- [scipy](https://www.scipy.org/) - for certain nonlinear equation solvers
|
|
71
|
-
|
|
72
|
-
|
pyEQL-0.5.2.dist-info/RECORD
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
pyEQL/__init__.py,sha256=VMtj7Cj_PbI-pkLjcKBddzruXi2ujTwbOCi0iyWl5Ck,1323
|
|
2
|
-
pyEQL/activity_correction.py,sha256=SzDfIvU1R_l0khDXBrsXyExWiYfvIcnZAs_R5ezjBl8,37965
|
|
3
|
-
pyEQL/chemical_formula.py,sha256=eVTRdGppkqjIg1-i3k8-voZZziaR3hzwDrUzrW8XoI8,30286
|
|
4
|
-
pyEQL/database.py,sha256=tFgUS_Q-Ey2CeC1DvP3BfiYxLAWiu1FT5DGsQOLtCsI,11576
|
|
5
|
-
pyEQL/elements.py,sha256=jAIK4jWHgtKOenGwvKuIDvjkckeEETdnhkL5kdVFff4,137341
|
|
6
|
-
pyEQL/equilibrium.py,sha256=FQ1lPwAOwefk3GAPQklu5T2JP2CiBnMP_D4R5Zqjhsw,9281
|
|
7
|
-
pyEQL/functions.py,sha256=l15Rfonu7mJD6vWRT_-kDvIBdDt6Ic_-SbMFVEvo0kk,18893
|
|
8
|
-
pyEQL/logging_system.py,sha256=MUjaz6V5iJEMAaFbtMfOr-y7vew44vfDfxPrs1_JEFI,1895
|
|
9
|
-
pyEQL/parameter.py,sha256=tF9eKzhaBOE_NEQ1ZrsVPD1UFJ2Ldl3v67Ld1xK5tqU,16593
|
|
10
|
-
pyEQL/pint_custom_units.txt,sha256=WwyfWmRRwBgglDS7sBKAcqrSqwqqxpz55x8flryzadk,2887
|
|
11
|
-
pyEQL/salt_ion_match.py,sha256=On_SoGcwerjGkKgvg5AHHNIhMtxwLJX1l5fkehO1Js4,10757
|
|
12
|
-
pyEQL/solute.py,sha256=7XDu37pal5b_rDqURUpiQvM2OVJWzruTni8YEhj9oiE,7096
|
|
13
|
-
pyEQL/solution.py,sha256=oYdB9LABSRvgZbX7VIZWMTwWE-Z0449TRfNZiJQg9Ws,94225
|
|
14
|
-
pyEQL/water_properties.py,sha256=wrINLulAuSXYkeNyEzIL2u2UxHQmkGqHXJPICAReqZA,10933
|
|
15
|
-
pyEQL/database/Erying_viscosity.tsv,sha256=8i51TjhE-oKc0aPx2BjnVGSUWfDB2A1DNp5FIRwTRxU,717
|
|
16
|
-
pyEQL/database/Jones_Dole_B.tsv,sha256=Kf5ob78bPqz_MYiEjsEW4skeEeiRu_bydL28AGxVejw,804
|
|
17
|
-
pyEQL/database/Jones_Dole_B_inorganic_Jenkins.tsv,sha256=L3ERJVglUAifG1fIUNKUdzQ2uAfXphdxl6bk4PXK8MU,1211
|
|
18
|
-
pyEQL/database/LICENSE,sha256=HvJ5_cU8LwB3LYPJ8QMCebe6lDufb3Lrd57BzU4TUY0,243
|
|
19
|
-
pyEQL/database/dielectric_parameter.tsv,sha256=Ayd608by4iGHzUPD4mLKaMDWvE03NybMYRFgaKnVRsQ,659
|
|
20
|
-
pyEQL/database/diffusion_coefficient.tsv,sha256=8vXDaxilPSkiOgmHhnB8HSFIb62IEJHLFMePkefzYLs,2042
|
|
21
|
-
pyEQL/database/hydrated_radius.tsv,sha256=jrpY-CByCodPxRuTmYERcHG_EInJAoEXXBZVu6ZMfoI,672
|
|
22
|
-
pyEQL/database/ionic_radius.tsv,sha256=KfR_d66qHQSqPmNWzR-Wwl-Ip87z-jW3cZtVe00qWK8,737
|
|
23
|
-
pyEQL/database/partial_molar_volume.tsv,sha256=62SlUGzTmrYMKU56I37mavaELIM3521r_dGiFuXZILo,487
|
|
24
|
-
pyEQL/database/pitzer_activity.tsv,sha256=nwlnb30r9vk8SmBgTD7eJ4WU7pStPHsqNJvlkmWJfyI,6418
|
|
25
|
-
pyEQL/database/pitzer_volume.tsv,sha256=GuoFkWtjJkyssiKWP8f5ZTlSC3hXvYqm8_6A8OO8U5E,6632
|
|
26
|
-
pyEQL/database/template.tsv,sha256=eqU1IYlMQNfn_PzbHj9IifziT8BsFDsTFnu1mzhJLFw,668
|
|
27
|
-
pyEQL/tests/__init__.py,sha256=KnPsldLXqwhHwIu8NSpQfDY5a6BIE6kwRNlDIXENweI,699
|
|
28
|
-
pyEQL/tests/test_activity.py,sha256=0rBQK_OiweHQAQwcR0esStos_DEAPxL9Zw_QChCxV4E,20101
|
|
29
|
-
pyEQL/tests/test_bulk_properties.py,sha256=o6jSdMNp53ej48IJ6_Ax5lbFi694c9YrqfKj8O-5qi4,2600
|
|
30
|
-
pyEQL/tests/test_chemical_formula.py,sha256=A1uW0BVMapQlyhDAeWLjX190yyG5mu_uhLMVBVvXIsM,8284
|
|
31
|
-
pyEQL/tests/test_debye_length.py,sha256=ImjKxih4oU2nrzgQWtHGpMIqrJ9VW8VMl-IRMcvztxk,1947
|
|
32
|
-
pyEQL/tests/test_density.py,sha256=4ISEmTf7SKGzmFdsNeoAz3IDC6f2rdLifskG9icmR9Y,3371
|
|
33
|
-
pyEQL/tests/test_dielectric.py,sha256=7mrPbyexNJEr-RInwZByas23CRcBZ8cahQcqbxJVhrM,4373
|
|
34
|
-
pyEQL/tests/test_effective_pitzer.py,sha256=D4fwo3Zo6sUk2J6RMqMslf2XaEcRRnmV9PtT45nCKvw,9830
|
|
35
|
-
pyEQL/tests/test_mixed_electrolyte_activity.py,sha256=P1N5bnand5VDbMh6wOy9j8H55nFD6ttSLtMthQqQj_U,6112
|
|
36
|
-
pyEQL/tests/test_osmotic_coeff.py,sha256=mYttL2_tONyWBiwDCaZ9y9FYWC0gYVnFMxg2peHyFqU,3589
|
|
37
|
-
pyEQL/tests/test_pyeql_volume_concentration.py,sha256=Q-7I1F0FLyJvyabH1w_IejrXZeonaYOxFGSfCPZiQ8U,15304
|
|
38
|
-
pyEQL/tests/test_salt_matching.py,sha256=nbdGJOxadeSol-w8qd8vnfcC9FTcy6J_yiMU288Ixxo,8691
|
|
39
|
-
pyEQL/tests/test_solute_properties.py,sha256=4cm6T9TlwrBIZIJTQHw4wAS4MqTBzt5pWV6FE4PMjwA,9876
|
|
40
|
-
pyEQL-0.5.2.dist-info/AUTHORS,sha256=zx09hchqmbsKPaO3PNJYjCSxgv3oVjCvfsnWUn2MOyE,253
|
|
41
|
-
pyEQL-0.5.2.dist-info/COPYING,sha256=4_dNaZemS9vMORtVnqEbYLCMeyqxRS92o_KTQnB0DFk,7648
|
|
42
|
-
pyEQL-0.5.2.dist-info/LICENSE,sha256=wOgaPqK-namm93G2qZ5mx-o3Sqaop47M_mOjh1lTCsg,1153
|
|
43
|
-
pyEQL-0.5.2.dist-info/METADATA,sha256=uIfq6tR9qZAYPye4lwP34Cdjs9jdWLYpKj-kJtCKdtI,2770
|
|
44
|
-
pyEQL-0.5.2.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
|
|
45
|
-
pyEQL-0.5.2.dist-info/entry_points.txt,sha256=TmTEUVZcwU6Ine3HfbTSTKiRezBhhAwGFmakO-AbbfY,38
|
|
46
|
-
pyEQL-0.5.2.dist-info/top_level.txt,sha256=QMOaZjCAm_lS4Njsjh4L0B5aWnJFGQMYKhuH88CG1co,6
|
|
47
|
-
pyEQL-0.5.2.dist-info/RECORD,,
|
|
File without changes
|