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:

  1. property_package: PhysicalParameterBlock for stream properties.

  2. property_package_args: Arguments for constructing the property package.

  3. target_component: The primary ion to be removed via ion exchange.

  4. regenerant: Regenerant configuration (e.g., single_use, NaCl).

  5. resin: Resin name (e.g., S950)

  6. resin_data_path: Path to the JSON file containing resin properties.

  7. reactive_ions: List of additional ions to be separated alongside the target ion.

  8. number_of_trapezoids: Number of trapezoids for trapezoidal rule calculations.

  9. 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:

  1. \(resin\_diam\): Diameter of the resin bead.

  2. \(resin\_density\): Bulk density of the resin.

  3. \(bed\_depth\): Height of the resin bed within column.

  4. \(bed\_diameter\): Diameter of the column.

  5. \(bed\_porosity\): Porosity of the resin bed.

  6. \(number\_columns\): Number of columns in operation.

  7. \(loading\_rate\) or \(ebct\): Superficial velocity through the resin bed or empty bed contact time.

Equilibrium-related variables to fix include:

  1. \(freundlich\_n_{j}\): Freundlich isotherm exponent for each ion \(j\)

  2. \(bv\_50_{j}\): Bed volumes at fifty percent breakthrough for each ion \(j\)

  3. \(conc\_comp\_norm\_breakthrough_{j}\): Normalized breakthrough concentration for each ion \(j\)

  4. \(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:

  1. 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.

  2. 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.

  3. 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:

  1. Single liquid phase

  2. Steady state operation

  3. Single and multiple solutes and one solvent (water)

  4. Plug flow and isothermal conditions

  5. Freundlich isotherm for equilibrium modeling

  6. If single_use regenerant configuration is used, backwashing, regeneration, and rinsing steps are not modeled and associated costs are zero.

  7. For multicomponent systems, competitive effects between ions are not currently modeled (see Limitations).

Sets#

The model defines the following sets:

  1. Components: Ions and solvent in the solution (e.g., ['H2O', 'Cation_+', 'Anion_-', 'Inert'])

  2. Target Component: Target ion to be separated (e.g., ['Cation_+'])

  3. Reactive Ions: List of ions to be separated

  4. Inert: List of ions that are not separated

Default Parameters#

The IXMC model has the following parameters:

Table 1 Key operating and resin-specific 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 single_use).

\(regen\_soln\_conc\)

Concentration of regenerant solution (if regenerant is not single_use).

\(regen\_soln\_conc\_sat\)

Saturation concentration of regenerant solution (if regenerant is not single_use).

\(regen\_soln\_dens\)

Density of regenerant solution (if regenerant is not single_use).

\(regen\_cycle\)

Number of cycles the regenerant can be reused (if regenerant is not single_use).

\(num\_regen\_columns\)

Number of regeneration columns (if regenerant is not single_use).

\(rinse\_bed\_volumes\)

Number of bed volumes for the rinse step (if regenerant is not single_use).

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.

Table 2 Resin names and their types included in the resin JSON file.#

Resin Name

Resin Type

A850

Strong-base Type I Acrylic Anion Exchange \([1]\)

S950

Chelating Polystyrene-Divinylbenzene \([2]\)

Table 3 Overview of the key properties included for each resin in the JSON file and their units.#

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:

Table 4 Key Parameters Needed in the IXMC Model#

Name

Symbol in Model

Description

Inlet Temperature

\(inlet.temperature\)

Inlet temperature of the feed stream (\(\text{K}\)).

Inlet Pressure

\(inlet.pressure\)

Inlet pressure of the feed stream (\(\text{Pa}\)).

Component Molar Flow Rate

\(conc\_mol\_phase\_comp_{j}\)

Molar flow rate of each component (\(\text{mol/s}\)).

Regenerant Recycle Cycles

\(regen\_recycle\)

Number of cycles before regenerant disposal.

Resin Diameter

\(resin\_diam\)

Diameter of individual resin beads (\(\text{m}\)).

Resin Density

\(resin\_density\)

Bulk density of the resin (\(\text{kg/L}\)).

Bed Volume

\(bed\_volume\)

Volume of resin bed in column (\(\text{m}^3\)).

Total Bed Volume

\(bed\_volume\_total\)

Total volume of the resin beds (\(\text{m}^3\)).

Bed Depth

\(bed\_depth\)

Depth of the resin bed (\(\text{m}\)).

Bed Porosity

\(bed\_porosity\)

Porosity of the resin bed (dimensionless).

