# MEA Packed Column¶

The first generation (GEN 1) rate-based IDAES Packed Column model represents a unit operation for MEA-based post-combustion carbon capture for both absorption and stripping processes. The contactor model uses an enhancement factor model that is superior to the Hatta number approximation and more accurate over a wide range of operating conditions. The vapor and liquid streams flow in a counter-current arrangement as shown in Figure 1(A). For more information on the Column model see Akula et al. (2021).

## Degrees of Freedom¶

Once the configuration parameters (construction arguments of the PackedColumn Class) have been specified, the remaining degrees of freedom for the PackedColumn are the operating and design parameters as listed in the Specification Table below. The indexed components for mole_frac_comp depend on the phase and process_type as follows:

• Vapor phase:
• absorption process: H2O, CO2, N2, O2.

• stripping process: H2O, CO2.

• Liquid phase:
• all process types: H2O, MEA and CO2.

Due to the reactions in the liquid phase, the apparent species (H2O, MEA and CO2) are reconstituted from the true species (H2O, MEA, CO2, MEA+, MEACOO-, HCO3-) in the speciation model based on the kinetics below:

$\mathrm{CO_2 + 2MEA \leftrightharpoons MEA^{+} + MEACOO^{-}}$
$\mathrm{CO_2 + MEA + H_2O \leftrightharpoons MEA^{+} + HCO^{-}_{3}}$

### Specification¶

Variable Name

Description

Units

Configuration parameters

process_type

Flag indicating either absorption or stripping process

None

packing_specific_area

Specific surface area of packing

$$m^{2}/m^{3}$$

packing_void_fraction

Void fraction of the packing

None

fix_column_pressure

Indicates whether the column pressure should be fixed

None

column_pressure

Value of fixed column pressure

$$Pa$$

Design parameters

diameter_column

Column diameter

$$m$$

length_column

Column length

$$m$$

Operating parameters

vapor_inlet.flow_mol

Vapor/Gas inlet total molar flowrate

$$mol/s$$

vapor_inlet.temperature

Vapor/Gas inlet temperature

$$K$$

vapor_inlet.pressure

Vapor/Gas inlet pressure

$$Pa$$

vapor_inlet.mole_frac_comp

Vapor/Gas inlet mole fraction indexed by component

None

liquid_inlet.flow_mol

Liquid inlet total molar flowrate

$$mol/s$$

liquid_inlet.temperature

Liquid inlet temperature

$$K$$

liquid_inlet.pressure

Liquid inlet pressure

$$Pa$$

liquid_inlet.mole_frac_comp

Liquid inlet mole fraction indexed by component

None

## Model Structure¶

The PackedColumn unit model consists of two ControlVolume1D Blocks (named vapor_phase and liquid_phase), each with one Inlet Port (named vapor_inlet and liquid_inlet) and one Outlet Port (named vapor_outlet and liquid_outlet) as shown in Figure 1(B). The vapor_phase ControlVolume1D Block uses the Vapor Phase Property Methods while the liquid_phase ControlVolume1D Block block uses the Liquid Phase Property Methods. Both property packages are built off of the Physical Property Package Class.

The PackedColumn unit writes additional Constraints beyond those written by the ControlVolume1D Blocks to describe the reactive absorption / desorption process for post-combustion carbon capture using MEA solvent.

## Initialization¶

The PackedColumn unit uses two homotopy/continuation parameters ( $$\lambda_{1}$$, $$\lambda_{2}$$) as shown in Figure 2 to initalize the column in steady-state mode (this is extended over the entire time horizon for dynamic simulation while fixing the accumulation terms to zero). The functions, $$g_{1}(x)$$, $$g_{2}(x)$$, $$f(x)$$, describe the Constraints when the homotopy parameters become zero or unity. The initialization routine uses the user-provided inputs to initialize the properties and then first solves only the material balance equations by turning off the heat and mass transfer rates Constraints. Then, the isothermal chemical absorption continuation parameter, $$\lambda_{1}$$, is used to turn on the mass transfer Constraints gradually with values ranging from 0 to 1. Subsequently, the adiabatic chemical absorption continuation parameter, $$\lambda_{2}$$, is used to turn on the heat transfer equations gradually with values ranging from 0 to 1 to finish initializing the PackedColumn. Lastly, for dynamic simulation, the accumulation terms are computed to initialize the dynamic column.

## PackedColumn Class¶

