Parse input to high-level interface¶
The high level interface functions (eqtk.solve(), eqtk.fixed_value_solve(), and eqtk.volumetric_titration()) take arguments as a variety of data types, including None, but the low-level function require strict typing. All three high-level functions take as arguments
c0, initial concentrationsN, stoichiometric matrixK, equilibrium constantslogK, natural logarithm of dimensionless equilibrium constantsA, conservation matrixG, free energies of chemical speciesnames, names of chemical speciesunits, units of concentrationG_units, units of energysolvent_density, number density of solventT, temperature in units of Kelvin
The low-level functions take the natural logarithm of dimensionless K as an argument.
Additionally, c0 and G must be dimensionless. The variables must have the following data types.
x0: Numpy array, dtype float, shape (n_points, n_compounds)N: Numpy array, dtype float, shape (n_reactions, n_compounds)logK: Numpy array, dtype float, shape (n_reactions,)A: Numpy array, dtype float, shape (n_conserv_laws, n_compounds)G: Numpy array, dtype float, shape (n_compounds,)names: list of strings, len n_compoundssolvent_density: float
Once everything is converted to dimensionless units and the solvent density is computed, units, G_units, and T are no longer needed.
The function eqtk.parse_input() converts input to these data types for use in lower level function. For most applications, users use the high-level functions and do not need to directly call eqtk.parse_input(), but this function can be useful if you intend to use the low-level interfaces, for example for repeated calculations, and want to appropriately prepare their input.
The eqtk.parse_input() function has one additional return value. For formatting the output in the high-level interface, it is also useful to know if there is a single calculation to be done, or if multiple sets of initial concentrations are given. eqtk.parse_input() also returns a boolean that is True if only one calculation is to be computed.
We show as an example the dissociation of oxalic acid in presence of hydroxide.
rxns = """
<=> OH⁻ + H⁺ ; 1e-14
C₂O₄H₂ <=> C₂O₄H⁻ + H⁺ ; 0.0537
C₂O₄H⁻ <=> C₂O₄²⁻ + H⁺ ; 5.37e-5
"""
c0 = {"C₂O₄H₂": 0.1, "OH⁻": 0, "H⁺": 0, "C₂O₄H⁻": 0, "C₂O₄²⁻": 0}
# We could first convert rxn's to N using eqtk.parse_rxns(rxns),
# but don't have to.
x0, N, logK, A, G, names, solvent_density, single_point = eqtk.parse_input(
c0=c0,
N=rxns,
K=None,
logK=None,
A=None,
G=None,
names=None,
units='M',
solvent_density=None,
T=293.15,
G_units=None,
)
print('x0:\n', x0, '\n')
print('N:\n', N, '\n')
print('logK:\n', logK, '\n')
print('A:\n', A, '\n')
print('G:\n', G, '\n')
print('names:\n', names, '\n')
print('solvent_density:\n', solvent_density, '\n')
print('single_point:\n', single_point)
The result is
x0:
[[0.00180476 0. 0. 0. 0. ]]
N:
[[ 0. 1. 1. 0. 0.]
[-1. 0. 1. 1. 0.]
[ 0. 0. 1. -1. 1.]]
logK:
[-40.26567237 -6.93908281 -13.84683809]
A:
None
G:
None
names:
['C₂O₄H₂', 'OH⁻', 'H⁺', 'C₂O₄H⁻', 'C₂O₄²⁻']
solvent_density:
55.408916789969595
single_point:
True