Class ScrubColumn
- All Implemented Interfaces:
Serializable, Runnable, DistillationInterface, ProcessEquipmentInterface, ProcessElementInterface, SimulationInterface, NamedInterface
The scrub column removes C5+ (and optionally C3+/C4+) heavy hydrocarbons from the feed gas before it enters the main cryogenic heat exchanger. This prevents freeze-out of heavy hydrocarbons (particularly benzene, cyclohexane) in the MCHE at cryogenic temperatures.
This class extends DistillationColumn and adds:
- Heavy key component specification (e.g., "n-pentane", "i-pentane")
- Freeze-out temperature checking at column bottoms
- Maximum allowable heavy component fraction in overhead gas
- NGL recovery tracking for the bottoms product
- Version:
- 1.0
- Author:
- NeqSim
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class DistillationColumn
DistillationColumn.Builder, DistillationColumn.SimplifiedKvalueModel, DistillationColumn.SolverType -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleanWhether freeze-out risk was detected in the last run.private doubleFreeze-out temperature of the critical component (K).private StringHeavy key component name (e.g., "n-pentane").private doubleHeavy key mole fraction in overhead after run.private static final org.apache.logging.log4j.Loggerprivate doubleMaximum allowable mole fraction of heavy key in overhead gas.private doubleMinimum column bottoms temperature to avoid freeze-out (K).private doubleNGL recovery fraction (moles heavy in bottoms / moles heavy in feed).private static final longFields inherited from class DistillationColumn
bottomTrayPressure, condenserCoolingDuty, distoperations, feedmixer, gasOutStream, hasCondenser, hasReboiler, heater, liquidOutStream, maxNumberOfIterations, numberOfTrays, separator2, stream_3, stream_3isset, topTrayPressure, traysFields inherited from class ProcessEquipmentBaseClass
conditionAnalysisMessage, energyStream, hasController, isSolved, properties, reportFields inherited from class SimulationBaseClass
calcIdentifier, calculateSteadyState, timeFields inherited from class NamedBaseClass
name -
Constructor Summary
ConstructorsConstructorDescriptionScrubColumn(String name, int numberOfTrays, boolean hasReboiler, boolean hasCondenser) Constructor for ScrubColumn. -
Method Summary
Modifier and TypeMethodDescriptionprivate voidCalculate the NGL recovery of heavy components in the bottoms product.private voidcheckFreezeOutRisk(StreamInterface liqOut) Check the bottoms liquid for freeze-out risk.private voidCheck the overhead gas for heavy key component content.doubleGet the freeze-out temperature of the critical component.Get the heavy key component name.doubleGet the heavy key mole fraction in the overhead gas.doubleGet the maximum allowable heavy key mole fraction in overhead.doubleGet the minimum bottoms temperature.doubleGet the NGL recovery fraction (heavy components recovered in bottoms).booleanCheck if freeze-out risk was detected in the last run.voidIn this method all thermodynamic and unit operations will be calculated in a steady state calculation.voidsetHeavyKeyComponent(String componentName) Set the heavy key component for separation specification.voidsetMaxHeavyKeyInOverhead(double maxFraction) Set the maximum allowable mole fraction of the heavy key in the overhead gas.voidsetMinimumBottomsTemperature(double temperature, String unit) Set the minimum bottoms temperature to avoid freeze-out.Methods inherited from class DistillationColumn
addFeedStream, addFeedStream, builder, calcColumnInternals, calcColumnInternals, componentMassBalanceCheck, displayResult, energyBalanceCheck, findOptimalNumberOfTrays, getBottomSpecification, getCondenser, getCondenserTemperature, getConvergenceHistory, getEnergyBalanceError, getEnthalpyBalanceTolerance, getFeedStreams, getFsFactor, getGasOutStream, getInnerLoopSteps, getInternalDiameter, getLastBottomSpecificationResidual, getLastEnergyResidual, getLastIterationCount, getLastMassResidual, getLastMeshEnergyResidualNorm, getLastMeshEquilibriumResidualNorm, getLastMeshMaterialResidualNorm, getLastMeshResidual, getLastMeshResidualNorm, getLastMeshResidualVector, getLastMeshSpecificationResidualNorm, getLastMeshSummationResidualNorm, getLastSolveTimeSeconds, getLastSpecificationResidual, getLastTemperatureResidual, getLastTopSpecificationResidual, getLiquidOutStream, getMassBalance, getMassBalanceError, getMassBalanceTolerance, getMechanicalDesign, getMeshResidualTolerance, getMurphreeEfficiency, getNumerOfTrays, getReboiler, getReboilerTemperature, getSolverType, getTemperatureTolerance, getTopSpecification, getTray, getTrayDryPressureDrop, getTrayEnthalpy, getTrayLiquidHoldup, getTrays, getTrayWeirHeight, getTrayWeirLength, init, initMechanicalDesign, isDoInitializion, isDoMultiPhaseCheck, isDynamicColumnEnabled, isDynamicEnergyEnabled, isEnforceEnergyBalanceTolerance, isEnforceMeshResidualTolerance, isReactive, main, massBalanceCheck, resetToleranceOverrides, runBroyden, runTransient, setBottomPressure, setBottomProductFlowRate, setBottomProductPurity, setBottomSpecification, setCondenserRefluxRatio, setCondenserTemperature, setDoInitializion, setDynamicColumnEnabled, setDynamicEnergyEnabled, setEnforceEnergyBalanceTolerance, setEnforceMeshResidualTolerance, setEnthalpyBalanceTolerance, setError, setInnerLoopSteps, setInternalDiameter, setMassBalanceTolerance, setMaxNumberOfIterations, setMeshResidualTolerance, setMultiPhaseCheck, setMurphreeEfficiency, setNumberOfTrays, setReactive, setReactive, setReboilerBoilupRatio, setReboilerTemperature, setRelaxationFactor, setSolverType, setTemperatureTolerance, setTopComponentRecovery, setTopCondenserDuty, setTopPressure, setTopProductPurity, setTopSpecification, setTrayDryPressureDrop, setTrayWeirHeight, setTrayWeirLength, solved, solveDampedSubstitution, solveDirectSubstitution, solveInsideOut, solveMeshResidual, solveNewton, solveSumRates, solveWegstein, toJson, toJson, updateSpecificationResidualDiagnostics, validateSetupMethods inherited from class ProcessEquipmentBaseClass
addCapacityConstraint, addController, copy, equals, getAvailableMargin, getAvailableMarginPercent, getBottleneckConstraint, getCapacityConstraints, getConditionAnalysisMessage, getConstraintEvaluationReport, getController, getController, getControllers, getEffectiveCapacityFactor, getEnergyStream, getEntropyProduction, getExergyChange, getFailureMode, getMassBalance, getMaxUtilization, getMaxUtilizationPercent, getMinimumFlow, getPressure, getPressure, getProperty, getReferenceDesignation, getReport_json, getResultTable, getSpecification, getTemperature, getTemperature, getThermoSystem, getUtilizationSummary, hashCode, initElectricalDesign, initializeDefaultConstraints, initInstrumentDesign, isActive, isActive, isCapacityAnalysisEnabled, isCapacityExceeded, isFailed, isHardLimitExceeded, isNearCapacityLimit, isSetEnergyStream, reportResults, restoreFromFailure, run_step, runConditionAnalysis, setCapacityAnalysisEnabled, setController, setEnergyStream, setEnergyStream, setFailureMode, setFlowValveController, setMinimumFlow, setPressure, setReferenceDesignation, setRegulatorOutSignal, setSpecification, setTemperature, simulateDegradedOperation, simulateTripMethods inherited from class SimulationBaseClass
getCalculateSteadyState, getCalculationIdentifier, getTime, increaseTime, isRunInSteps, setCalculateSteadyState, setCalculationIdentifier, setRunInSteps, setTimeMethods inherited from class NamedBaseClass
getName, getTagNumber, setName, setTagNumberMethods inherited from class Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface NamedInterface
getName, getTagName, getTagNumber, setName, setTagName, setTagNumberMethods inherited from interface ProcessEquipmentInterface
addCapacityConstraint, addController, equals, getAvailableMargin, getAvailableMarginPercent, getBottleneckConstraint, getCapacityConstraints, getCapacityDuty, getCapacityMax, getConditionAnalysisMessage, getController, getController, getControllers, getElectricalDesign, getEntropyProduction, getEquipmentState, getExergyChange, getExergyChange, getExergyDestruction, getExergyDestruction, getFluid, getInletStreams, getInstrumentDesign, getMassBalance, getMaxUtilization, getMaxUtilizationPercent, getOperatingEnvelopeViolation, getOutletFlowRate, getOutletPressure, getOutletStreams, getOutletTemperature, getPressure, getPressure, getReferenceDesignation, getReferenceDesignationString, getReport_json, getRestCapacity, getResultTable, getSimulationValidationErrors, getSpecification, getTemperature, getTemperature, getThermoSystem, getUtilizationSummary, hashCode, initElectricalDesign, initInstrumentDesign, isCapacityExceeded, isHardLimitExceeded, isNearCapacityLimit, isSimulationValid, isWithinOperatingEnvelope, needRecalculation, reportResults, runConditionAnalysis, setController, setPressure, setReferenceDesignation, setRegulatorOutSignal, setSpecification, setTemperatureMethods inherited from interface SimulationInterface
getCalculateSteadyState, getCalculationIdentifier, getTime, increaseTime, isRunInSteps, run, run_step, run_step, runTransient, setCalculateSteadyState, setCalculationIdentifier, setRunInSteps, setTime
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
logger
private static final org.apache.logging.log4j.Logger logger -
heavyKeyComponent
Heavy key component name (e.g., "n-pentane"). -
maxHeavyKeyInOverhead
private double maxHeavyKeyInOverheadMaximum allowable mole fraction of heavy key in overhead gas. -
minimumBottomsTemperature
private double minimumBottomsTemperatureMinimum column bottoms temperature to avoid freeze-out (K). -
freezeOutRisk
private boolean freezeOutRiskWhether freeze-out risk was detected in the last run. -
freezeOutTemperature
private double freezeOutTemperatureFreeze-out temperature of the critical component (K). -
nglRecovery
private double nglRecoveryNGL recovery fraction (moles heavy in bottoms / moles heavy in feed). -
heavyKeyInOverheadMolFrac
private double heavyKeyInOverheadMolFracHeavy key mole fraction in overhead after run.
-
-
Constructor Details
-
ScrubColumn
Constructor for ScrubColumn.- Parameters:
name- name of the scrub columnnumberOfTrays- number of theoretical trays (excluding condenser/reboiler)hasReboiler- set true to include a reboilerhasCondenser- set true to include a condenser
-
-
Method Details
-
setHeavyKeyComponent
Set the heavy key component for separation specification.- Parameters:
componentName- name of the heavy key component (e.g., "n-pentane")
-
getHeavyKeyComponent
Get the heavy key component name.- Returns:
- heavy key component name
-
setMaxHeavyKeyInOverhead
public void setMaxHeavyKeyInOverhead(double maxFraction) Set the maximum allowable mole fraction of the heavy key in the overhead gas.- Parameters:
maxFraction- maximum mole fraction (e.g., 0.001 for 0.1%)
-
getMaxHeavyKeyInOverhead
public double getMaxHeavyKeyInOverhead()Get the maximum allowable heavy key mole fraction in overhead.- Returns:
- maximum mole fraction
-
setMinimumBottomsTemperature
Set the minimum bottoms temperature to avoid freeze-out.- Parameters:
temperature- minimum temperatureunit- temperature unit ("K" or "C")
-
getMinimumBottomsTemperature
public double getMinimumBottomsTemperature()Get the minimum bottoms temperature.- Returns:
- minimum bottoms temperature (K)
-
hasFreezeOutRisk
public boolean hasFreezeOutRisk()Check if freeze-out risk was detected in the last run.- Returns:
- true if freeze-out risk was detected
-
getFreezeOutTemperature
public double getFreezeOutTemperature()Get the freeze-out temperature of the critical component.- Returns:
- freeze-out temperature (K)
-
getNGLRecovery
public double getNGLRecovery()Get the NGL recovery fraction (heavy components recovered in bottoms).- Returns:
- NGL recovery fraction (0.0 to 1.0)
-
getHeavyKeyInOverheadMolFrac
public double getHeavyKeyInOverheadMolFrac()Get the heavy key mole fraction in the overhead gas.- Returns:
- heavy key mole fraction
-
run
In this method all thermodynamic and unit operations will be calculated in a steady state calculation.
Solve the column until tray temperatures converge. The method applies sequential substitution with an adaptive relaxation controller. Pressures are set linearly between bottom and top. Each iteration performs an upward sweep where liquid flows downward followed by a downward sweep where vapour flows upward. Tray temperatures and inter-tray stream flow rates are relaxed if the combined temperature, mass and energy residuals grow, providing basic line-search behaviour.
- Specified by:
runin interfaceSimulationInterface- Overrides:
runin classDistillationColumn- Parameters:
id- UUID
-
checkHeavyKeyInOverhead
Check the overhead gas for heavy key component content.- Parameters:
gasOut- the gas outlet stream
-
checkFreezeOutRisk
Check the bottoms liquid for freeze-out risk.- Parameters:
liqOut- the liquid outlet stream
-
calculateNGLRecovery
private void calculateNGLRecovery()Calculate the NGL recovery of heavy components in the bottoms product.
-