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:
Specification¶
Variable Name |
Description |
Units |
---|---|---|
Configuration parameters |
||
|
Flag indicating either absorption or stripping process |
None |
|
Specific surface area of packing |
\(m^{2}/m^{3}\) |
|
Void fraction of the packing |
None |
|
Indicates whether the column pressure should be fixed |
None |
|
Value of fixed column pressure |
\(Pa\) |
Design parameters |
||
|
Column diameter |
\(m\) |
|
Column length |
\(m\) |
Operating parameters |
||
|
Vapor/Gas inlet total molar flowrate |
\(mol/s\) |
|
Vapor/Gas inlet temperature |
\(K\) |
|
Vapor/Gas inlet pressure |
\(Pa\) |
|
Vapor/Gas inlet mole fraction indexed by component |
None |
|
Liquid inlet total molar flowrate |
\(mol/s\) |
|
Liquid inlet temperature |
\(K\) |
|
Liquid inlet pressure |
\(Pa\) |
|
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.
Additional Constraints (Performance Equations)¶
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 (str) – Pyomo ctype of the block. Default - “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.
- 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.
References¶
Akula, P., J. Eslick, D. Bhattacharyya and D. C. Miller (2021). “Model Development, Validation, and Optimization of an MEA-Based Post-Combustion CO2 Capture Process under Part-Load and Variable Capture Operations.” Industrial & Engineering Chemistry Research. https://doi.org/10.1021/acs.iecr.0c05035
Eslick, J. C., Akula, P. T., Bhattacharyya, D., & Miller, D. C. (2018). Simultaneous parameter estimation in reactive-solvent-based processes. In Computer Aided Chemical Engineering (Vol. 44, pp. 901-906). Elsevier. https://doi.org/10.1016/B978-0-444-64241-7.50145-2