prommis.ion_exchange.ion_exchange_multicomponent#
Ion Exchange Multicomponent (IXMC) Model#
Author: E. Soraya Rawlings
The Ion Exchange Multicomponent (IXMC) model represents a fixed-bed ion exchange process for the recovery of critical minerals and rare earth elements (REEs) from diverse sources, including waste streams generated during mining and industrial processes. The IXMC introduces new features to address the complexities of multicomponent ion exchange, enabling the prediction of process equilibrium, hydrodynamics, bed and column geometry, and capital and operating costs. The model extends the capabilities of the WaterTAP Ion Exchange unit model.
Configuration Arguments#
The IXMC unit model requires the use of the Multi-component aqueous solution (MCAS) property package . Users must specify the solute ions and provide molecular weight, diffusivity, and charge data for each ion in the system.
The primary configuration arguments are:
property_package: PhysicalParameterBlock for stream properties.property_package_args: Arguments for constructing the property package.target_component: The primary ion to be removed via ion exchange.regenerant: Regenerant configuration (e.g.,single_use,NaCl).resin: Resin name (e.g.,S950)resin_data_path: Path to the JSON file containing resin properties.reactive_ions: List of additional ions to be separated alongside the target ion.number_of_trapezoids: Number of trapezoids for trapezoidal rule calculations.minimum_concentration_trapezoids: Minimum concentration for ions to be used during trapezoidal rule.
Degrees of Freedom#
In addition to specifying inlet feed state variables (temperature, pressure, and molar flowrate for each ion \(j\)), users must provide additional degrees of freedom for both single-component and multicomponent configurations to fully define the model. Common variables to fix include:
\(resin\_diam\): Diameter of the resin bead.
\(resin\_density\): Bulk density of the resin.
\(bed\_depth\): Height of the resin bed within column.
\(bed\_diameter\): Diameter of the column.
\(bed\_porosity\): Porosity of the resin bed.
\(number\_columns\): Number of columns in operation.
\(loading\_rate\) or \(ebct\): Superficial velocity through the resin bed or empty bed contact time.
Equilibrium-related variables to fix include:
\(freundlich\_n_{j}\): Freundlich isotherm exponent for each ion \(j\)
\(bv\_50_{j}\): Bed volumes at fifty percent breakthrough for each ion \(j\)
\(conc\_comp\_norm\_breakthrough_{j}\): Normalized breakthrough concentration for each ion \(j\)
\(mass\_transfer\_coeff_{j}\): Mass transfer coefficient for each ion \(j\)
Model Structure#
The IXMC model is organized into three distinct models, each designed to address specific aspects of the ion exchange process:
ion_exchange_multicomponent_base: The base model that provides the foundational structure for the IXMC model, defining all global key variables and parameters, including column geometry and resin properties.
ion_exchange_multicomponent: The equilibrium model that incorporates the Freundlich multicomponent equations, using the Clark equation to describe the adsorption behavior of ions on the resin surface. It also applies all variables and equations for the trapezoidal rule calculations to determine breakthrough curve behavior and estimate effluent concentrations.
ion_exchange_cost_block and ion_exchange_cost_model: The costing models that implement costing variables and parameters using standard PrOMMiS costing features, ensuring compatibility with existing costing methodologies.
Assumptions#
The model is implemented as a 0D control volume with the following assumptions:
Single liquid phase
Steady state operation
Single and multiple solutes and one solvent (water)
Plug flow and isothermal conditions
Freundlich isotherm for equilibrium modeling
If
single_useregenerant configuration is used, backwashing, regeneration, and rinsing steps are not modeled and associated costs are zero.For multicomponent systems, competitive effects between ions are not currently modeled (see Limitations).
Sets#
The model defines the following sets:
Components: Ions and solvent in the solution (e.g.,['H2O', 'Cation_+', 'Anion_-', 'Inert'])Target Component: Target ion to be separated (e.g.,['Cation_+'])Reactive Ions: List of ions to be separatedInert: List of ions that are not separated
Default Parameters#
The IXMC model has the following parameters:
Symbol in Model |
Description |
|---|---|
\(underdrain\_h\) |
Height of the column underdrain. |
\(distributor\_h\) |
Height of the column distributor. |
\(Pe\_p\_A\) |
Peclet particle equation parameter A. |
\(Pe\_p\_exp\) |
Peclet particle equation exponent. |
\(Sh\_A\) |
Sherwood equation parameter A. |
\(Sh\_exp\_A\) |
Sherwood equation exponent A. |
\(Sh\_exp\_B\) |
Sherwood equation exponent B. |
\(Sh\_exp\_C\) |
Sherwood equation exponent C. |
\(pump\_efficiency\) |
Pump efficiency. |
\(backwash\_loading\_rate\) |
Backwash loading rate. |
\(backwash\_time\) |
Backwash time. |
\(pressure\_drop\_param\_A\) |
Pressure drop equation parameter A (resin-specific). |
\(pressure\_drop\_param\_B\) |
Pressure drop equation parameter B (resin-specific). |
\(pressure\_drop\_param\_C\) |
Pressure drop equation parameter C (resin-specific). |
\(bed\_expansion\_param\_A\) |
Bed expansion fraction equation parameter A (resin-specific). |
\(bed\_expansion\_param\_B\) |
Bed expansion fraction equation parameter B (resin-specific). |
\(bed\_expansion\_param\_C\) |
Bed expansion fraction equation parameter C (resin-specific). |
\(regen\_dose\) |
Regenerant dose required per volume of resin (if regenerant is not |
\(regen\_soln\_conc\) |
Concentration of regenerant solution (if regenerant is not |
\(regen\_soln\_conc\_sat\) |
Saturation concentration of regenerant solution (if regenerant is not |
\(regen\_soln\_dens\) |
Density of regenerant solution (if regenerant is not |
\(regen\_cycle\) |
Number of cycles the regenerant can be reused (if regenerant is not |
\(num\_regen\_columns\) |
Number of regeneration columns (if regenerant is not |
\(rinse\_bed\_volumes\) |
Number of bed volumes for the rinse step (if regenerant is not |
Parameters from Resin Data#
Resin-specific parameters are unique to each resin and are typically obtained from manufacturer data sheeta, which provide physical properties and experimental plots of bed expansion and pressure drop as functions of flow rate, temperature, and other operating conditions. Curve-fitting techniques are commonly used to derive these coefficients from the data. These parameters are stored in a JSON file. The tables below summarize the available resin types and the key properties included for each resin.
Resin Name |
Resin Type |
|---|---|
A850 |
Strong-base Type I Acrylic Anion Exchange \([1]\) |
S950 |
Chelating Polystyrene-Divinylbenzene \([2]\) |
Property |
Units |
|---|---|
Functional Group |
N/A |
Bed Expansion Parameters (A, B, C) |
\(dimensionless\) |
Pressure Drop Parameters (A, B, C) |
\(psi/m\) |
Diameter |
\(m\) |
Bulk Density |
\(kg/m^3\) |
Porosity (takes a value from 0 to 1) |
\(dimensionless\) |
Reference |
N/A |
Variables#
The IXMC model adds the following variables:
Name |
Symbol in Model |
Description |
|---|---|---|
|
\(inlet.temperature\) |
Inlet temperature of the feed stream (\(\text{K}\)). |
|
\(inlet.pressure\) |
Inlet pressure of the feed stream (\(\text{Pa}\)). |
|
\(conc\_mol\_phase\_comp_{j}\) |
Molar flow rate of each component (\(\text{mol/s}\)). |
|
\(regen\_recycle\) |
Number of cycles before regenerant disposal. |
|
\(resin\_diam\) |
Diameter of individual resin beads (\(\text{m}\)). |
|
\(resin\_density\) |
Bulk density of the resin (\(\text{kg/L}\)). |
|
\(bed\_volume\) |
Volume of resin bed in column (\(\text{m}^3\)). |
|
\(bed\_volume\_total\) |
Total volume of the resin beds (\(\text{m}^3\)). |
|
\(bed\_depth\) |
Depth of the resin bed (\(\text{m}\)). |
|
\(bed\_porosity\) |
Porosity of the resin bed (dimensionless). |
|
\(column\_height\) |
Height of the column (\(\text{m}\)). |
|
\(column\_diameter\) |
Diameter of the column (\(\text{m}\)). |
|
\(number\_columns\) |
Number of operational columns in the system. |
|
\(target\_breakthrough\_time\) |
The time the target ion takes to appear at the outlet at the desired final concentration (\(\text{s}\)). |
|
\(ebct\) |
The time the liquid remains in contact with the resin (\(\text{s}\)). |
|
\(loading\_rate\) |
Superficial velocity through the resin bed (\(\text{m/s}\)). |
|
\(service\_flow\_rate\) |
Service flow rate in the column (\(1 / \text{hr}\)). |
|
\(N\_Re\) |
Reynolds number (dimensionless). |
|
\(N\_Pe\_particle\) |
Peclet particle number (dimensionless). |
|
\(N\_Pe\_bed\) |
Peclet bed number (dimensionless). |
|
\(bed\_area\) |
The cross-sectional area of the resin bed, calculated based on the column dimensions. |
|
\(N\_Sh\) |
Sherwood number (dimensionless). |
|
\(conc\_comp\_norm\_breakthrough_{j}\) |
Normalized final breakthrough concentration for each ion \(j\) (dimensionless). |
|
\(conc\_comp\_norm\_trapezoids_{j}\) |
Normalized breakthrough concentrations for each ion \(j\) for each trapezoid (dimensionless). |
|
\(breakthrough\_time_{j}\) |
The time each reactive ion \(j\) takes to appear at the outlet at the desired final concentration (\(\text{s}\)). |
|
\(breakthrough\_time\_trapezoids_{j,a}\) |
The time each reactive ion \(j\) takes to appear at each trapezoid \(a\) (\(\text{s}\)). |
|
\(trapezoids_{j, a}\) |
The trapezoid areas \(a\) for each ion \(j\) for estimating the area under the breakthrough curve (dimensionless). |
|
\(freundlich\_n_{j}\) |
The Freundlich isotherm coefficient \(n\) that characterizes the adsorption capacity of each ion \(j\) in the solution. |
|
\(mass\_transfer\_coeff_{j}\) |
The coefficient that quantifies the rate of mass transfer for each ion in the solution. |
|
\(BV_{{50}_j}\) |
The volume of influent required to reach 50% of the initial concentration for each ion \(j\) in the solution. |
These variables are calculated using constraints and expressions defined within the models (see Model Structure above).
Limitations of the IXMC Model#
Steady-State Approximation: The IXMC model uses a steady-state continuous approximation to represent the ion exchange batch process. This simplified model will not capture transient dynamics or time-dependent behavior observed in real-world ion exchange operations.
Ion Competitiveness: The IXMC multicomponent model currently does not account for ion competitiveness for the resin sites during the adsorption stage. These competitive effects include interactions between ions and the resin.
References
- class prommis.ion_exchange.ion_exchange_multicomponent.IonExchangeMultiComp(*args, **kwds)#
- Parameters:
rule (function) – A rule function or None. Default rule calls build().
concrete (bool) – If True, make this a toplevel model. Default - False.
ctype (class) –
Pyomo ctype of the block. Default - pyomo.environ.Block
Config args
- dynamic
Indicates whether this model will be dynamic or not, default = False.
- has_holdup
Indicates whether holdup terms should be constructed or not. default - False.
- property_package
Property parameter object used to define property calculations, default - useDefault. Valid values: { useDefault - use default package from parent model or flowsheet, PhysicalParameterObject - a PhysicalParameterBlock object.}
- property_package_args
A ConfigBlock with arguments to be passed to a property block(s) and used when constructing these, default - None. Valid values: { see property package for documentation.}
- material_balance_type
Indicates what type of mass balance should be constructed, default - MaterialBalanceType.useDefault. Valid values: { MaterialBalanceType.useDefault - refer to property package for default balance type **MaterialBalanceType.none - exclude material balances, MaterialBalanceType.componentPhase - use phase component balances, MaterialBalanceType.componentTotal - use total component balances, MaterialBalanceType.elementTotal - use total element balances, MaterialBalanceType.total - use total material balance.}
- energy_balance_type
Indicates what type of energy balance should be constructed, default - EnergyBalanceType.none. Valid values: { EnergyBalanceType.useDefault - refer to property package for default balance type **EnergyBalanceType.none - exclude energy balances, EnergyBalanceType.enthalpyTotal - single enthalpy balance for material, EnergyBalanceType.enthalpyPhase - enthalpy balances for each phase, EnergyBalanceType.energyTotal - single energy balance for material, EnergyBalanceType.energyPhase - energy balances for each phase.}
- momentum_balance_type
Indicates what type of momentum balance should be constructed, default - MomentumBalanceType.pressureTotal. Valid values: { MomentumBalanceType.none - exclude momentum balances, MomentumBalanceType.pressureTotal - single pressure balance for material, MomentumBalanceType.pressurePhase - pressure balances for each phase, MomentumBalanceType.momentumTotal - single momentum balance for material, MomentumBalanceType.momentumPhase - momentum balances for each phase.}
- target_component
Designates targeted species for removal
- regenerant
Chemical used for regeneration of fixed bed
- resin
Resin used for the calculation of the bed expansion and pressure drop
- resin_data_path
Resin data json file path
- hazardous_waste
Designates if resin and residuals contain hazardous material
- isotherm
Designates the isotherm type to use for equilibrium calculations
- reactive_ions
Designates other reactive species
- number_of_trapezoids
Designates number of trapezoids
- minimum_concentration_trapezoids
Minimum relative breakthrough concentration for estimating area under curve
initialize (dict) – ProcessBlockData config for individual elements. Keys are BlockData indexes and values are dictionaries with config arguments as keys.
idx_map (function) – Function to take the index of a BlockData element and return the index in the initialize dict from which to read arguments. This can be provided to override the default behavior of matching the BlockData index exactly to the index in initialize.
- Returns:
(IonExchangeMultiComp) New instance