class idaes.power_generation.carbon_capture.mea_solvent_system.unit_models.column.PackedColumn(*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

• default (dict) –

Default ProcessBlockData config

Keys
dynamic

Indicates whether this model will be dynamic or not, default = useDefault. Valid values: { useDefault - get flag from parent (default = False), True - set as a dynamic model, False - set as a steady-state model.}

has_holdup

Indicates whether holdup terms should be constructed or not. Must be True if dynamic = True, default - False. Valid values: { useDefault - get flag from parent (default = False), True - construct holdup terms, False - do not construct holdup terms}

area_definition

Argument defining whether area variable should be spatially variant or not. default - DistributedVars.uniform. Valid values: { DistributedVars.uniform - area does not vary across spatial domian, DistributedVars.variant - area can vary over the domain and is indexed by time and space.}

finite_elements

Number of finite elements to use when discretizing length domain (default=20)

length_domain_set

length_domain_set - (optional) list of point to use to initialize a new ContinuousSet if length_domain is not provided (default = [0.0, 1.0])

transformation_method

Method to use to transform domain. Must be a method recognised by the Pyomo TransformationFactory, default - “dae.finite_difference”. Valid values: { “dae.finite_difference” - Use a finite difference transformation method, “dae.collocation” - use a collocation transformation method}

collocation_points

Number of collocation points to use per finite element when discretizing length domain (default=3)

flow_type

PackedColumn flow pattern, default - FlowPattern.countercurrent. Valid values: { FlowPattern.countercurrent - countercurrent flow, FlowPattern.cocurrent - cocurrent flow}

process_type

Flag indicating either absorption or stripping process. default - ProcessType.absorber. Valid values: { ProcessType.absorber - absorption process, ProcessType.stripper - stripping process.}

packing_specific_area

Surface area of packing per unit volume of column(default= 250 m2/m3)

packing_void_fraction

Packing porosity or void fraction (default= 0.97 )

fix_column_pressure

Indicates whether the column pressure should be fixed or not. The momentum balances are not added when this is True. default - True. Valid values: { True - fix the column pressure and do not add momentum balances, False -Do not fix the column pressure and add momentum balances}

column_pressure

Fixed column operating pressure in Pa

vapor_side

vapor side config arguments

has_pressure_change

Indicates whether terms for pressure change should be constructed, default - False. Valid values: { True - include pressure change terms, False - exclude pressure change terms.}

pressure_drop_type

Indicates what type of pressure drop correlation should be used, default- None. Valid values: { None - set pressure drop to zero, “Stichlmair_Fair_Bravo_correlation” - Use the Stichlmair_Fair_Bravo_correlation model “GPDC- Kister” - Use the Generalized Pressure Drop Correlation of Kister 2007 “Billet_Schultes_correlation” - Use the Billet_Schultes_correlation model}

property_package

Property parameter object used to define property calculations (default = ‘use_parent_value’) - ‘use_parent_value’ - get package from parent (default = None) - a ParameterBlock object

property_package_args

A dict of arguments to be passed to the PropertyBlockData and used when constructing these (default = ‘use_parent_value’) - ‘use_parent_value’ - get package from parent (default = None) - a dict (see property package for documentation)

transformation_scheme

Scheme to use when transformating domain. See Pyomo documentation for supported schemes, default - “BACKWARD”. Valid values: { “BACKWARD” - Use a BACKWARD finite difference transformation method, “FORWARD”” - Use a FORWARD finite difference transformation method, “LAGRANGE-RADAU”” - use a collocation transformation method}

liquid_side

liquid side config arguments

has_pressure_change

Indicates whether terms for pressure change should be constructed, default - False. Valid values: { True - include pressure change terms, False - exclude pressure change terms.}

pressure_drop_type

Indicates what type of pressure drop correlation should be used, default- None. Valid values: { None - set pressure drop to zero, “Stichlmair_Fair_Bravo_correlation” - Use the Stichlmair_Fair_Bravo_correlation model “GPDC- Kister” - Use the Generalized Pressure Drop Correlation of Kister 2007 “Billet_Schultes_correlation” - Use the Billet_Schultes_correlation model}

property_package

Property parameter object used to define property calculations (default = ‘use_parent_value’) - ‘use_parent_value’ - get package from parent (default = None) - a ParameterBlock object

property_package_args

A dict of arguments to be passed to the PropertyBlockData and used when constructing these (default = ‘use_parent_value’) - ‘use_parent_value’ - get package from parent (default = None) - a dict (see property package for documentation)

transformation_scheme

Scheme to use when transformating domain. See Pyomo documentation for supported schemes, default - “BACKWARD”. Valid values: { “BACKWARD” - Use a BACKWARD finite difference transformation method, “FORWARD”” - Use a FORWARD finite difference transformation method, “LAGRANGE-RADAU”” - use a collocation transformation method}

• initialize (dict) – ProcessBlockData config for individual elements. Keys are BlockData indexes and values are dictionaries described under the “default” argument above.

• 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 overide the default behavior of matching the BlockData index exactly to the index in initialize.

Returns

(PackedColumn) New instance

## PackedColumnData Class¶

class idaes.power_generation.carbon_capture.mea_solvent_system.unit_models.column.PackedColumnData(component)[source]

Standard Continous Differential Contactor (CDC) Model Class.

build()[source]

Begin building model (pre-DAE transformation).

Parameters

None

Returns

None

fix_initial_condition()[source]

Initial condition for material and enthalpy balance.

Mass balance : Initial condition is determined by fixing n-1 mole fraction and the total molar flowrate

Energy balance :Initial condition is determined by fixing the temperature.

initialize(vapor_phase_state_args=None, liquid_phase_state_args=None, state_vars_fixed=False, homotopy_steps_m=None, homotopy_steps_h=None, outlvl=0, solver=None, optarg=None)[source]

Column initialization.

Parameters
• state_args – a dict of arguments to be passed to the property package(s) to provide an initial state for initialization (see documentation of the specific property package) (default = None).

• homotopy_steps_m – List of continuations steps between 0 and 1 for turning mass transfer constrainst gradually

• homotopy_steps_h – List of continuations steps between 0 and 1 for turning heat transfer constraints gradually

• optarg – solver options dictionary object (default=None, use default solver options)

• solver – str indicating which solver to use during initialization (default = None, use IDAES default solver)

make_dynamic_column_profile()[source]

Dynamic Plot function for Temperature and CO2 Pressure profile.