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:Bootstrap
methods are available. apply_weights
will use a weighted nonlinear regression method to solve the parameters, given thatMeasurement
types are used somewhere in the data.use_fugacity
will 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:Bootstrap
methods are available. apply_weights
will use a weighted nonlinear regression method to solve the parameters, given thatMeasurement
types are used somewhere in the data.use_fugacity
will 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:Bootstrap
methods are available. apply_weights
will use a weighted nonlinear regression method to solve the parameters, given thatMeasurement
types are used somewhere in the data.use_fugacity
will 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