Skip to content

Solving equilibria

There are two 'layers' of solver in Pytzer: stoichiometric and thermodynamic.

The stoichiometric solver determines the molality of each solute for a given set of total molalities and fixed stoichiometric equilibrium constants.

The thermodynamic solver determines the molality of each solute and stoichiometric equilibrium constants for a given set of total molalities and fixed thermodynamic equilibrium constants.

Both solvers are fully compatible with Jax (JIT and grad).

You can solve equilibria using the following functions. Lower-level approaches with more fine control are possible, but not yet documented.

Thermodynamic solver

You can solve a single solution for equilibrium using pz.solve:

sr = pz.solve(totals, temperature, pressure)

Arguments

  • totals is dict of the total molality of each group of components in the solution. Non-equilibrating components are included too. Equilibrating components are grouped as follows:
    • totals["CO2"] = sum of all carbonate species.
    • totals["PO4"] = sum of all phosphate species.
    • totals["F"] = sum of all fluoride species.
    • totals["SO4"] = sum of all sulfate species.
    • totals["BOH3"] = sum of all borate species.
    • totals["Mg"] = sum of all magnesium species.
    • totals["Ca"] = sum of all calcium species.
    • totals["Sr"] = sum of all strontium species.
  • temperature is the temperature in K.
  • pressure is the pressure in dbar.

Results

The result sr is a SolveResult named tuple containing fields corresponding to the solute molalities at equilibria (sr.solutes, dict) and the natural logarithms of the stoichiometric equilibrium constants (sr.lnks_constants, dict).