-
Notifications
You must be signed in to change notification settings - Fork 12
GunnsFluidSorptionBed
This models the adsorption and desorption of fluids in a multiple-segmented sorption bed. This is intended to be the end-all be-all of GUNNS adsorber links, and is a higher-fidelity model than other adsorber links such as GunnsFluidAdsorber, GunnsFluidHotAdsorber and GunnsFluidMultiAdsorber. It models fluid flow through 1 or more bed segments in series. Each segment can be configured with different sorbant & sorbate interactions, volume, heat transfer and wall temperature, and initial sorbate loadings. The user can select from pre-defined sorbants in GUNNS, or define their own custom sorbant, sorbates, and interactions.
Each bed contains a sorbant, which is a material that can adsorb/desorb chemical compounds (sorbates) from/to the fluid flowing through it. Typical uses are adsorbing H2O out of air (like a silica gel desiccant pack) and adsorbing CO2 out of the air (air purification). We model the amount of each sorbate that a sorbant can adsorb as an isotherm equation of the equlibrium loading of sorbate in the sorbant as a function temperature. In general, sorbants are able to adsorb more sorbate when they are colder, and less sorbate when they are warmer. We also model the heat created or absorbed by the sorption, allowing for integration with a thermal aspect for more realism. Typically, adsorption from the fluid is exothermic and tends to heat the sorbant up, making it less effective at adsorbing, so the bed has to be actively kept cool by refrigeration. The opposite happens for desorption – to reset the sorbant beds by removing the adsorbed gasses, they have to be heated up and kept at a high temperature until all the adsorbed gas can desorb back into the fluid.
The sorbates can be either bulk fluid constituents (as defined by the network’s Fluid Config object), or Trace Compounds, or both. Sorbates used by the sorbants are also optional. For example, a sorbant that interacts with H2O and CO2 sorbates will interact with whichever of those are present in the network.
Besides basic sorption, this link also models some interaction effects between the different sorbates in a sorbant:
- Blocking compounds: whereby the adsorption of one sorbate causes the sorbant to be less effective at adsorbing another sorbate. For example, sorbants that are typically used to remove CO2 from air, like zeolites, also adsorb H2O and lose their ability to adsorb CO2 the more H2O they have adsorbed, requiring the use of an H2O desiccant further upstream, or in an upstream segment.
- The opposite of blocking compounds, which is co-adsorption, whereby the adsorption of one sorbate is enhanced by the adsorption of another sorbate.
- Offgassing compounds, whereby the adsorption of a sorbate causes the sorbant to slowly break down, releasing other compounds back into the fluid. Some CO2 adsorbing sorbants, for instance, slowly break down and release NH3 into the air.
Below is an aspect diagram of the link in a typical swing-bed configuration. For clarity, we only show the thermal aspect for bed_A, but bed_B would also have a similar thermal aspect. Cooling to the beds, for adsorption, would connect to some heat sink such as a heat pump or a coolant loop, not shown:
This link is connected to nodes similar to GunnsFluidConductor. This link actually inherits GunnsFluidConductor, and adds the bed segments and sorption interactions with the fluid passing through the conductor.
These are limitations on the port connections to nodes that the link enforces in run-time:
- Ports 0 and 1 can only connect to gas nodes or the Ground node, and liquid nodes are not allowed.
- N/A
- maxConductivity: Same as GunnsFluidConductor.
- malfBlockageFlag: Same as GunnsFluidConductor.
- malfBlockageValue: Same as GunnsFluidConductor.
- wallTemperature: (default = 0.0 (K), must be >= 0): The initial tube wall temperature for heat convection calculations between the segments sorbant and the wall. This value will be used as the initial temperature for all the segments in the link. During run, each segment can be driven to a different temperature, such as from its own thermal aspect.
This link is mostly configured directly from the Input File, as a complete configuration is too complicated to embed in the GunnsDraw shape.
By default, this link starts with zero segments, which is an invalid configuration, so you must add at least one segment. You add segments by calling the link config data object’s addSegment function for each segment you want to add. The segments are sequenced in the link such that forward flow from Port 0 to Port 1 will flow through the segments in the order you define them with addSegment, and reverse flow from Port 1 to Port 0 will flow through the segments in the opposite order.
The addSegment function is overloaded with 2 versions – one for using the pre-defined sorbant types in GUNNS, and the other for using your own custom sorbants. The pre-defined sorbant types are defined in gunns/ms-utils/properties/SorbantProperties.hh, in the Type enumeration of the SorbantProperties class.
As an example, this adds a segment with the GUNNS pre-defined sorbant type SILICA_GEL_40, with a volume of 0.001 m^3, and a heat transfer coefficient of 200 W/K:
mySimObject.myNetwork.netConfig.sorptionBed.addSegment(trick.SorbantProperties::SILICA_GEL_40, 0.001, 200.0)
To add a segment with a custom sorbant, first you must define the custom sorbant. You do this by calling the config data object’s addCustomSorbant function to create a new sorbant type, then calling the returned SorbantProperties object’s addSorbate to define and add a sorbate and its properties to the sorbant. Once the new custom sorbant is fully defined, you can call the config data object’s addSegment function to add a segment of that custom sorbant to the link.
For example, this creates a custom sorbant with identical properties to the pre-defined SILICA_GEL_40 sorbant type in the example above, and adds it to the link:
# Create a custom sorbant type in the link config data and get a pointer to its properties:
density = 1240.0
porosity = 0.415
Cp = 870.0
CustomSilicaGel40 = mySimObject.myNetwork.netConfig.sorptionBed.addCustomSorbant(density, porosity, Cp)
# Add the H2O sorbate to the new sorbant:
compound = trick.ChemicalCompound.H2O
tothA0 = 1.767e+2 # Toth isotherm A0 term
tothB0 = 2.787e-5 # Toth isotherm B0 term
tothE = 1.093e+3 # Toth isotherm E term
tothT0 = -1.190e-3 # Toth isotherm T0 term
tothC0 = 2.213e+1 # Toth isotherm C0 term
dH = -50.2 # delta-enthalpy term (heat of sorption)
Km = 0.00125 # time constant term
CustomSilicaGel40.addSorbate(compound, 0, 0, tothA0, tothB0, tothE, tothT0, tothC0, dH, Km);
# Add the CO2 sorbate to the new sorbant, including H2O as a blocking compound:
compound = trick.ChemicalCompound.CO2
blockingCompounds = 0 # ...not supported from input file yet
offgasCompounds = 0 # ...not supported from input file yet
tothA0 = 7.678e-6 # Toth isotherm A0 term
tothB0 = 5.164e-7 # Toth isotherm B0 term
tothE = 2.330e+3 # Toth isotherm E term
tothT0 = -3.053e-1 # Toth isotherm T0 term
tothC0 = 2.386e+2 # Toth isotherm C0 term
dH = -40.0 # delta-enthalpy term (heat of sorption)
Km = 0.011375 # time constant term
sorbateCo2 = CustomSilicaGel40.addSorbate(compound, 0, 0, tothA0, tothB0, tothE, tothT0, tothC0, dH, Km);
sorbateCo2.addBlockingCompound(trick.ChemicalCompound.H2O, 1.0) // positive values block
# Now add a segment with the custom sorbant to the link:
volume = 0.001
HTC = 200.0
mySimObject.myNetwork.netConfig.sorptionBed.addSegment(CustomSilicaGel40, volume, HTC)
In the example above, we added H2O as a blocking compound to the CO2 sorbate in the custom sorbant. This causes the adsorption of CO2 to be blocked in proportion to how much H2O the sorbant has adsorbed. The amount of blocking is set by the interaction value (1.0 in the example above). For an interaction value of 0, the blocking compound has no effect. For an interaction value of 1, the blocking compound completely blocks all adsorption of the sorbate when the loading of the blocking compound is at or above 100% of its equilibrium loading in the sorbant. Values between 0-1, and also > 1 scale this affect proportionately. A value of 0.5 causes the CO2 adsorption to be blocked by 50% when the H2O loading is 100% of its equilibrium. A value of 2.0 causes CO2 adsorption to be completely blocked when the H2O loading is at 50% of its equilibrium, and so on.
A co-adsorption compound has the opposite affect as a blocking compound. Whereas adsorption of the sorbate is blocked in proportion to how much a blocking compound is present, it is also blocked in proportion to how much a co-adsorption compound is not present. It is added to the sorbant in the same way as a blocking compound, by calling the sorbate’s addBlockingCompound method, except a negative interaction value scales the amount of co-adsorption. For this example:
sorbateCo2.addBlockingCompound(trick.ChemicalCompound.H2O, -1.0) // negative values co-adsorb
…since the interaction value is -1, the adsorption of CO2 will be completely blocked if no H2O is adsorbed, and will be completely unblocked if the H2O loading is at or greater than its equilibrium loading.
These are compounds that are created by degradation of the sorbant when it adsorbs the sorbate. For example, some thermal amine-type sorbants degrade and offgas a small amount of ammonia when they adsorb CO2. We can model this affect by adding an offgas compound to the sorbate properties. We do this by calling the sorbate properties addOffgasCompound function, as in the example below:
sorbateCo2.addOffgasCompound(trick.ChemicalCompound.NH3, 1.0e-6)
In this example, the interaction value (1.0e-6) is the ratio of moles of offgassed NH3 produced for every mole of CO2 adsorbed. Only positive values >= should be used; do not try to use negative values to adsorb the offgas compound.
- TBD.
This link implements a simplified version of the model presented in these documents:
- “Full System Modeling and Validation of the Carbon Dioxide Removal Assembly”, Robert Coker, et. al., 44th ICES, July 2014.
- “A 1-D Model of the 4 Bed Molecular Sieve of the Carbon Dioxide Removal Assembly”, Robert Coker, et. al.
Limitations & simplifications of this link relative to the reference model:
- We don’t model the axial dispersion of sorbed sorbate along a bed segment. However, downstream segments can re-adsorb the desorbed sorbate from upstream segments.
- Many other higher-order terms in the reference model PDE’s are omitted.
- We simplify the pressure drop between segments as a linear interpolation of the port pressures, weighted by segment volume.
- Wall heat transfer via convection is modeled with a constant heat transfer coefficient.
- Although offgassing compounds are associated with degradation of the sorbant, we don’t actually degrade the sorbant or lower the effective sorbant mass in response to the offgassing. This is because although the offgassing of a toxic compound like ammonia is significant enough to be detected a vehicle life support system, the degradation of the sorbant itself is slow enough to not have a measurable effect on sorption performance over the time scale of typical simulations.