Empirical Sorption Models
Dual Mode
$C = k_D \cdot p + \frac{C_{H}^{'}bp}{1 + bp}$
The Dual Mode model is a semi-empirical model that combines Henry's Law ($k_D \cdot p$) with a Langmuir-Hinshelwood-like adsorption model ($\frac{C_{H}^{'}bp}{1 + bp}$) to describe sorption in glassy polymers. It has some predictive power and is widely used in the membrane field.
SorptionModels.fit_model — Methodfit_model(DualMode(), isotherm::IsothermData, [uncertainty_method=nothing], [apply_weights=false], [use_fugacity=false])Fit the dual mode model to the pressures and concentrations present in the isotherm.
Options
- For determining the uncertainty of the model parameters, the
:JackKnife, and:Bootstrapmethods are available. apply_weightswill use a weighted nonlinear regression method to solve the parameters, given thatMeasurementtypes are used somewhere in the data.use_fugacitywill fit the model to fugacities instead of pressures (they should be present in the isotherm data).
SorptionModels.infinite_dilution_solubility — Methodinfinite_dilution_solubility(dm::DualModeModel)Get the infinite dilution solubility coefficient in ((CC/CC) / MPa))
SorptionModels.predict_concentration — Methodpredict_concentration(::AbstractVector{<:DualModeModel}, partial_pressures_mpa::AbstractVector{<:Number})Predict mixed gas concentrations using the dual mode mixing rule (langmuir-type competitive sorption) given a set of fit models and corresponding partial pressures. e.g., predict_concentration([gas_1_model, gas_2_model, ...], [gas_1_pressure, gas_2_pressure, ...])
partial_pressures_mpa is a bit of a misnomer. If the model was fit to fugacities, then fugacities should, of course, be specified (in MPa).
SorptionModels.predict_concentration — Methodpredict_concentration(::DualModeModel, pressures_mpa::AbstractVector)Predict a vector of concentrations for a pure dual mode model given a corresponding vector of pressures. Mixed dual mode models aren't implemented yet # todo
SorptionModels.predict_concentration — Methodpredict_concentration(::DualModeModel, pressure_mpa::Number)Predict the concentration of a penetrant given a dual mode model and pressure (MPa).
SorptionModels.predict_pressure — MethodPredict a pressure (MPa) given a concentration (CC(STP)/CC(Polymer)) according to the Dual Mode model.
The solved pressure for a single component Dual Mode model is:
$P = \frac{\sqrt{b^{2}\left(c_h-x\right)^{2}+2bk\left(c+x\right)+k^{2}}+b\left(x-c\right)-k}{2bk}$
Henry's Law
$C = k_D \cdot p$
Henry's law is a simple model that describes rubbery polymers without swelling and simple sorption some materials. This is used essentially when the sorption relationship is linear.
SorptionModels.fit_model — Methodfit_model(Henry(), isotherm::IsothermData, [uncertainty_method=nothing], [apply_weights=false], [use_fugacity=false])Fit Henry's Law to the pressures and concentrations present in the isotherm.
SorptionModels.infinite_dilution_solubility — Methodinfinite_dilution_solubility(dm::HenryModel)Get the infinite dilution solubility coefficient in ((CC/CC) / MPa))
SorptionModels.predict_concentration — Methodpredict_concentration(::HenryModel, pressure_mpa::Number)Predict the concentration of a penetrant given a henry model and pressure (MPa).
SorptionModels.predict_pressure — MethodPredict a pressure (MPa) given a concentration (CC(STP)/CC(Polymer)) according to Henry's Law.
Flory-Huggins
$C = φ / ((1-φ) \cdot V_{pen}$ where $a = φ * exp((1-φ) + \chi * (1-φ)^2)$, $a$ is activity and $\chi$ is the Flory-Huggins interaction paramter.
The Flory-Huggins model is a lattice fluid model that describes sorption via volume fraction and activity. This model is most typically used for rubbery polymers that exhibit swelling.
SorptionModels.fit_model — Methodfit_model(::FloryHuggins, activities, concentrations, penetrant_molar_volume; [activity_function])Fit a Flory Huggins model given an activity vector, concentration vector, penetrant molar volume, and an optional activity conversion function which will allow it to predict_concentration with pressure.
SorptionModels.fit_model — Methodfit_model(FloryHuggins(), isotherm::IsothermData, [uncertainty_method=nothing], [apply_weights=false])Fit the dual mode model to the pressures and concentrations present in the isotherm. If the isotherm contains activities, then they will be prioritized, otherwise it will look for a conversion function and use pressures.
Options
- For determining the uncertainty of the model parameters, the
:JackKnife, and:Bootstrapmethods are available. apply_weightswill use a weighted nonlinear regression method to solve the parameters, given thatMeasurementtypes are used somewhere in the data.use_fugacitywill fit the model to fugacities instead of pressures (they should be present in the isotherm data).
SorptionModels.fit_model — Methodfit_model(::FloryHuggins, pressures_mpa, concentrations, penetrant_molar_volume, activity_function)Fit a Flory Huggins model given a pressure vector, concentration vector, penetrant molar volume, and a (required) activity conversion function which will allow it to predict_concentration with pressure.
Flory-Huggins Dual Mode
$C = φ / ((1-φ) \cdot V_{pen} + \frac{C_{H}^{'}bp}{1 + bp}$ where $a = φ * exp((1-φ) + \chi * (1-φ)^2)$, $a$ is activity and $\chi$ is the Flory-Huggins interaction paramter.
This model combines the Dual Mode model with the Flory-Huggins model, essentially allowing for the description of glassy polymers which exhibit swelling.
SorptionModels.a_predict_concentration — Methoda_predict_concentration(::FloryHugginsDualModeModel, activity::Number)Predict the concentration of a penetrant given a flory huggins dual mode model and activity.
SorptionModels.fit_model — Methodfit_model(FloryHugginsDualMode(), isotherm::IsothermData, [uncertainty_method=nothing], [apply_weights=false])Fit the dual mode model to the pressures and concentrations present in the isotherm.
Options
- For determining the uncertainty of the model parameters, the
:JackKnife, and:Bootstrapmethods are available. apply_weightswill use a weighted nonlinear regression method to solve the parameters, given thatMeasurementtypes are used somewhere in the data.use_fugacitywill fit the model to fugacities instead of pressures (they should be present in the isotherm data).
GAB
$C = \frac{C_pkAa}{(1-ka) \cdot (1 - ka - kAa)}$
The GAB model is a pure component model that describes polymer sorption as a function of activity. It excels at vapor sorption, which typically demonstrates a sigmoidally shaped isotherm. Howerver, it is not very predictive, and is usually best suited for use as
- an accurate interpolation method, or
- to extract information from the isotherm in the form of the model paramters, which have physical meaning.
SorptionModels.a_predict_concentration — Methoda_predict_concentration(gm::GABModel, activities::AbstractVector)Returns a vector of concentrations predicted by the GAB model for a corresponding vector of activities.
SorptionModels.a_predict_concentration — Methoda_predict_concentration(gm::GABModel, activity::Number)Predict concentration based on a GAB model and given activity. Mixed GAB models aren't implemented due to the empirical nature of the model (and it's lack of predictivity)
SorptionModels.fit_model — Methodfit_model(GAB(), activities::AbstractVector, concentrations::AbstractVector; kwargs...)Fit a set of activities and corresponding concentrations (CC/CC) to the GAB model.
- see the above function for applicable key words.
SorptionModels.predict_concentration — Methodpredict_concentration(gm::GABModel, pressure::Number)Predict a concentration given a pressure. Note that GAB is fit to activity, so you will need to specify a pressure_conversion_function(pressure::Number) -> activity::Number when fitting the model. See fit_gab_model