Column Height

\(column\_height\)

Height of the column (\(\text{m}\)).

Column Diameter

\(column\_diameter\)

Diameter of the column (\(\text{m}\)).

Number of Columns

\(number\_columns\)

Number of operational columns in the system.

Target Component Breakthrough Time

\(target\_breakthrough\_time\)

The time the target ion takes to appear at the outlet at the desired final concentration (\(\text{s}\)).

Empty Bed Contact Time

\(ebct\)

The time the liquid remains in contact with the resin (\(\text{s}\)).

Loading Rate

\(loading\_rate\)

Superficial velocity through the resin bed (\(\text{m/s}\)).

Service Flow Rate

\(service\_flow\_rate\)

Service flow rate in the column (\(1 / \text{hr}\)).

Reynolds Number

\(N\_Re\)

Reynolds number (dimensionless).

Peclet Particle Number

\(N\_Pe\_particle\)

Peclet particle number (dimensionless).

Peclet Bed Number

\(N\_Pe\_bed\)

Peclet bed number (dimensionless).

Bed Area

\(bed\_area\)

The cross-sectional area of the resin bed, calculated based on the column dimensions.

Sherwood Number

\(N\_Sh\)

Sherwood number (dimensionless).

Normalized Concentration at Final Breakthrough

\(conc\_comp\_norm\_breakthrough_{j}\)

Normalized final breakthrough concentration for each ion \(j\) (dimensionless).

Normalized Concentrations for Trapezoids

\(conc\_comp\_norm\_trapezoids_{j}\)

Normalized breakthrough concentrations for each ion \(j\) for each trapezoid (dimensionless).

Components Breakthrough Time

\(breakthrough\_time_{j}\)

The time each reactive ion \(j\) takes to appear at the outlet at the desired final concentration (\(\text{s}\)).

Breakthrough Time for Trapezoids

\(breakthrough\_time\_trapezoids_{j,a}\)

The time each reactive ion \(j\) takes to appear at each trapezoid \(a\) (\(\text{s}\)).

Trapezoids

\(trapezoids_{j, a}\)

The trapezoid areas \(a\) for each ion \(j\) for estimating the area under the breakthrough curve (dimensionless).

Freundlich Coefficient n

\(freundlich\_n_{j}\)

The Freundlich isotherm coefficient \(n\) that characterizes the adsorption capacity of each ion \(j\) in the solution.

Mass Transfer Coefficient

\(mass\_transfer\_coeff_{j}\)

The coefficient that quantifies the rate of mass transfer for each ion in the solution.

Bed Volumes at 50% Influent Concentration

\(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#

  1. 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.

  2. 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

[1] Crittenden, J. C., Trussell, R. R., Hand, D. W., Howe, K. J., & Tchobanoglous, G. (2012). MWH’s Water Treatment, Chapter 16: Ion Exchange, Figures 16-14 and 16-15. John Wiley & Sons, Inc.
[2] Resin Product data sheet: URL: https://www.purolite.com/product/mts9500
[3] LeVan, M. D., Carta, G., & Yon, C. M. (2019). Section 16: Adsorption and Ion Exchange. Perry’s Chemical Engineers’ Handbook, 9th Edition.
[4] Inamuddin, & Luqman, M. (2012). Ion Exchange Technology I: Theory and Materials.
[5] Inglezakis, V. J., & Poulopoulos, S. G. (2006). Adsorption, Ion Exchange and Catalysis: Design of Operations and Environmental Applications. doi:10.1016/B978-0-444-52783-7.X5000-9
[6] Croll, H. C., Adelman, M. J., Chow, S. J., Schwab, K. J., Capelle, R., Oppenheimer, J., & Jacangelo, J. G. (2023). Fundamental kinetic constants for breakthrough of per| and polyfluoroalkyl substances at varying empty bed contact times: Theoretical analysis and pilot scale demonstration. Chemical Engineering Journal, 464. doi:10.1016/j.cej.2023.142587
[7] United States Environmental Protection Agency. (2021). Work Breakdown Structure-Based Cost Models. https://www.epa.gov/sdwa/drinking-water-treatment-technology-unit-cost-models
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

class prommis.ion_exchange.ion_exchange_multicomponent.IonExchangeMultiCompData(component)[source]#

Ion exchange multi component Clark model

build()[source]#

General build method for UnitModelBlockData. This method calls a number of sub-methods which automate the construction of expected attributes of unit models.

Inheriting models should call super().build.

Parameters:

None

Returns:

None