Class SimpleAmineAbsorber

All Implemented Interfaces:
Serializable, Runnable, AutoSizeable, AbsorberInterface, CapacityConstrainedEquipment, ProcessEquipmentInterface, SeparatorInterface, StateVectorProvider, ProcessElementInterface, SimulationInterface, NamedInterface

public class SimpleAmineAbsorber extends SimpleAbsorber
Simple amine absorber model for acid gas removal (CO2 and H2S).

Models the gas sweetening process using amine solvents (MDEA, DEA, MEA, or blends). The model calculates acid gas removal based on:

  • Acid gas loading (mole acid gas per mole amine)
  • Approach to equilibrium (typically 70% of equilibrium loading)
  • Solvent circulation rate
  • Number of theoretical stages

Design Parameters

  • Foaming margin: Applied as capacity derating on gas flow (default 20%)
  • Packing height: Maximum 5-6 m per section for fixed installations
  • Amine temperature margin: Lean amine temperature at least 6 degC above gas feed
  • Gas carry-under: Default 0.03 Am3 gas per Am3 amine
  • Demister K-factor: Maximum 0.08 m/s for wire mesh at outlet
Version:
1.0
Author:
NeqSim
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      Serialization version UID.
      See Also:
    • logger

      private static final org.apache.logging.log4j.Logger logger
      Logger object for class.
    • sourGasInStream

      private StreamInterface sourGasInStream
      Sour gas inlet stream.
    • leanAmineInStream

      private StreamInterface leanAmineInStream
      Lean amine inlet stream.
    • sweetGasOutStream

      private StreamInterface sweetGasOutStream
      Sweet gas outlet stream.
    • richAmineOutStream

      private StreamInterface richAmineOutStream
      Rich amine outlet stream.
    • amineType

      private String amineType
      Amine type: "MDEA", "DEA", "MEA", or blend.
    • amineConcentrationWtPct

      private double amineConcentrationWtPct
      Amine weight percent concentration in the lean solvent (typically 30-50 wt%).
    • targetCO2MolFraction

      private double targetCO2MolFraction
      Target CO2 content in sweet gas (mol fraction).
    • targetH2SPpmv

      private double targetH2SPpmv
      Target H2S content in sweet gas (ppmv). If zero, H2S removal is not modelled.
    • co2RemovalEfficiency

      private double co2RemovalEfficiency
      Overall CO2 removal efficiency (0.0-1.0).
    • h2sRemovalEfficiency

      private double h2sRemovalEfficiency
      Overall H2S removal efficiency (0.0-1.0).
    • foamingDesignMargin

      private double foamingDesignMargin
      Foaming design margin as fraction (0.0-1.0). Applied as capacity derating.
    • maxPackingHeightPerSection

      private double maxPackingHeightPerSection
      Maximum packing height per section in metres.
    • maxReboilerTemperatureC

      private double maxReboilerTemperatureC
      Maximum lean amine temperature in the reboiler (degrees C). Above this, amine degrades.
    • gasCarryUnder

      private double gasCarryUnder
      Gas carry-under: Am3 gas per Am3 amine downstream the contactor.
    • maxDemisterKFactor

      private double maxDemisterKFactor
      Demister K-factor limit for wire mesh at gas outlet (m/s).
    • amineTemperatureMarginC

      private double amineTemperatureMarginC
      Required temperature margin: lean amine T above gas feed T (degC).
    • richAmineLoading

      private double richAmineLoading
      Calculated acid gas loading (mol acid gas / mol amine).
    • leanAmineLoading

      private double leanAmineLoading
      Lean amine acid gas loading (mol acid gas / mol amine).
    • approachToEquilibrium

      private double approachToEquilibrium
      Approach to equilibrium fraction (typically 0.70).
    • requiredCirculationRate

      private double requiredCirculationRate
      Required solvent circulation rate (m3/h).
    • calculatedTheoreticalStages

      private double calculatedTheoreticalStages
      Calculated number of theoretical stages.
    • requiredPackingHeight

      private double requiredPackingHeight
      Effective packing height required (m).
    • numberOfPackingSections

      private int numberOfPackingSections
      Number of packing sections needed.
    • heatOfAbsorption

      private double heatOfAbsorption
      Heat of absorption (kW).
    • amineLossRate

      private double amineLossRate
      Amine loss rate (kg/MSm3 gas treated).
    • calculatedDemisterKFactor

      private double calculatedDemisterKFactor
      Calculated demister K-factor at gas outlet (m/s).
    • amineTemperatureAdequate

      private boolean amineTemperatureAdequate
      Whether the amine temperature is above gas feed by the required margin.
  • Constructor Details

    • SimpleAmineAbsorber

      public SimpleAmineAbsorber(String name)
      Creates a simple amine absorber.
      Parameters:
      name - equipment name
    • SimpleAmineAbsorber

      public SimpleAmineAbsorber(String name, StreamInterface sourGasStream)
      Creates a simple amine absorber with a sour gas feed stream.
      Parameters:
      name - equipment name
      sourGasStream - sour gas inlet stream
  • Method Details

    • setSourGasInStream

      public void setSourGasInStream(StreamInterface stream)
      Sets the sour gas inlet stream.

      The sweet gas outlet stream is created as a clone of the sour gas input.

      Parameters:
      stream - sour gas stream containing CO2/H2S
    • getSourGasInStream

      public StreamInterface getSourGasInStream()
      Gets the sour gas inlet stream.
      Returns:
      sour gas inlet stream
    • setLeanAmineInStream

      public void setLeanAmineInStream(StreamInterface stream)
      Sets the lean amine inlet stream.

      The rich amine outlet stream is created as a clone of the lean amine input.

      Parameters:
      stream - lean amine stream
    • getLeanAmineInStream

      public StreamInterface getLeanAmineInStream()
      Gets the lean amine inlet stream.
      Returns:
      lean amine inlet stream
    • getSweetGasOutStream

      public StreamInterface getSweetGasOutStream()
      Gets the sweet gas outlet stream.
      Returns:
      sweet gas outlet stream
    • getRichAmineOutStream

      public StreamInterface getRichAmineOutStream()
      Gets the rich amine outlet stream.
      Returns:
      rich amine outlet stream
    • setAmineType

      public void setAmineType(String type)
      Sets the amine type.
      Parameters:
      type - amine type identifier ("MDEA", "DEA", "MEA")
    • getAmineType

      public String getAmineType()
      Gets the amine type.
      Returns:
      amine type string
    • setAmineConcentrationWtPct

      public void setAmineConcentrationWtPct(double wtPct)
      Sets the amine weight percent concentration in lean solvent.
      Parameters:
      wtPct - weight percent (typically 30-50 for MDEA)
    • getAmineConcentrationWtPct

      public double getAmineConcentrationWtPct()
      Gets the amine weight percent concentration.
      Returns:
      amine concentration in wt%
    • setCO2RemovalEfficiency

      public void setCO2RemovalEfficiency(double efficiency)
      Sets the CO2 removal efficiency.
      Parameters:
      efficiency - removal efficiency (0.0-1.0)
    • getCO2RemovalEfficiency

      public double getCO2RemovalEfficiency()
      Gets the CO2 removal efficiency.
      Returns:
      removal efficiency (0.0-1.0)
    • setH2SRemovalEfficiency

      public void setH2SRemovalEfficiency(double efficiency)
      Sets the H2S removal efficiency.
      Parameters:
      efficiency - removal efficiency (0.0-1.0)
    • getH2SRemovalEfficiency

      public double getH2SRemovalEfficiency()
      Gets the H2S removal efficiency.
      Returns:
      removal efficiency (0.0-1.0)
    • setFoamingDesignMargin

      public void setFoamingDesignMargin(double margin)
      Sets the foaming design margin.
      Parameters:
      margin - foaming margin as fraction (default 0.20 = 20%)
    • getFoamingDesignMargin

      public double getFoamingDesignMargin()
      Gets the foaming design margin.
      Returns:
      foaming margin as fraction
    • setMaxPackingHeightPerSection

      public void setMaxPackingHeightPerSection(double heightM)
      Sets the maximum packing height per section.
      Parameters:
      heightM - maximum height in metres
    • getMaxPackingHeightPerSection

      public double getMaxPackingHeightPerSection()
      Gets the maximum packing height per section.
      Returns:
      maximum height in metres
    • setApproachToEquilibrium

      public void setApproachToEquilibrium(double fraction)
      Sets the approach to equilibrium fraction for acid gas loading.

      Experience demonstrates that the loading of acid gas is limited to around 70% of the equilibrium loading in the liquid phase.

      Parameters:
      fraction - approach fraction (typically 0.70)
    • getApproachToEquilibrium

      public double getApproachToEquilibrium()
      Gets the approach to equilibrium fraction.
      Returns:
      approach fraction
    • setLeanAmineLoading

      public void setLeanAmineLoading(double loading)
      Sets the lean amine loading (residual acid gas in lean amine).
      Parameters:
      loading - mol acid gas per mol amine in lean solvent
    • getLeanAmineLoading

      public double getLeanAmineLoading()
      Gets the lean amine loading.
      Returns:
      mol acid gas per mol amine in lean solvent
    • setAmineTemperatureMarginC

      public void setAmineTemperatureMarginC(double marginC)
      Sets the required lean amine to gas feed temperature margin.
      Parameters:
      marginC - margin in degrees Celsius (typically 6 for HC service)
    • getAmineTemperatureMarginC

      public double getAmineTemperatureMarginC()
      Gets the required lean amine to gas feed temperature margin.
      Returns:
      margin in degrees Celsius
    • calcRichAmineLoading

      public double calcRichAmineLoading(double equilibriumLoading)
      Calculates the acid gas loading on the rich amine.

      The acid gas pick-up is described as mole acid gas per mole amine. The practical loading is limited by the approach to equilibrium, typically 70% of the thermodynamic equilibrium value.

      Parameters:
      equilibriumLoading - equilibrium loading (mol acid gas / mol amine)
      Returns:
      practical rich amine loading
    • getRichAmineLoading

      public double getRichAmineLoading()
      Gets the calculated rich amine acid gas loading.
      Returns:
      acid gas loading (mol acid gas / mol amine)
    • calcRequiredCirculationRate

      public double calcRequiredCirculationRate(double acidGasMolFlowMolPerSec, double amineDensityKgPerM3, double amineMolarMassKgPerMol)
      Calculates the minimum required amine circulation rate.

      Based on the amount of acid gas to be removed and the net loading capacity of the amine:

      Q_amine =
          F_gas * y_acidgas * efficiency / (rho_amine * x_amine * (loading_rich - loading_lean))
      
      Parameters:
      acidGasMolFlowMolPerSec - molar flow of acid gas to remove (mol/s)
      amineDensityKgPerM3 - lean amine solution density (kg/m3)
      amineMolarMassKgPerMol - amine molar mass (kg/mol)
      Returns:
      required circulation rate in m3/h
    • getRequiredCirculationRate

      public double getRequiredCirculationRate()
      Gets the required amine circulation rate.
      Returns:
      circulation rate in m3/h
    • calcPackingHeight

      public void calcPackingHeight(double htuM, double ntu)
      Calculates the required packing height and number of sections.

      The packing height is estimated from the number of transfer units and the height of a transfer unit (HTU). Multiple sections with liquid redistribution are used when the height exceeds the maximum per section (typically 5-6 m for fixed installations, 3-5 m for floating).

      Parameters:
      htuM - height of a transfer unit in metres (typically 0.5-1.5 m)
      ntu - number of transfer units
    • getRequiredPackingHeight

      public double getRequiredPackingHeight()
      Gets the required total packing height.
      Returns:
      packing height in metres
    • getNumberOfPackingSections

      public int getNumberOfPackingSections()
      Gets the number of packing sections needed (each with redistribution).
      Returns:
      number of sections
    • calcDemisterKFactor

      public double calcDemisterKFactor(double gasVelocityMs, double gasDensityKgM3, double liquidDensityKgM3)
      Calculates the demister K-factor for wire mesh at the gas outlet.
      K = Vs * sqrt(rho_gas / (rho_liquid - rho_gas))
      
      Parameters:
      gasVelocityMs - superficial gas velocity through the demister (m/s)
      gasDensityKgM3 - gas density (kg/m3)
      liquidDensityKgM3 - amine liquid density (kg/m3)
      Returns:
      K-factor in m/s
    • getMaxDemisterKFactor

      public double getMaxDemisterKFactor()
      Gets the maximum allowable demister K-factor.
      Returns:
      max K-factor in m/s
    • isDemisterWithinLimit

      public boolean isDemisterWithinLimit()
      Checks if the demister K-factor is within the design limit.
      Returns:
      true if demister is adequately sized
    • getCalculatedDemisterKFactor

      public double getCalculatedDemisterKFactor()
      Gets the calculated demister K-factor.
      Returns:
      K-factor in m/s
    • getGasCarryUnder

      public double getGasCarryUnder()
      Gets the gas carry-under design value.
      Returns:
      gas carry-under in Am3 gas per Am3 amine
    • setGasCarryUnder

      public void setGasCarryUnder(double carryUnder)
      Sets the gas carry-under design value.
      Parameters:
      carryUnder - gas carry-under in Am3 gas per Am3 amine
    • checkAmineTemperatureMargin

      public boolean checkAmineTemperatureMargin(double gasFeedTemperatureC, double amineInletTemperatureC)
      Checks if the amine temperature has sufficient margin above the gas feed temperature to prevent hydrocarbon condensation in the contactor.
      Parameters:
      gasFeedTemperatureC - gas feed temperature in degrees Celsius
      amineInletTemperatureC - lean amine inlet temperature in degrees Celsius
      Returns:
      true if the margin is sufficient
    • isAmineTemperatureAdequate

      public boolean isAmineTemperatureAdequate()
      Gets whether the amine inlet temperature is adequate.
      Returns:
      true if temperature margin has been verified as adequate
    • getEffectiveGasCapacityWithFoamingMargin

      public double getEffectiveGasCapacityWithFoamingMargin(double designGasFlowM3s)
      Calculates the effective gas capacity with foaming derating.
      Parameters:
      designGasFlowM3s - design gas flow rate in m3/s
      Returns:
      effective capacity in m3/s after foaming derating
    • getInletStreams

      public List<StreamInterface> getInletStreams()
      Returns all inlet streams connected to this equipment. Subclasses override to report their specific inlets. Used by graph builders, DEXPI export, and auto-instrumentation to discover topology without instanceof checks.
      Specified by:
      getInletStreams in interface ProcessEquipmentInterface
      Overrides:
      getInletStreams in class Separator
      Returns:
      unmodifiable list of inlet streams (empty by default)
    • getOutletStreams

      public List<StreamInterface> getOutletStreams()
      Returns all outlet streams produced by this equipment. Subclasses override to report their specific outlets. Used by graph builders, DEXPI export, and auto-instrumentation to discover topology without instanceof checks.
      Specified by:
      getOutletStreams in interface ProcessEquipmentInterface
      Overrides:
      getOutletStreams in class Separator
      Returns:
      unmodifiable list of outlet streams (empty by default)
    • run

      public void run(UUID id)

      In this method all thermodynamic and unit operations will be calculated in a steady state calculation.

      Specified by:
      run in interface SimulationInterface
      Overrides:
      run in class SimpleAbsorber
      Parameters:
      id - UUID
    • validateDesign

      public Map<String, SimpleAmineAbsorber.DesignCheck> validateDesign()
      Validates the amine absorber design against industry best practices.
      Returns:
      map of check names to pass/fail results
    • getDesignSummary

      public String getDesignSummary()
      Gets a summary of the absorber design.
      Returns:
      design summary string