flory
is a Python package for analyzing field theories of multicomponent mixtures.
In particular, the package provides routines to determine coexisting states numerically, which is a challenging problem since the thermodynamic coexistence conditions are many coupled non-linear equations.
flory
supports finding coexisting phases with an arbitrary number of components.
The associated average free energy density of the system reads
$$\bar{f}({N_\mathrm{P}}, {Jp}, {\phi{p,i}}) = \sum{p=1}^{{N\mathrm{P}}} Jp f({\phi{p,i}}) \; ,$$
where $N\mathrm{C}$ is the number of components, $N\mathrm{P}$ is the number of phases, $Jp$ is the fraction of the system volume occupied by phase $p$, and $\phi{p,i}$ is the volume fraction of component $i$ in phase $p$.
flory
supports different forms of interaction, entropy, ensemble, and constraints to describe the free energy of phases.
For example, with the commonly used Flory-Huggins free energy, the free energy density of each homogeneous phase reads
$$f({\phii}) = \frac{1}{2}\sum{i,j=1}^{N\mathrm{C}} \chi{ij} \phi_i \phij + \sum{i=1}^{N_\mathrm{C}} \frac{\phi_i}{l_i} \ln \phi_i \; ,$$
where $\chi_{ij}$ is the Flory-Huggins interaction parameter between component $i$ and $j$, and $li$ is the relative molecular size of component $i$.
Given an interaction matrix $\chi{ij}$, average volume fractions of all components across the system $\bar{\phi}_i$, and the relative molecule sizes $l_i$, flory
provides tools to find the coexisting phases in equilibrium.
flory
is available on pypi
, so you should be able to install it through pip
:
pip install flory
As an alternative, you can install flory
through conda using the conda-forge channel:
conda install -c conda-forge flory
The following example determines the coexisting phases of a binary mixture with Flory-Huggins free energy:
import flory
num_comp = 2 # Set number of components
chis = [[0, 4.0], [4.0, 0]] # Set the \chi matrix
phi_means = [0.5, 0.5] # Set the average volume fractions
# obtain coexisting phases
phases = flory.find_coexisting_phases(num_comp, chis, phi_means)
It is equivalent to a more advanced example:
import flory
num_comp = 2 # Set number of components
chis = [[0, 4.0], [4.0, 0]] # Set the \chi matrix
phi_means = [0.5, 0.5] # Set the average volume fractions
# create a free energy
fh = flory.FloryHuggins(num_comp, chis)
# create a ensemble
ensemble = flory.CanonicalEnsemble(num_comp, phi_means)
# construct a finder from interaction, entropy and ensemble
finder = flory.CoexistingPhasesFinder(fh.interaction, fh.entropy, ensemble)
# obtain phases by clustering compartments
phases = finder.run().get_clusters()
The free energy instance provides more tools for analysis, such as:
# calculate the chemical potentials of the coexisting phases
mus = fh.chemical_potentials(phases.fractions)